在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]重复层。在“分发”选项卡中,我可以看到添加了以下模式的多个图形:
我看到的东西很少,并希望有人对它们有所了解:
使用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,跳过连接,批量标准化和梯度剪切(clip_by_value
为0.05)来解决消失的渐变问题。我不太清楚如何阅读图表,但在我看来,前20个步骤中前22个图层的权重似乎没有变化(我不熟悉TensorBoard,如果我读/解,请纠正我它不正确):
我已将训练分成几次运行并从上一次运行中恢复检查点。以下是最后几层66K步骤后的图表:
您可以看到,在前几个20K步骤中,权重在某些层上仍然会发生变化,例如weight_36_和weight_37_(橙色)。但是,在50K步骤之后,所有重量看起来都像flat_36_(非常薄)和weight_39_(厚度很小)一样是绿色的。
然后我查看批量标准化图(注意capped_gradient是0.05的clip_by_value
),它看起来像下面有一些变化:
欢迎任何其他建议:)
- 我们正在寻找
reg_loss
图的趋势(如对数>增加函数)?
是的,看起来没问题。
reg_loss
是否太小而不能惩罚模型(100-200 vs 1.5-3.5)?- 我怎么知道我是否正确选择了
regularization_param
?
首先,我建议你将学习率从0.001改为0.1(这是研究梯度削波问题的第一件事),并观察平均MSE是否减少以选择没有reg_loss
的最佳学习率。然后你可以通过微调reg_loss
来加回正则化。
- 请问有人可以解释上面的图表是否正确吗? (我不明白为什么在每批次标准化之后有一些好的值,但权重似乎没有变化)
- 我应该从哪个方向着手解决从开始到结束的MSE弹跳问题?
如果您采用每个时期的平均MSE,请仔细检查。有时在每个子时期观察弹跳问题可能是正常的。但是如果你拿每个时代的平均MSE,你可能会发现它会逐渐下降。
要尝试的事情: