将训练的模型进行保存,或者利用已保存的模型给新模型“赋值”。本文参考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

如图,红色横线标注了我创建的源文件和保存模型的目录

tensorflow layers Dense build vector 例子 tensorflow.keras.models_保存模型


点开study_checkpoint文件夹,可以看到模型被保存至以下的文件中:

tensorflow layers Dense build vector 例子 tensorflow.keras.models_Keras_02


用如下的代码来验证被保存的模型:

# 创建一个新的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