在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]重复图层。在“分发”选项卡中,我可以看到添加了以下模式的多个图形:
我看到的东西很少,并希望有人对它们有所了解:
使用L2损失进行正规化
regularization_param
的值设置为0.0001,reg_loss
图表显示它从1.5增加(如对数)并收敛于3.5左右。在我的情况下,graph_loss
介于100和200之间,而reg_loss
介于1.5到3.5之间。
reg_loss
图形的趋势(如对数增加函数)?reg_loss
是否太小而不能惩罚模型(100-200 vs 1.5-3.5)?regularization_param
?解决消失的渐变问题
我认为从开始到结束的MSE弹跳问题可能是由于渐变问题消失所致。我希望使用几种技术,如ResNET,跳过连接,批量标准化和梯度限幅(0.05 clip_by_value
)来解决消失的梯度问题。我不太清楚如何阅读图表,但在我看来,前20个步骤中前22个图层的权重似乎没有变化(我不熟悉TensorBoard,如果我读/解,请纠正我它不正确):
我已将训练分成几次运行并从上一次运行中恢复检查点。以下是最后几层66K步骤后的图表:
你可以看到,在前几个20K步骤中,权重仍然在某些层上发生变化,例如weight_36_和weight_37_橙色。但是,经过50K步骤后,所有重量看起来都很平,如weight_36_(非常薄)和weight_39_(厚度很小)为绿色。
然后我查看批量标准化图(请注意,capped_gradient为clip_by_value
为0.05),看起来有一些变化,如下所示:
欢迎任何其他建议:)
答案 0 :(得分:2)
要尝试的事情:
删除渐变剪裁:您将渐变值剪裁为0.05。我认为更新=(0.05 *学习率)产生非常低的权重更新,这就是为什么大多数层都没有学习任何东西。如果将最后一层(首先从输出)的渐变剪切到0.05,则非常低的渐变值会传播回其前一层,并且乘以局部渐变会产生更低的渐变值。因此,你可能会看到最后几层学到的东西。
删除l2正则化:尝试删除正则化,删除正则化解决了弹跳MSE问题,然后你应该非常仔细地调整正则化参数。
答案 1 :(得分:0)
- 我们正在寻找
醇>reg_loss
图表的趋势(如对数>增加函数)?
是的,看起来没问题。
reg_loss
是否太小而不能惩罚模型(100-200 vs 1.5-3.5)?- 我如何知道我是否正确选择
醇>regularization_param
?
首先我建议你将学习率从0.001改为0.1(这是研究梯度削波问题的第一件事),并观察平均MSE是否减少以选择没有{{1}的最佳学习率}。然后,您可以通过微调reg_loss
来添加正则化。
- 请有人解释上面的图表是否正确? (我不明白为什么在每批次标准化之后有一些好的值,但权重似乎没有变化)
- 我应该从哪个方向着手解决从开始到结束的MSE弹跳问题?
醇>
请仔细检查您是否采用每个纪元的平均值 MSE。有时在每个子时期观察弹跳问题可能是正常的。但是,如果你采用每个时代的平均MSE,你可能会发现它会逐渐下降。