前言
写在前面的话
TensorFlow是一个用于机器学习的端到端开源平台。它拥有全面,灵活的工具,库和社区资源生态系统,可让研究人员推动ML的最新技术,开发人员可轻松构建和部署ML驱动的应用程序。1
我上一篇博客讲了tensorflow最基本的入门,包括怎么设计网络,如何开始训练、预测等。
然而神经网络在训练完后,还是要用来使用的,如果每一次使用前都进行预测,那么不仅会耗时,而且因为初使权重设置的随机性还会导致预测的结果发生偏差。
人工神经网络是由一层层的节点组成,与自然的神经网络不同,自然的神经网络通过训练来调整神经元的连接和断开,而人工神经网络通过调整一个个权重来达到模拟自然神经网络不同神经元之间的连接效果。
一个训练完的神经网络和一个初始化的神经网络的最大不同就在于这一个个权重是否调优。
所以人工神经网络的保存的重点就在于这些权重的记录。
数据和环境
安装和导入环境
在前一个博客环境的基础上
!pip install -q h5py pyyaml
获取数据集
#获取示例数据集
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()
train_labels = train_labels[:1000]
test_labels = test_labels[:1000]
train_images = train_images[:1000].reshape(-1, 28 * 28) / 255.0
test_images = test_images[:1000].reshape(-1, 28 * 28) / 255.0
为了加快训练速度,只获取了前一千个样本
定义模型
为了快速构建模型,所以定义一个模型构建函数
# Returns a short sequential model构建模型
def create_model():
model = tf.keras.models.Sequential([
keras.layers.Dense(512, activation=tf.nn.relu, input_shape=(784,)),
#dropout层用于随机去掉节点,防止过拟合的问题[https://blog.youkuaiyun.com/stdcoutzyx/article/details/49022443
keras.layers.Dropout(0.2),
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
在训练期间保存检查点
在训练期间保存检查点用于面对多轮训练的场景,中间暂停后可以接替上一轮训练结果继续训练,或者是训练完后可以使用该模型,不需要再次训练。
执行这给任务使用的是
tf.keras.callbacks.ModelCheckpoint
保存权重
#训练模型,并将 ModelCheckpoint 回调传递给该模型:
abs_file=__file__#获取当前脚本的绝对路径
#strp=os.path.abspath(sys.argv[0])
checkpoint_path = os.path.dirname(abs_file)+"\\training_1/cp.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)
# Create checkpoint callback
#主要用例是,在训练期间或训练结束时自动保存检查点。
# 这样一来,您便可以使用经过训练的模型,而无需重新训练该模型,或从上次暂停的地方继续训练,以防训练过程中断。
#tf.keras.callbacks.ModelCheckpoint 是执行此任务的回调。该回调需要几个参数来配置检查点。
#modelcheckpoint方法详细文档:https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/ModelCheckpoint
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,填写callbacks属性
加载保存的权重来进行预测
#创建一个未经训练的全新模型。仅通过权重恢复模型时,您必须有一个与原始模型架构相同的模型。
#由于模型架构相同,因此我们可以分享权重(尽管是不同的模型实例)。
# 现在,重新构建一个未经训练的全新模型,并用测试集对其进行评估。
# 未训练模型的表现有很大的偶然性(准确率约为 10%):
model = create_model()
loss, acc = model.evaluate(test_images, test_labels)
print("Untrained model, accuracy: {:5.2f}%".format(100*acc))
#然后从检查点加载权重,并重新评估:
model.load_weights(checkpoint_path)
loss,acc = model.evaluate(test_images, test_labels)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))
同样也可以通过调整参数来改变保存的模式
# include the epoch in the file name. (uses `str.format`)
checkpoint_path = os.path.dirname(abs_file)+"\\training_2/cp-{epoch:04d}.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)
#该回调提供了多个选项,用于为生成的检查点提供独一无二的名称,以及调整检查点创建频率。
#训练一个新模型,每隔 5 个周期保存一次检查点并设置唯一名称:
cp_callback = tf.keras.callbacks.ModelCheckpoint(
checkpoint_path, verbose=1, save_weights_only=True,
# Save weights, every 5-epochs.
period=5)
#和前一次的调用进行对比多了period属性
'''
cp_callback = tf.keras.callbacks.ModelCheckpoint(checkpoint_path,
save_weights_only=True,
verbose=1)
'''
model = create_model()
model.fit(train_images, train_labels,
epochs = 50, callbacks = [cp_callback],
validation_data = (test_images,test_labels),
verbose=0)
注意默认的Tensorflow格式进保存最近的5个检查点
进行测试
model = create_model()
model.load_weights(latest)
loss, acc = model.evaluate(test_images, test_labels)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))
手动保存权重
除了调用ModelCheckPoint方法我们还可以手动保存权重,也就是在模型训练完后手动保存这些权重
#以下为手动保存权重部分
# Save the weights
path=os.path.dirname(abs_file)+'/checkpoints/my_checkpoint'
model.save_weights(path)
# Restore the weights
model = create_model()
model.load_weights(path)
loss,acc = model.evaluate(test_images, test_labels)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))
保存整个模型
前面的内容只说了怎么保存权重,所以在加载的时候首先需要一个结构和被保存模型一样的神经网络模型,这也是为什么需要一个*create_model()*函数。
当然我们也可以将整个模型保存在一个文件中,其中包含权重值、模型配置乃至优化器配置。
#还可以保存整个模型
model = create_model()
model.fit(train_images, train_labels, epochs=5)
# Save entire model to a HDF5 file
path=os.path.dirname(abs_file)+'/my_model.h5'
model.save(path)
#现在,从该文件重新创建模型:
# Recreate the exact same model, including weights and optimizer.
new_model = keras.models.load_model(path)
print(new_model.summary())
loss, acc = new_model.evaluate(test_images, test_labels)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))
最后
本文是我学习了Tensorflow的官方文档后的学习笔记,官方文档请参考这里
https://www.tensorflow.org/ ↩︎