【问题标题】:Using squared difference of two images as loss function in tensorflow在张量流中使用两幅图像的平方差作为损失函数
【发布时间】:2015-11-17 09:25:35
【问题描述】:

我正在尝试使用两个图像之间的 SSD 作为我网络的损失函数。

# h_fc2 is my output layer, y_ is my label image.
ssd = tf.reduce_sum(tf.square(y_ - h_fc2))

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(ssd)

问题是,权重然后发散,我得到了错误

 ReluGrad input is not finite. : Tensor had Inf values

这是为什么呢?我确实尝试了一些其他的东西,比如通过图像大小对 ssd 进行规范化(不起作用)或将输出值裁剪为 1(不再崩溃,但我仍然需要对此进行评估):

ssd_min_1 = tf.reduce_sum(tf.square(y_ - tf.minimum(h_fc2, 1)))
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(ssd_min_1)

我的观察结果符合预期吗?

编辑: @mdaoust 的建议被证明是正确的。要点是按批次大小进行标准化。这可以通过使用此代码独立于批量大小来完成

squared_diff_image = tf.square(label_image - output_img)
# Sum over all dimensions except the first (the batch-dimension).
ssd_images = tf.reduce_sum(squared_diff_image, [1, 2, 3])
# Take mean ssd over batch.
error_images = tf.reduce_mean(ssd_images)

有了这个变化,只需要稍微降低学习率(到 0.0001)。

【问题讨论】:

  • 如果你将学习率设置得低得多,它还会发散吗?
  • 我在当前使用的解决方案中进行了编辑。

标签: tensorflow conv-neural-network


【解决方案1】:

有很多方法可以得到非有限的结果。

但是如果学习率“太高”,优化器,尤其是像梯度下降这样简单的优化器,可能会发散。

您是否尝试过简单地将学习率除以 10/100/1000?或者通过pixels*batch_size 归一化以获得每个像素的平均误差?

还是more advanced optimizers 之一?例如带有默认选项的tf.train.AdamOptimizer()

【讨论】:

  • 你能举个例子如何使用它吗?将GradientDescentOptimizerAdamOptimizer 交换是行不通的。
  • 在标准化中包含批量大小是个好主意,我没想到!
  • 现在,我决定按照您的建议通过 batch_size 对 SSD 进行归一化(所以它实际上是 SSD)并将学习率设置得更低(除以 1000)。感谢您为我指明正确的方向。
  • 我总是建议按批次大小进行标准化。这样误差和梯度就不会随之改变。
猜你喜欢
  • 1970-01-01
  • 2019-03-11
  • 1970-01-01
  • 2021-03-27
  • 2021-10-15
  • 1970-01-01
  • 2017-09-02
  • 2019-02-11
  • 1970-01-01
相关资源
最近更新 更多