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

用两幅图像的平方差作为tensorflow中的损失函数,tensorflow,conv-neural-network,Tensorflow,Conv Neural Network,我正在尝试使用两个映像之间的SSD作为网络的丢失功能 #h#u fc2是我的输出层,y#是我的标签图像。 ssd=tf.减和(tf.平方(y_u-h_fc2)) 序列步进=tf.序列梯度减优化器(0.01).最小化(ssd) 问题是,权重会发散,我会得到误差 ReluGrad输入不是有限的:张量具有Inf值 为什么?我确实尝试了一些其他方法,如按图像大小对ssd进行规格化(不起作用)或将输出值裁剪为1(不再崩溃,但我仍需要对此进行评估): ssd_min_1=tf.减少总和(tf.平方(y_

我正在尝试使用两个映像之间的SSD作为网络的丢失功能

#h#u fc2是我的输出层,y#是我的标签图像。
ssd=tf.减和(tf.平方(y_u-h_fc2))
序列步进=tf.序列梯度减优化器(0.01).最小化(ssd)
问题是,权重会发散,我会得到误差

ReluGrad输入不是有限的:张量具有Inf值
为什么?我确实尝试了一些其他方法,如按图像大小对ssd进行规格化(不起作用)或将输出值裁剪为1(不再崩溃,但我仍需要对此进行评估):

ssd_min_1=tf.减少总和(tf.平方(y_-tf.最小值(h_fc2,1)))
序列步进=tf.序列梯度减优化器(0.01).最小化(ssd最小值1)
我的观察结果是否值得期待

编辑: @我的建议被证明是正确的。重点是通过批量大小进行规格化。这可以通过使用此代码独立于批大小来完成

squared_diff_image=tf.square(标签图像-输出图像)
#除第一个维度(批次维度)外,所有维度的总和。
ssd_image=tf.reduce_sum(平方_diff_image,[1,2,3])
#以平均ssd为例。
错误\u图像=tf.reduce\u平均值(ssd\u图像)

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

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

但是,如果学习率“太高”,优化器,特别是像梯度下降这样的简单优化器,可能会出现分歧

你有没有试过简单地将你的学习率除以10/100/1000?或者通过
像素*batch_size
进行规格化,以获得每个像素的平均误差


还是其中一个?例如带有默认选项的
tf.train.AdamOptimizer()

您能给我一个如何使用它的示例吗?只需将
GradientDescentOptimizer
AdamOptimizer
交换是行不通的。在规范化中包含批量大小是个好主意,我没有想到这一点!现在,我决定按照批处理大小对SSD进行规范化(因此它实际上是SSD),并按照您的建议将学习率设置得更低(除以1000)。谢谢你给我指出了正确的方向。我总是建议按批量大小进行规范化。这样,误差和梯度就不会随之改变。如果你将学习率设置得更低,它是否仍然会偏离?我在当前使用的解决方案中进行了编辑。