keras中保存自定义层和loss

在keras中保存模型有几种方式:

(1):使用callbacks,可以保存训练中任意的模型,或选择最好的模型

logdir = './callbacks'
if not os.path.exists(logdir):
    os.mkdir(logdir)
output_model_file = os.path.join(logdir, "xxxx.h5")
callbacks = [
    tf.keras.callbacks.ModelCheckpoint(output_model_file, save_best_file = True)
]

hist = model.fit_generator(xxxxx, callbacks = callbacks)

(2): 使用model.save(),会把整个模型保存下来,包括网络和参数

(3): 使用model.save_weights(),只保存模型的参数

当使用自定义的层或loss时,只有(3)可以直接使用,1 2会报下面这种错:

NotImplementedError: Layers with arguments in `__init__` must override `get_config`.
ValueError: Unknown loss function:loss
ValueError: Unknown layer: xxxlayer

解决办法:

在自定义网络层时重写get_config函数

我们主要看传入__init__接口时有哪些配置参数,然后在get_config内一一的将它们转为字典键值并且返回使用,以Mylayer为例:

class MyLayer(tf.keras.layers.Layer):
    def __init__(self, num_outputs, name="MyLayer", **kwargs):
        super(MyLayer, self).__init__(name=name, **kwargs)
        self.num_outputs = num_outputs

    def build(self, input_shape):
        self.kernel = self.add_variable("kernel", shape=[int(input_shape[-1]), self.num_outputs])
        super().build(input_shape)

    def call(self, input):
        output = tf.matmul(input, self.kernel)
        return output

    def get_config(self):
       config = {"num_outputs":self.num_outputs}
       base_config = super(Mylayer, self).get_config()
       return dict(list(base_config.items()) + list(config.items()))

一般来说,父类的config也是需要一并保存的,其中base_config即是父类网络层实现的配置参数,最后把父类及继承类的config组装为字典形式即可解决该问题

然后 在加载模型的时候,建立一个字典,该字典的键是自定义网络层时设定该层的名字,其值为该自定义网络层的类名,该字典将用于加载模型时使用

如果还使用了自定义的loss,则把loss也加到_custom_objects中

_custom_objects = {
    "Mylayer" :  Mylayer,
   "loss" : Myloss
}

最后在load模型的时候把_custom_objects传入

model = tf.keras.models.load_model("path/to/your/model", custom_objects=_custom_objects)

原文地址:https://www.cnblogs.com/flyuz/p/11834038.html

时间: 2024-10-03 18:13:20

keras中保存自定义层和loss的相关文章

OC中保存自定义类型对象的持久化方法

OC中如果要将自定义类型的对象保存到文件中,必须进行以下三个条件: 想要把存放自定义类型的数组进行 持久化(就是将内存中的临时数据以文件<数据库等>的形式写到磁盘上)必须满足: 1. 自定义对象必须要序列化(将数据有序的存放) 2. 需要使用归档来进行持久化 3. 如果要加载持久化文件需要进行反序列化(就是将有序存放的数据读取并变成自定义对象) 第一要将自定义类型序列化以及第三步并将文件反序列化必须实现OC中的  <NSCoding>协议. 以Student类为例 @interfa

keras 中如何自定义损失函数

http://lazycoderx.com/2016/10/09/keras%E4%BF%9D%E5%AD%98%E6%A8%A1%E5%9E%8B%E6%97%B6%E4%BD%BF%E7%94%A8%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8D%9F%E5%A4%B1%E5%87%BD%E6%95%B0/ http://www.voidcn.com/blog/zjm750617105/article/p-5954719.html

在NSUserDefaults中保存自定义的对象

在iOS开发中,需要用到一些回调值(从A到B,从B返回时把B中的值带回A中),其实方法也很多(delegate,block,nsuserdefaults等).我想用NSUserDefaults回调一个我自定义的对象.于是我就直接去setobject这个对象,这是程序就出现crash,crash信息为 reason: 'Attempt to insert non-property list object <ContacterInfo: 0x7feb76325ed0> for key curren

keras中的loss、optimizer、metrics

用keras搭好模型架构之后的下一步,就是执行编译操作.在编译时,经常需要指定三个参数 loss optimizer metrics 这三个参数有两类选择: 使用字符串 使用标识符,如keras.losses,keras.optimizers,metrics包下面的函数 例如: sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) model.compile(loss='categorical_crossentropy', opt

如何在python 深度学习Keras中计算神经网络集成模型

神经网络的训练过程是一个挑战性的优化过程,通常无法收敛. 这可能意味着训练结束时的模型可能不是稳定的或表现最佳的权重集,无法用作最终模型. 解决此问题的一种方法是使用在训练运行结束时看到的多个模型的权重平均值. 平均模型权重 学习深度神经网络模型的权重需要解决高维非凸优化问题. 解决此优化问题的一个挑战是,有许多“ 好的 ”解决方案,学习算法可能会反弹而无法稳定. 解决此问题的一种方法是在训练过程即将结束时合并所收集的权重.通常,这可以称为时间平均,并称为Polyak平均或Polyak-Rupp

Android系统在新进程中启动自定义服务过程(startService)的原理分析

在编写Android应用程序时,我们一般将一些计算型的逻辑放在一个独立的进程来处理,这样主进程仍然可以流畅地响应界面事件,提高用户体验.Android系统为我们提供了一个Service类,我们可以实现一个以Service为基类的服务子类,在里面实现自己的计算型逻辑,然后在主进程通过startService函数来启动这个服务.在本文中,将详细分析主进程是如何通过startService函数来在新进程中启动自定义服务的. 在主进程调用startService函数时,会通过Binder进程间通信机制来

.net中保存用户信息的九种方法

.net中保存用户信息的九种方法 在ASP.NET中,有几种保持用户请求间数据的途径--实际上太多了,使没有经验的开发者对在哪个特定的环境下使用哪个对象很困惑.为了回答这个问题,需要考虑下面三个条件: .谁需要数据? .数据需要保持多长时间? .数据集有多大? 通过回答这些问题,你能决定哪个对象为保持ASP.NET应用程序请求间数据提供了最佳的解决方案.图1列出了不同的状态管理对象并描述了什么时候使用它们.ASP.NET中添加了四个新的对象:Cache.Context.ViewState和Web

在Oracle电子商务套件版本12.2中创建自定义应用程序(文档ID 1577707.1)

在本文档中 本笔记介绍了在Oracle电子商务套件版本12.2中创建自定义应用程序所需的基本步骤.如果您要创建新表单,报告等,则需要自定义应用程序.它们允许您将自定义编写的文件与Oracle电子商务套件提供的标准种子功能分离.在向您的环境应用修补程序或执行升级时可以保留自定义设置. 自定义数据和索引表空间默认为APPS_TS_TX_DATA和APPS_TS_TX_IDX. 注意:当没有活动的修补程序周期时,应在运行文件系统上执行本文档中描述的过程. 也可以按照此过程更正先前创建的不使用AD Sp

keras中的mask操作

使用背景 最常见的一种情况, 在NLP问题的句子补全方法中, 按照一定的长度, 对句子进行填补和截取操作. 一般使用keras.preprocessing.sequence包中的pad_sequences方法, 在句子前面或者后面补0. 但是这些零是我们不需要的, 只是为了组成可以计算的结构才填补的. 因此计算过程中, 我们希望用mask的思想, 在计算中, 屏蔽这些填补0值得作用. keras中提供了mask相关的操作方法. 原理 在keras中, Tensor在各层之间传递, Layer对象