在Keras中,我们常用到的保存模型的方式有四种:
model.save()
model.save_weights()
model.to_json()
model.to_yaml()
1.1 model.save()
这种方法是将Keras模型和权重保存在一个HDF5文件中,具体的方法:
save_path = r'F:\kerasdataset\mnist_test.h5'
model.save(save_path)
我们也可以使用代码来进行读取:
import h5py
# 模型地址
MODEL_PATH = r'F:\kerasdataset\mnist_test.h5'
# 获取每一层的连接权重及偏重
print("读取模型中...")
with h5py.File(MODEL_PATH, 'r') as f:
dense_1 = f['/model_weights/dense_1/dense_1']
dense_1_bias = dense_1['bias:0'][:]
dense_1_kernel = dense_1['kernel:0'][:]
dense_2 = f['/model_weights/dense_2/dense_2']
dense_2_bias = dense_2['bias:0'][:]
dense_2_kernel = dense_2['kernel:0'][:]
print("第一层的连接权重矩阵:\n%s\n"%dense_1_kernel)
print("第一层的连接偏重矩阵:\n%s\n"%dense_1_bias)
print("第二层的连接权重矩阵:\n%s\n"%dense_2_kernel)
print("第二层的连接偏重矩阵:\n%s\n"%dense_2_bias)
HDFView软件来打开这个保存的文件
1.2 model.save_weights()
这种也是获取网络权重的方法,其使用方法如下:
model_save_path =r'F:\kerasdataset\mnist_test.h5'
model.save_weights(model_save_path, by_name=True)
by_name这个参数有两种情况,默认为False:by_name=False 的时候按照网络的拓扑结构来进行加载权重的。
by_name=True 的时候就是按照网络层名称进行加载权重的。
1.3 model.to_json()
这种方法只保存了模型结构,没有包含其权重信息,其使用方法如下:
json_save = model.to_json()
with open("modelsave.json", "w") as f:
f.write(json_save)
1.4 model.to_yaml()
这种方法和model.to_json()一样,其用法如下:
yaml_save = model.to_yaml()
with open("modelsave.yaml", "w") as f:
f.write(yaml_save)
上述方法中,最常用的还是model.save() 和model.save_weights()两种方式。
二、Keras模型的加载
模型的加载很简单,我们对不同的保存方式进行不同的加载即可:
2.1 model.save()方式模型的加载
from keras.models import load_model
save_path = r'F:\kerasdataset\mnist_test.h5'
model = load_model(save_path)
2.2 model.save_weights()方式模型的加载
model_save_path =r'F:\kerasdataset\mnist_test.h5'
model = model.load_weights(model_save_path)
2.3 model.to_json()和model.to_yaml()方式模型的加载
from keras.models import model_from_json
from keras.models import model_from_yaml
model_json = model_from_json(json_save)
model_yaml = model_from_yaml(yaml_save)
我们来总结一下他们的区别:
保存方式 | 是否保存模型结构 | 是否保存权重 | 是否可以继续训练网络 | 是否能进行模型预测 |
model.save() | 是 | 是 | 是 | 是 |
model.save_weights() | 否 | 是 | 否 | 是 |
model.to_json() | 是 | 否 | 否 | 加载权重后可以预测 |
model.to_yaml() | 是 | 否 | 否 | 加载权重后可以预测 |
三、Keras模型的继续训练
在实际的项目中,如果一个模型的训练时间很长(或者某种情况先要暂停),我们可以训练到某一个周期以后暂停模型的训练,等到需要的时候接着训练。那么这样的方案该怎么解决:
假设我们在模型的训练结尾使用
model.save(r'F:\kerasdataset\mnist_test.h5')
保存模型的操作。
接下来我们来看怎么继续加载这个模型进行训练,我们只需load后进行fit:
# 载入模型
model = load_model(r'F:\kerasdataset\mnist_test.h5')
# 继续训练模型2个epochs
model.fit(X_train, y_train, batch_size=64, epochs=2)
以上就是模型的加载和接着训练,下面如果要进行模型的评价和预测的话,可以参照手写字体识别的代码。