在使用一个现有网络时,我想提取并显示训练过程中的loss值以观察网络的训练过程,这包含了提取loss值和实时显示loss曲线两个步骤。
1. 提取loss值
原网络的代码有在构建网络的build_model函数中计算loss的,并在self.train_loss变量中逐次更新。tensorflow在训练过程中,网络的数据流是看不见的,可以通过会话提取。所以我在train函数中找到sess.run,在该会话的输出中增加train_loss,完成当前loss值的提取。
2. 实时显示loss曲线
可以使用TensorBoard或者直接调用matplotlib库开绘制曲线,这里主要介绍第二种方法。TensorBoard是一个可视化工具,可以用它读取日志数据来绘制数据曲线。但由于我是在tf2上运行tf1版本的代码,在写出日志时有些语句有版本冲突,所以我选择使用matplotlib.pyplot库在训练过程中实时绘制图像。我在同一个figure窗口中绘制了两个子图,分别是loss曲线和RMSE曲线,都可以用于观察训练结果的稳定程度。摘录train函数的绘制曲线代码如下:
import matplotlib.pyplot as plt
# 初始化曲线变量
x_train = []
x_test = []
train_loss_list = []
se_list = []
# 初始化图像窗口
fig = plt.figure()
plt.ion()
# 初始化子图
ax1 = fig.add_subplot(2, 1, 1)
plt.xlabel('iter_count')
plt.ylabel('loss')
ax2 = fig.add_subplot(2, 1, 2)
plt.xlabel('iter_count')
plt.ylabel('RMSE')
for iter_count in range(1,1e6):
# 提取loss值和RMSE值
train_loss, rmse1, _ = self.sess.run([self.train_loss, self.train_step], feed_dict={
self.x: self.batch_input_images,
self.y1: self.batch_true_images1,
self.lr_input: 0.0001})
# 每100次迭代绘制一个loss值
if np.mod(iter_count, 100) == 1:
x_train.append(iter_count)
train_loss_list.append(train_loss)
ax1.plot(x_train, train_loss_list, '-r')
plt.pause(0.01)
# 每1000次迭代绘制一个RMSE值
if np.mod(iter_count, 1000) == 2:
x_test.append(iter_count)
se_list.append(rmse1)
ax2.plot(x_test, se_list, '-g')
plt.pause(0.01)
绘制结果如下: