every blog every motto: What doesn’t kill you makes you stronger.
0. 前言
废话: 近一段时间都没怎么写博客了,大概是在摸鱼吧。(划水快乐,:))
本节主要对两种tenorboard的使用进行小结,并对多个events.out.tfevent文件无法在同一张图中显示,给出了解决办法。
说明: 后续可能会增补
1. 正文
什么是tensorboard?
可以简单理解为保存了训练过程中的accuracy 和loss 的变化情况
说明:
1.不仅限于此,还能保存计算图等信息。
2. 本文主要将对accuracy 和 loss的保存
1.1 方法一:回调函数
保存为.h5格式文件
1.1.1 保存
我们可以在回调函数中设置。部分代码如下:
# 回调函数 Tensorboard(文件夹)\earylystopping\ModelCheckpoint(文件名)
logdir = os.path.join("callbacks")
print(logdir)
if not os.path.exists(logdir):
os.mkdir(logdir)
# 文件名
output_model_file = os.path.join(logdir,"fashion_mnist_model.h5")
callbacks = [
keras.callbacks.TensorBoard(logdir),
keras.callbacks.ModelCheckpoint(output_model_file,save_best_only=True),
keras.callbacks.EarlyStopping(patience=5,min_delta=1e-3),
]
# 开始训练
history = model.fit(x_train_scaled,y_train,epochs=10,validation_data=(x_valid_scaled,y_valid),callbacks=callbacks)
1.1.2 展示
在终端输入如下代码
tensorboard --logdir=callbacks
注意:
- 所处的当前环境要有tensorflow
- 上面代码中callbacks为你的callbacks的路径
显示如下:
在浏览器输入:http://localhost:6006/
即可查看:
详细步骤参考文后链接
1.2 方法二:tf.summary
保存为类似“events.out.tfevents.1608523036.leeP510.26215.5.v2”文件
1.2.1 保存
创建写入句柄
# 训练和验证summary文件的保存位置,用于在tensorboard中查看训练的参数(accuary,loss)的变化
train_writer = tf.summary.create_file_writer(train_log_dir)
valid_writer = tf.summary.create_file_writer(valid_log_dir)
生成准确度、损失函数、优化器的对象
# 准确度、损失函数、优化器
accuracy = metrics.BinaryAccuracy() # 二分类准确度 训练集上
accuracy_val = metrics.BinaryAccuracy() # 二分类准确度计算 验证集上
loss_bc = losses.BinaryCrossentropy() # 损失函数
optimizer = optimizers.Adam(learning_rate=self.learning_rate, beta_1=self.args.beta1)
以验证集为例:
获取准确度、损失等
# 2. 验证集上
epoch_total_val_loss = [] # 一个epoch内的loss
for i, (x_val_batch, y_val_batch) in enumerate(valid_data):
# 模型产生预测图
pred_val = model(x_val_batch)
# 模型产生的预测图(包括模型中间产生的预测图)与标签与交叉熵计算
v_logits, v_loss = pre_process_binary_cross_entropy(loss_bc, pred_val, y_val_batch)
# 用模型最后产生的预测图和真实标签更新准确度
accuracy_val.update_state(y_true=y_val_batch, y_pred=v_logits[-1])
# 保存一次迭代的损失
epoch_total_val_loss.append(v_loss.numpy())
val_acc = accuracy_val.result() # 获取准确度
epoch_total_val_loss = np.array(epoch_total_val_loss) # 列表损失转数组
print('-------epoch(validation):', epoch, 'val loss:', epoch_total_val_loss.mean(), 'accuracy:',
val_acc.numpy())
保存与重置
# 保存验证集上的summary(loos,accurcy)
with valid_writer.as_default():
tf.summary.scalar('loss', epoch_total_val_loss.mean(), step=epoch)
tf.summary.scalar('accuracy', val_acc.numpy(), step=epoch)
# 重置准确度
accuracy.reset_states()
accuracy_val.reset_states()
1.2.2 展示
在终端输入:
tensorboard --logdir=D:\Data_saved\Desktop\tes\服务器\train
具体如下:
浏览器输入上面的网址:
存在的问题:
训练和验证的指标保存在两个文件中,目前尚不知如何在一张图总显示(类似上面的第一种方法的结果)
解决方法:
存在问题的文件组织方式:
-test
-log
events.out.tfevents.1608522481.DESKTOP-IIN3E21.2448.13.v2
events.out.tfevents.1608523036.leeP510.26215.13.v2
命令:
tensorboard --logdir=D:\Data_saved\Desktop\tes\服务器\train
打开tensorboard
图形变得紊乱。
新的文件组织
-test
-train
events.out.tfevents.1608522481.DESKTOP-IIN3E21.2448.13.v2
-valid
events.out.tfevents.1608523036.leeP510.26215.13.v2
命令:
注意: 命令中的文件夹只到父级目录
tensorboard --logdir=D:\Data_saved\Desktop\tes\服务器
结果:
图中根据文件夹的名字(train/valid)分别对图中的线进行了命名
好吧,我过拟合了,摔:(
参考文献
[1] https://www.cnblogs.com/Java3y/p/10740196.html
[2] https://blog.csdn.net/weixin_39190382/article/details/104113449
[3]https://blog.csdn.net/m0_37188294/article/details/84999265
[4]https://www.pianshen.com/article/316476506/
[5]https://www.94e.cn/info/2232