保存和恢复模型-tensorflow

本文详细介绍了一种基于TensorFlow的深度学习模型,用于MNIST手写数字数据集的识别任务。模型采用Keras API搭建,包含两层神经网络:512节点的全连接层与10节点的输出层,利用Dropout防止过拟合。文章展示了如何训练模型、保存和加载检查点,以及完整模型的保存与恢复过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相比原文,增加了目录编号,以便更好的理解记忆。

0导入包,下载数据

from future import absolute_import, division, print_function, unicode_literals

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.2),
keras.layers.Dense(10, activation=‘softmax’)
])

model.compile(optimizer=‘adam’,
loss=‘sparse_categorical_crossentropy’,
metrics=[‘accuracy’])

return model

创建一个基本的模型实例

model = create_model()

显示模型的结构

model.summary()

-----1.在训练期间保存模型(以 checkpoints 形式保存)

checkpoint_path = “training_1/cp.ckpt”
checkpoint_dir = os.path.dirname(checkpoint_path)

创建一个保存模型权重的回调

cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_path,
save_weights_only=True,
verbose=1)

使用新的回调训练模型

model.fit(train_images,
train_labels,
epochs=10,
validation_data=(test_images,test_labels),
callbacks=[cp_callback]) # 通过回调训练

这可能会生成与保存优化程序状态相关的警告。

这些警告(以及整个笔记本中的类似警告)是防止过时使用,可以忽略

#ls {checkpoint_dir}

创建一个基本模型实例

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))

-------------1.2checkpoint 回调选项

在文件名中包含 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=0)

#ls {checkpoint_dir}

latest = tf.train.latest_checkpoint(checkpoint_dir)
latest

创建一个新的模型实例

model = create_model()

加载以前保存的权重

model.load_weights(latest)

重新评估模型

loss, acc = model.evaluate(test_images, test_labels)
print(“Restored model, accuracy: {:5.2f}%”.format(100*acc))

-----------1.3手动保存权重

保存权重

model.save_weights(’./checkpoints/my_checkpoint’)

创建模型实例

model = create_model()

Restore the weights

model.load_weights(’./checkpoints/my_checkpoint’)

Evaluate the model

loss,acc = model.evaluate(test_images, test_labels)
print(“Restored model, accuracy: {:5.2f}%”.format(100*acc))

-------2.保存整个模型

创建一个新的模型实例

model = create_model()

训练模型

model.fit(train_images, train_labels, epochs=5)

将整个模型保存为HDF5文件

model.save(‘my_model.h5’)

重新创建完全相同的模型,包括其权重和优化程序

new_model = keras.models.load_model(‘my_model.h5’)

显示网络结构

new_model.summary()

loss, acc = new_model.evaluate(test_images, test_labels)
print(“Restored model, accuracy: {:5.2f}%”.format(100*acc))

--------------2.2通过 saved_model 保存

model = create_model()

model.fit(train_images, train_labels, epochs=5)

import time
saved_model_path = “./saved_models/{}”.format(int(time.time()))

tf.keras.experimental.export_saved_model(model, saved_model_path)
saved_model_path

#ls saved_models/

new_model = tf.keras.experimental.load_from_saved_model(saved_model_path)

显示网络结构

new_model.summary()

model.predict(test_images).shape

必须在评估之前编译模型。

如果仅部署已保存的模型,则不需要此步骤。

new_model.compile(optimizer=model.optimizer, # 保留已加载的优化程序
loss=‘sparse_categorical_crossentropy’,
metrics=[‘accuracy’])

评估已恢复的模型

loss, acc = new_model.evaluate(test_images, test_labels)
print(“Restored model, accuracy: {:5.2f}%”.format(100*acc))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值