使用两个图像的平方差作为张量流中的损失函数

时间:2015-11-17 09:25:35

标签: tensorflow conv-neural-network

我试图在两个图像之间使用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)。

1 个答案:

答案 0 :(得分:3)

有许多方法可以最终得到非有限的结果。

但是,如果学习率过高,优化者,特别是梯度下降等简单的优化者可能会出现分歧。

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

或其中一个more advanced optimizers?例如tf.train.AdamOptimizer(),默认选项。