- 安装并导入Tensorflow和依赖项:
import os
import tensorflow as tf
from tensorflow import keras
print(tf.version.VERSION)
- 获取示例数据集
(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
- 定义模型
# 定义一个简单的序列模型
def create_model():
model = tf.keras.models.Sequential([
keras.layers.Dense(512, activation='relu', input_shape=(784,)),
keras.layers.Dropout(0.5),
keras.layers.Dense(512, activation='elu'),
keras.layers.Dropout(0.5),
keras.layers.Dense(512, activation='elu'),
keras.layers.Dropout(0.5),
keras.layers.Dense(512, activation='elu'),
keras.layers.Dropout(0.5),
keras.layers.Dense(1)
])
model.compile(optimizer='adam',
loss=tf.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
return model
# 创建一个基本的模型实例
model = create_model()
# 显示模型的结构
model.summary()
-
在训练期间保存模型(以 checkpoints 形式保存)
您可以使用训练好的模型而无需从头开始重新训练,或在您打断的地方开始训练,以防止训练过程没有保存。 tf.keras.callbacks.ModelCheckpoint 允许在训练的过程中和结束时回调保存的模型。
- 1)创建一个只在训练期间保存权重的 tf.keras.callbacks.ModelCheckpoint 回调:
# 在文件名中包含 epoch (使用 `str.format`)
checkpoint_path = "training_2/cp-{epoch:04d}.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)
# 创建一个回调,每 5 个 epochs 保存模型的权重
cp_callback = tf.keras.callbacks.ModelCheckpoint(
filepath=checkpoint_path,
verbose=1,
save_weights_only=True,
period=5)
# 创建一个新的模型实例
model = create_model()
# 使用 `checkpoint_path` 格式保存权重
model.save_weights(checkpoint_path.format(epoch=0))
# 使用新的回调训练模型
model.fit(train_images,
train_labels,
epochs=50,
callbacks=[cp_callback],
validation_data=(test_images,test_labels),
verbose=2)
现在查看生成的 checkpoint 并选择最新的 checkpoint :
latest = tf.train.latest_checkpoint(checkpoint_dir)
latest
如果要进行测试,请重置模型并加载最新的 checkpoint :
# 创建一个新的模型实例
model = create_model()
# 加载以前保存的权重
model.load_weights(latest)
# 重新评估模型
loss, acc = model.evaluate(test_images, test_labels, verbose=2)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))
- 2)手动保存权重
使用 Model.save_weights 方法手动保存它们同样简单。默认情况下, tf.keras 和 save_weights 特别使用 TensorFlow checkpoints 格式 .ckpt 扩展名和 ( 保存在 HDF5 扩展名为 .h5 保存并序列化模型):
# 保存权重
model.save_weights('./checkpoints/my_checkpoint')
# 创建模型实例
model = create_model()
# 恢复权重
model.load_weights('./checkpoints/my_checkpoint')
# 评估模型
loss,acc = model.evaluate(test_images, test_labels, verbose=2)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))
- 保存整个模型
调用 model.save 将保存模型的结构,权重和训练配置保存在单个文件/文件夹中。
# 1、将整个模型另存为 SavedModel。
!mkdir -p saved_model
model.save('saved_model/my_model')
# 2、将整个模型保存为 HDF5 文件。
# '.h5' 扩展名指示应将模型保存到 HDF5。
# model.save('saved_model/my_model.h5')
SavedModel 格式是一个包含 protobuf 二进制文件和 Tensorflow 检查点(checkpoint)的目录。检查保存的模型目录:
从保存的模型重新加载新的 Keras 模型:
new_model = tf.keras.models.load_model('saved_model/my_model')
#new_model = tf.keras.models.load_model('saved_model/my_model.h5')
# 检查其架构
new_model.summary()
# 评估还原的模型
loss, acc = new_model.evaluate(test_images, test_labels, verbose=2)
print('Restored model, accuracy: {:5.2f}%'.format(100*acc))
print(new_model.predict(test_images).shape)