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