keras模型保存和加载

tensorflow中的模型常常是protobuf格式,这种格式既可以是二进制也可以是文本。keras模型保存和加载与tensorflow不同,keras中的模型保存和加载通常是保存成hdf5格式。

keras的模型保存分为多种情况。

一、不保存模型只显示大概结构

  • model.summary()
    这个函数会打印模型结构,但是仅仅是打印到控制台。

  • keras.utils.plot_model()
    使用graphviz中的dot.exe生成网络结构拓扑图

二、保存模型结构

  • keras.models.Model

  • 对象的to_json,to_yaml只保存模型结构,加载时使用keras.models.model_from_json(),keras.models.model_from_yaml()

  • keras.model.get_config()返回文本形式的配置
    使用keras.model.model_from_config可以加载模型。

三、保存全部结构(最常用的方法)

keras.core.saving.py这个文件十分重要,keras的模型保存、加载都需要这个文件。
但是不建议直接使用这个文件,因为keras中的Model对象和models模块会调用这个文件。
keras.core包下的内容一般供内部使用,不暴露给使用者。

Model对象提供了save()和save_wights()两个方法。

save()方法保存了三种东西:

  • 模型结构
  • 模型参数
  • 优化器参数

其中优化器参数是给优化器用的,用于继续训练模型。有些优化器比如AdamOptimizer需要根据训练步数来调整不同参数的学习速率,这样在分阶段训练模型时才能够保证正确。save()函数保存结果就是一个hdf5文件,不像tensorflow一下子保存好多种文件。tensorflow把模型结构和权重分开保存,目的是多个权重文件可以共用一个模型结构文件,但是模型结构文件通常非常小,所占空间远远小于参数所占空间。

Model对象的save_weights()方法:

只保存了模型参数而没有保存模型结构,它的保存格式也是hdf5。它保存的数据不能用于继续训练模型。

Model实例的save()方法有一个等价方式:使用models.save_model()。

对于使用save()方法保存的文件,可以使用models.load_model()进行加载,此函数直接返回一个Model对象。因为save()方法保存了模型的全部内容,所以可以直接“无中生有”创造一个模型。

对于使用save_weights()方法保存的文件,只能通过Model对象提供的load_weights()方法加载模型权重。 并且,在加载模型权重之前,必须把网络结构定义好,并且模型的各个层的名称必须与保存模型权重时的各个层保持一致。必须先compile()函数后面用


带大家看个反面教程:

我试图从我训练过的模型中保存和加载重量.

用于保存模型的代码是.

TensorBoard(log_dir='/output')
model.fit_generator(image_a_b_gen(batch_size), steps_per_epoch=1, epochs=1)
model.save_weights('model.hdf5')
model.save_weights('myModel.h5')

如果这是一种不正确的方式,或者是否有更好的方法,请告诉我.

但是当我尝试加载它们时,使用它,

from keras.models import load_model
model = load_model('myModel.h5')

但我得到这个错误:

ValueError                                Traceback (most recent call 
last)
<ipython-input-7-27d58dc8bb48> in <module>()
      1 from keras.models import load_model
----> 2 model = load_model('myModel.h5')

/home/decentmakeover2/anaconda3/lib/python3.5/site-
packages/keras/models.py in load_model(filepath, custom_objects, compile)
    235         model_config = f.attrs.get('model_config')
    236         if model_config is None:
--> 237             raise ValueError('No model found in config file.')
    238         model_config = json.loads(model_config.decode('utf-8'))
    239         model = model_from_config(model_config, 
custom_objects=custom_objects)

ValueError: No model found in config file.

关于我可能做错什么的任何建议?

Keras提供三种不同的保存方法.这些在上面的视频链接(带有示例)以及下面进行了描述.

首先,您收到错误的原因是因为您错误地调用了load_model.

要保存并加载模型的权重,您首先要使用

model.save_weights('my_model_weights.h5')

如您所示,保存权重.要加载权重,首先需要构建模型,然后在模型上调用load_weights,如

model.load_weights('my_model_weights.h5')

另一种保存技术是model.save(filepath).此保存功能可以保存:

>模型的体系结构,允许重新创建模型.
>模型的权重.
>训练配置(丢失,优化器).
>优化器的状态,允许您从中断的位置恢复训练.

要加载此保存的模型,您将使用以下内容:

from keras.models import load_model
new_model = load_model(filepath)'

最后,model.to_json()仅保存模型的体系结构.要加载架构,您可以使用

from keras.models import model_from_json
model = model_from_json(json_string)

--------------------------------具体详解----------------------------------------------------------------------------------

保存keras的model文件和载入keras文件的方法有很多。

keras中的模型主要包括model和weight两个部分。

 

保存model部分的主要方法

Json文件
# serialize model to JSON
model_json = model.to_json()
with open("model.json", "w") as json_file:
    json_file.write(model_json)


Yaml文件
# save as YAML
yaml_string = model.to_yaml()

保存权重的方法:通过保存权重(系数)

 

HDF5文件
# serialize weights to HDF5
model.save_weights("model.h5")
print("Saved model to disk")
同时保存model和权重的方式:
from keras.models import load_model
model.save('model_weight.h5')  # creates a HDF5 file 'my_model.h5'

------------------------------------------------------------------------------------
载入model的方法
json&hdf5

# load json and create model
json_file = open('model.json', 'r')
loaded_model_json = json_file.read()
json_file.close()
loaded_model = model_from_json(loaded_model_json

 

from keras.models import load_model
model = load_model('model.h5')
载入权重

# load weights into new model
loaded_model.load_weights("model.h5")
print("Loaded model from disk")


如果你需要加载权重到不同的网络结构(有些层一样)中,例如fine-tune或transfer-learning,你可以通过层名字来加载模型:

model.load_weights('my_model_weights.h5', by_name=True)
--------------------- 

 

想了解更多:https://www.jianshu.com/p/431cd13f356b

参考:https://www.cnblogs.com/weiyinfu/p/9788179.html

           http://www.voidcn.com/article/p-kxrepdhc-bub.html

原文:https://blog.csdn.net/u011692048/article/details/77686208 

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值