TensorFlow 2.0 - Checkpoint 保存变量、TensorBoard 训练可视化

学习于:简单粗暴 TensorFlow 2

1. Checkpoint 保存变量

  • tf.train.Checkpoint 可以保存 tf.keras.optimizertf.Variabletf.keras.Layertf.keras.Model
path = "./checkp.ckpt"
# 建立一个 checkpoint 
mycheckpoint = tf.train.Checkpoint(mybestmodel=mymodel) 
							# 接受 **kwargs 键值对
mycheckpoint.save(path)

  • 恢复指定模型变量
# 待恢复参数的模型
restored_model = LinearModel()
# mybestmodel 名字任意写,跟下面恢复时保持一致
mycheckpoint = tf.train.Checkpoint(mybestmodel=restored_model)
# 恢复指定的变量
path = "./checkp.ckpt-1"
mycheckpoint.restore(path)

X_test = tf.constant([[5.1], [6.1]])
res = restored_model.predict(X_test)
print(res)
# [[10.182168] 前一节的线性回归模型
#  [12.176777]]
  • 恢复最近的模型,自动选定目录下最新的存档(后缀数字最大的)
mycheckpoint.restore(tf.train.latest_checkpoint("./"))
  • 管理保存的参数,有时不需要保存太多,占空间
mycheckpoint = tf.train.Checkpoint(mybestmodel=mymodel)  # 接受 **kwargs 键值对
manager = tf.train.CheckpointManager(mycheckpoint, directory="./",
                                     checkpoint_name='checkp.ckpt',
                                     max_to_keep=2) # 最多保存k个最新的

for loop:
	manager.save() # 自动递增编号
	manager.save(checkpoint_number=idx) # 指定编号

2. TensorBoard 训练过程可视化

  • summary_writer = tf.summary.create_file_writer(logdir=log_dir)
  • tf.summary.scalar(name='loss', data=loss, step=idx)
  • tf.summary.trace_on(profiler=True)
for loop:
 	with summary_writer.as_default():
        tf.summary.scalar(name='loss', data=loss, step=idx)
with summary_writer.as_default():
    tf.summary.trace_export(name='model_trace', step=0,
                            profiler_outdir=log_dir)
  • 示例
import tensorflow as tf
import numpy as np


class MNistLoader():
    def __init__(self):
        data = tf.keras.datasets.mnist
        # 加载数据
        (self.train_data, self.train_label), (self.test_data, self.test_label) = data.load_data()
        # 扩展维度,灰度图1通道 [batch_size, 28, 28, chanels=1]
        self.train_data = np.expand_dims(self.train_data.astype(np.float32) / 255.0, axis=-1)
        self.test_data = np.expand_dims(self.test_data.astype(np.float32) / 255.0, axis=-1)
        self.train_label = self.train_label.astype(np.int32)
        self.test_label = self.test_label.astype(np.int32)
        # 样本个数
        self.num_train_data, self.num_test_data = self.train_data.shape[0], self.test_data.shape[0]

    def get_batch(self, batch_size):
        # 从训练集里随机取出 batch_size 个样本
        idx = np.random.randint(0, self.num_train_data, batch_size)
        return self.train_data[idx, :], self.train_label[idx]


# 自定义多层感知机模型
class MLPmodel(tf.keras.Model):
    def __init__(self):
        super().__init__()
        # 除第一维以外的维度展平
        self.flatten = tf.keras.layers.Flatten()
        self.dense1 = tf.keras.layers.Dense(units=100, activation='relu')
        self.dense2 = tf.keras.layers.Dense(units=10)

    def call(self, input):
        x = self.flatten(input)
        x = self.dense1(x)
        x = self.dense2(x)
        output = tf.nn.softmax(x)
        return output


# %%

num_epochs = 5
batch_size = 50
learning_rate = 1e-4
log_dir = './log' # 日志目录
mymodel = MLPmodel()

# %%
data_loader = MNistLoader()
optimizer = tf.keras.optimizers.Adam(learning_rate=learning_rate)
num_batches = int(data_loader.num_train_data // batch_size * num_epochs)

# 实例化记录器
summary_writer = tf.summary.create_file_writer(logdir=log_dir)
# 开启 trace,(可选),记录训练时的大量信息(图的结构,耗时等)
tf.summary.trace_on(profiler=True)


for idx in range(num_batches):
    X, y = data_loader.get_batch(batch_size)
    with tf.GradientTape() as tape:
        y_pred = mymodel(X)
        loss = tf.keras.losses.sparse_categorical_crossentropy(y_true=y, y_pred=y_pred)
        loss = tf.reduce_mean(loss)
        print("batch {}, loss {}".format(idx, loss.numpy()))
        
        # 记录器记录loss
        with summary_writer.as_default():
            tf.summary.scalar(name='loss', data=loss, step=idx)

    grads = tape.gradient(loss, mymodel.variables)
    optimizer.apply_gradients(grads_and_vars=zip(grads, mymodel.variables))

with summary_writer.as_default():
    tf.summary.trace_export(name='model_trace', step=0,
                            profiler_outdir=log_dir)
  • 开始训练,命令行进入 可视化界面 tensorboard --logdir=./log
  • 点击命令行中的链接,打开浏览器,查看训练曲线
  • 若重新训练,请删除 log 文件,或设置别的 log 路径,重新 cmd 开启 浏览器
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Michael阿明

如果可以,请点赞留言支持我哦!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值