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

问题描述 投票:5回答:2

在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,其包含多个[卷积 - >批量标准化 - > 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

解决消失的梯度问题

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

First 20K weight distribution

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

66K weight distribution

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

然后我查看批量标准化图(注意capped_gradient是0.05的clip_by_value),它看起来像下面有一些变化:

66K batch normalization

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

欢迎任何其他建议:)

tensorflow machine-learning tensorboard
2个回答
0
投票
  1. 我们正在寻找reg_loss图的趋势(如对数>增加函数)?

是的,看起来没问题。

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

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

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

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


2
投票

要尝试的事情:

  1. 删除渐变剪裁:您将渐变值剪裁为0.05。我认为更新=(0.05 *学习率)产生非常低的权重更新,这就是为什么大多数层都没有学习任何东西。如果将最后一层(首先从输出)的渐变剪切到0.05,则非常低的渐变值会传播回其前一层,并且乘以局部渐变会产生更低的渐变值。因此,你可能会看到最后几层学到的东西。
  2. 删除l2正则化:尝试去除正则化,并且去除正则化解决了弹跳MSE问题,那么你应该非常仔细地调整正则化参数。
© www.soinside.com 2019 - 2024. All rights reserved.