使用两个图像的平方差作为张量流中的损失函数
Using squared difference of two images as loss function in tensorflow
我正在尝试使用两个图像之间的 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)。
有很多方法可以得到非有限的结果。
但是如果学习率为 'too high'。
,优化器,尤其是像梯度下降这样简单的优化器,可能会发散。
您试过简单地将学习率除以 10/100/1000 吗?或者通过 pixels*batch_size
归一化以获得每个像素的平均误差?
或more advanced optimizers之一?例如 tf.train.AdamOptimizer()
使用默认选项。
我正在尝试使用两个图像之间的 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)。
有很多方法可以得到非有限的结果。
但是如果学习率为 'too high'。
,优化器,尤其是像梯度下降这样简单的优化器,可能会发散。您试过简单地将学习率除以 10/100/1000 吗?或者通过 pixels*batch_size
归一化以获得每个像素的平均误差?
或more advanced optimizers之一?例如 tf.train.AdamOptimizer()
使用默认选项。