将训练的模型进行保存,或者利用已保存的模型给新模型“赋值”。本文参考Tensorflow官方文档之保存和恢复模型,对官方文档给出的代码进行了实践,并将我的理解加到了注释之中,希望能帮到有需要的人。
代码分成几个部分讲解:
1、导入必要的模块和加载数据集
Tensorflow官方文档依旧使用mnist数据集来进行新手教学,和mnist手写数字识别项目不同的是,此处只使用1000条数据以加快速度,毕竟我们的目的是学习保存和恢复模型。
from __future__ import absolute_import, division, print_function
import os
import tensorflow as tf
from tensorflow import keras
# 读取mnist数据集
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()
# 为了加快速度,只使用1000条数据
train_labels = train_labels[:1000]
test_labels = test_labels[:1000]
train_images = train_images[:1000].reshape(-1, 28 * 28) / 255.0 # reshape中-1代表维数未知
test_images = test_images[:1000].reshape(-1, 28 * 28) / 255.0
2、构建并查看模型
自定义create_model()函数来定义模型。如果还没接触过Keras可以看这篇博客:
def create_model():
model = tf.keras.models.Sequential([
keras.layers.Dense(512, activation=tf.nn.relu, input_shape=(784,)),
keras.layers.Dropout(0.2), # 随机丢弃20%的神经元防止过拟合
keras.layers.Dense(10, activation=tf.nn.softmax)
])
# 指定优化函数、损失函数、评测方法
model.compile(optimizer=tf.keras.optimizers.Adam(),
loss=tf.keras.losses.sparse_categorical_crossentropy,
metrics=['accuracy'])
return model
layers.Dropout()用法:
随机丢弃指定比例的神经元以防止过拟合,如果是layers.Dropout(0)
就是不丢弃,如果是layers.Dropout(1)
则为丢弃全部神经元,会报错。
利用如下代码新建一个模型,并查看模型概况:
model = create_model()
model.summary() # 打印出模型概况,它实际调用的是keras.utils.print_summary
运行结果:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 512) 401920
_________________________________________________________________
dropout (Dropout) (None, 512) 0
_________________________________________________________________
dense_1 (Dense) (None, 10) 5130
=================================================================
Total params: 407,050
Trainable params: 407,050
Non-trainable params: 0
_________________________________________________________________
Process finished with exit code 0
3、保存检查点【核心】
以下是官方文档代码的核心部分:
################################
#####以下是保存和恢复模型的部分#####
################################
checkpoint_path = "study_checkpoint/cp.ckpt" # 指定保存模型的文件,含文件的相对目录
checkpoint_dir = os.path.dirname(checkpoint_path) # os.path.dirname()作用是去掉文件名,返回文件目录
# 官网注释是Create checkpoint callback,checkpoint译为"检查点"
cp_callback = tf.keras.callbacks.ModelCheckpoint(checkpoint_path,
save_weights_only=True,
verbose=1)
# 利用自定义的构建神经网络的函数构建一个新的模型,并训练之
model = create_model()
model.fit(train_images, train_labels, epochs = 10,
validation_data = (test_images,test_labels),
callbacks = [cp_callback]) # pass callback to training
如图,红色横线标注了我创建的源文件和保存模型的目录
点开study_checkpoint
文件夹,可以看到模型被保存至以下的文件中:
用如下的代码来验证被保存的模型:
# 创建一个新的model用于检测回调点
model = create_model()
model.load_weights(checkpoint_path) # 直接从检查点加载权重
loss,acc = model.evaluate(test_images, test_labels)
print("Restored model, loss: %f, accuracy: %.2f" % (loss, 100*acc))
运行结果:
Restored model, loss: 0.430706, accuracy: 87.30
准确率只有87.30%,毕竟只使用了1000条数据,而之前博客达到的98%的正确率是使用了全部60000条数据才达到的。
4、保存整个模型
Keras使用HDF5标准保存整个模型,利用如下代码:
model.save('study_checkpoint/model/my_model.h5')
运行成功,可以到相应文件夹下找到my_model.h5
这个文件。
如果报错:
ImportError: `save_model` requires h5py.
解决方法:
pip install --upgrade h5py