我正在尝试使用带有去噪自动编码器预训练的NN进行图像修复。全部根据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次运行(I循环为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)
答案 0 :(得分:1)
只是为了记录,如果其他人有类似的问题:记住要规范你的数据!我实际上是从范围[0,255]中的值中减去范围[0,1]中的值。非常错误的错误,我很难学到它!
输入值/ 255
预期值/ 255
问题解决了。
答案 1 :(得分:0)
sum_norm2 = tf.reduce_sum(prod,0) - 我不认为这是你想做的事。
说 y 和 y _ 包含500张图片的值,并且您有500张10x矩阵的10个标签。当 tf.reduce_sum(prod,0)处理时,您将拥有1个值,即500个值的总和,每个值将是第2个等级中所有值的总和。
我不认为这就是你想要的,每个标签上的错误总和。可能你想要的是平均水平,至少在我的经验中,这对我来说是多么奇迹。此外,我不想要一大堆损失,每张图片都有一张损失,而不是一批损失。
我的偏好是使用像
这样的东西loss = tf.reduce_mean ( tf.reduce_mean( prod ) )
这使得优化器参数变得简单有了额外的结果。我还没遇到过必须使用1.0以外的任何东西来为GradientDescent,Adam或MomentumOptimizer的learning_rate。
现在您的损失将与批量大小或标签数量无关。