tensorflow - 在tensorflow中使用两幅图像的平方差作为损失函数

标签 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)。

最佳答案

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

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

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

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

关于tensorflow - 在tensorflow中使用两幅图像的平方差作为损失函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33753251/

相关文章:

python - 如何在公式中使用 tensorflow 张量值?

java - Tensorflow Lite Android 对象检测 - 移动 SSD 模型预计恰好有 4 个输出,发现有 8 个

python - 如何 reshape 包含图像数据的数组

machine-learning - CNN 每个节点的范围更窄,因此每层的范围更大?

python - Keras Dropout 卷积滤波器

python - Keras 中的 3D 卷积是否适用于 RGB 视频?

python - 无法迭代 tf.data.Dataset

python - 如何在 TensorFlow 中设置矢量化参数的双射器?

python - 在以下 CNN 模型中,全连接层之前的 reshape 是如何工作的?

deep-learning - torch : GPU Memory Leak