在使用一个现有网络时,我想提取并显示训练过程中的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)

绘制结果如下:

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐