模型保存-加载整个模型
Keras 模型保存为HDF5文件。
(官网建议)不建议使用pickle 或cPickle 来保存Keras 模型。
保存:使用model.save(filepath) 将Keras 模型保存到单个HDF5中。
可以保存以下内容:
- 模型的结构,允许重新创建模型
- 模型的权重
- 训练配置项(损失函数,优化器)
- 优化器状态,允许准确地从上次结束的地方继续训练。
代码:
保存
import h5py
model.save('my_model.h5')
加载:
import keras
from keras.models import load_model
import numpy as np
my_model=load_model('my_model.h5')
import keras.datasets.mnist as mnist
(train_image,train_lable),(test_image,test_label)=mnist.load_data() #加载数据集
预测举例
test_image = np.expand_dims(test_image,axis=-1)
my_model.evaluate(test_image,test_label)
my_model.predict(test_image[0:2])
模型保存-加载模型结构
保存
from keras.models import model_from_json
my_model_json=model.to_json()
with open('muy_json_model.json','w') as f:
f.write(my_model_json)
加载:
with open('muy_json_model.json') as f:
my_json_model = f.read()
from keras.models import model_from_json
model=model_from_json(my_json_model)
看看是不是和以前结构一样:
model.summary()
这里是完成不了my_model.evaluate(test_image,test_label)的,因为没有编译也没有权重,只是一个结构。
模型保存-加载模型训练权重
model.save_weights('my_model_weights.h5') #保存模型权重
model.load_weights('my_model_weights.h5') #加载模型权重
上面是保存所有层的权重
还可以实现保存部分层的权重
但首先要给层取一个名字
model.add(layers.Dense(64,activation='relu',name='D1'))
给这个层起个名字 叫D1
这时候保存权重的时候会根据名字保存。
然后
model.load_weights('my_model_weights.h5',by_name=True) #加载模型权重
就会按照层的名称加载模型权重了。(保存的时候模型的层的名字要和加载时建立的模型的层的名字一致)
在训练期间保存检查点
在训练期间或者训练结束时自动保存检查点,这样就可以使用经过训练的模型,而无需重新训练模型,或者从上次暂停的地方继续训练,以防训练过程中断。
回调函数:tf.keras.callbacks.ModelCheckpoint 或者keras.callbacks.ModelCheckpoint
keras.callbacks.ModelCheckpoint(
filepath, 保存路径
monitor='val_loss', 监控目标
verbose=0, 是否显示提示
save_best_only=False, 保存loss最低的权值
save_weights_only=False, 只保存权重 (false 就是保存整个模型)
mode='auto',
save_freq='epoch',
**kwargs,
)
怎么保存?
cp_callback=keras.callbacks.ModelCheckpoint(checkpoin_path,save_weights_only=True) #定义保存路径,保存啥什么的
model.fit(train_image,train_label,epochs=3, callbacks=[cp_callback]) #在训练模型的时候使用,就会保存
怎么使用?比如训练中途突然断电或者其他什么原因。
如何恢复这个模型:
首先创建原来的模型,然后编译,然后加载保存了的权重:
model.load_weights(checkpoin_path)