如何使用TensorBoard分析结果并减少均方误差

时间:2018-02-23 03:36:30

标签: tensorflow machine-learning tensorboard

在Tensorflow中,我正在尝试构建一个模型来执行图像超分辨率(即回归任务)并使用TensorBoard分析结果。在训练期间,我发现均方误差(MSE)在大多数时间(甚至从头开始)在100到200之间反弹,并且从未收敛。我希望将以下变量添加到tf.summary并分析导致此问题的原因。

graph_loss = get_graph_mean_square_error()
tf.summary.scalar('graph_loss', graph_loss)

regularization_loss = tf.add_n([tf.nn.l2_loss(weight) for weight in weights]) * regularization_param
tf.summary.scalar('reg_loss', regularization_loss)

tf.summary.scalar('overall_loss', regularization_loss + graph_loss)

for index in range(len(weights)):
    tf.summary.histogram("weight[%02d]" % index, weights[index])

optimizer = tf.train.AdamOptimizer()
capped_grad_and_vars = [(tf.clip_by_value(grad, -clip_value, clip_value), var) for grad, var in grad_and_vars if grad is not None]
train_optimizer = optimizer.apply_gradients(capped_grad_and_vars, global_step)

for grad, var in grad_and_vars:
    tf.summary.histogram(var.name + '/gradient', grad)

for grad, var in capped_grad_and_vars:
    tf.summary.histogram(var.name + '/capped_gradient', grad)

该模型是一个跳过连接的ResNET,它包含几个[convolution - >批量标准化 - > ReLU]重复图层。在“分发”选项卡中,我可以看到添加了以下模式的多个图形:

  • BatchNorm_ [数字] / beta0 / capped_gradient
  • BatchNorm_ [数字] / beta0 /梯度
  • BatchNorm_ [数字] / gamma0 / capped_gradient
  • BatchNorm_ [数字] / gamma0 /梯度
  • 偏压[数字] _0 / capped_gradient
  • 偏压[数字] _0 /梯度
  • weight_ [数字] _
  • weight_ [数字] _0 / capped_gradient
  • weight_ [数字] _0 /梯度

我看到的东西很少,并希望有人对它们有所了解:

使用L2损失进行正规化

regularization_param的值设置为0.0001,reg_loss图表显示它从1.5增加(如对数)并收敛于3.5左右。在我的情况下,graph_loss介于100和200之间,而reg_loss介于1.5到3.5之间。

  1. 我们正在寻找reg_loss图形的趋势(如对数增加函数)?
  2. reg_loss是否太小而不能惩罚模型(100-200 vs 1.5-3.5)?
  3. 我如何知道我是否正确选择regularization_param
  4. 解决消失的渐变问题

    我认为从开始到结束的MSE弹跳问题可能是由于渐变问题消失所致。我希望使用几种技术,如ResNET,跳过连接,批量标准化和梯度限幅(0.05 clip_by_value)来解决消失的梯度问题。我不太清楚如何阅读图表,但在我看来,前20个步骤中前22个图层的权重似乎没有变化(我不熟悉TensorBoard,如果我读/解,请纠正我它不正确):

    First 20K weight distribution

    我已将训练分成几次运行并从上一次运行中恢复检查点。以下是最后几层66K步骤后的图表:

    66K weight distribution

    你可以看到,在前几个20K步骤中,权重仍然在某些层上发生变化,例如weight_36_和weight_37_橙色。但是,经过50K步骤后,所有重量看起来都很平,如weight_36_(非常薄)和weight_39_(厚度很小)为绿色。

    然后我查看批量标准化图(请注意,capped_gradient为clip_by_value为0.05),看起来有一些变化,如下所示:

    66K batch normalization

    1. 请有人解释上面的图表是否正确? (我不明白为什么在每批次标准化之后有一些好的值,但权重似乎没有变化)
    2. 我应该从哪个方向着手解决从开始到结束的MSE弹跳问题?
    3. 欢迎任何其他建议:)

2 个答案:

答案 0 :(得分:2)

要尝试的事情:

  1. 删除渐变剪裁:您将渐变值剪裁为0.05。我认为更新=(0.05 *学习率)产生非常低的权重更新,这就是为什么大多数层都没有学习任何东西。如果将最后一层(首先从输出)的渐变剪切到0.05,则非常低的渐变值会传播回其前一层,并且乘以局部渐变会产生更低的渐变值。因此,你可能会看到最后几层学到的东西。

  2. 删除l2正则化:尝试删除正则化,删除正则化解决了弹跳MSE问题,然后你应该非常仔细地调整正则化参数。

答案 1 :(得分:0)

  
      
  1. 我们正在寻找reg_loss图表的趋势(如对数>增加函数)?
  2.   

是的,看起来没问题。

  
      
  1. reg_loss是否太小而不能惩罚模型(100-200 vs 1.5-3.5)?
  2.   
  3. 我如何知道我是否正确选择regularization_param
  4.   

首先我建议你将学习率从0.001改为0.1(这是研究梯度削波问题的第一件事),并观察平均MSE是否减少以选择没有{{1}的最佳学习率}。然后,您可以通过微调reg_loss来添加正则化。

  
      
  1. 请有人解释上面的图表是否正确? (我不明白为什么在每批次标准化之后有一些好的值,但权重似乎没有变化)
  2.   
  3. 我应该从哪个方向着手解决从开始到结束的MSE弹跳问题?
  4.   

请仔细检查您是否采用每个纪元的平均值 MSE。有时在每个子时期观察弹跳问题可能是正常的。但是,如果你采用每个时代的平均MSE,你可能会发现它会逐渐下降。