Tensorflow:我的损失函数产生巨大的数字

Tensorflow: My loss function produces huge number

我正在尝试使用神经网络修复图像,神经网络的权重使用去噪自动编码器进行预训练。全部根据https://papers.nips.cc/paper/4686-image-denoising-and-inpainting-with-deep-neural-networks.pdf

我已经制作了他们正在使用的自定义损失函数。

我的集合是图像的一批重叠补丁 (196x32x32)。我的输入是损坏的图像批次,输出应该是清理过的图像。

我的部分损失函数是

dif_y = tf.subtract(y_xi,y_)

dif_norm = tf.norm(dif_y, ord = 'euclidean', axis = (1,2))

其中y_xi(196 x 1 x 3072)是重建的干净图像,y_(196 x 1 x 3072)是真正的干净图像。所以我实际上从损坏的版本中减去所有图像,然后对所有这些差异求和。我认为这是一个非常大的数字是正常的。

train_step = tf.train.AdamOptimizer().minimize(loss)

损失值从 3*10^7 左右开始,在 200 次运行(我循环 1000 次)后收敛于一个接近值。所以我的输出图像将与原始图像相距数英里。

编辑:从 3.02391e+07 开始收敛到 3.02337e+07

我的损失值是否正确?如果是这样,我怎样才能显着减少它?

谢谢

编辑 2:我的损失函数

dif_y = tf.subtract(y,y_)
dif_norm = tf.norm(dif_y, ord = 'euclidean', axis = (1,2))
sqr_norm = tf.square(dif_norm)
prod = tf.multiply(sqr_norm,0.5)
sum_norm2 = tf.reduce_sum(prod,0)
error_1 = tf.divide(sum_norm2,196)

sum_norm2 = tf.reduce_sum(prod,0) - 我不认为这是在做你想让它做的事。

假设 yy_ 具有 500 张图像的值,并且您有 10 个标签用于 500x10 矩阵。当 tf.reduce_sum(prod,0) 处理时,您将拥有 1 个值,该值是 500 个值的总和,每个值将是第二位中所有值的总和。

我认为这不是您想要的,每个标签的误差总和。可能你想要的是平均水平,至少根据我的经验,这对我来说很有效。另外,我不想要一大堆损失,每个图像一个损失,而是批量损失一个。

我喜欢使用

loss = tf.reduce_mean ( tf.reduce_mean( prod ) )

这具有使您的优化器参数变得简单的额外结果。我还没有 运行 遇到必须使用除 1.0 之外的任何东西作为 GradientDescent、Adam 或 MomentumOptimizer 的 learning_rate 的情况。

现在您的损失将与批量大小或标签数量无关。

如有其他人遇到类似问题,仅供参考:记得规范化您的数据!我实际上是从 [0,255] 范围内的值中减去 [0,1] 范围内的值。非常愚蠢的错误,我很难学到它!

Input values / 255

Expected values / 255

问题已解决。