Image processing Tensorflow:我的损失函数产生了巨大的数字
我正在尝试使用神经网络进行图像修复,使用去噪自动编码器对权重进行预训练。照 我制作了他们正在使用的自定义损耗函数 我的集合是一幅图像的一批重叠面片196x32x32。我的输入是图像的损坏批次,输出应该是已清理的批次 我的损失函数的一部分是Image processing Tensorflow:我的损失函数产生了巨大的数字,image-processing,tensorflow,neural-network,deep-learning,autoencoder,Image Processing,Tensorflow,Neural Network,Deep Learning,Autoencoder,我正在尝试使用神经网络进行图像修复,使用去噪自动编码器对权重进行预训练。照 我制作了他们正在使用的自定义损耗函数 我的集合是一幅图像的一批重叠面片196x32x32。我的输入是图像的损坏批次,输出应该是已清理的批次 我的损失函数的一部分是 dif_y = tf.subtract(y_xi,y_) dif_norm = tf.norm(dif_y, ord = 'euclidean', axis = (1,2)) 其中y_xi196 x 1 x 3072是重建的干净图像,y_196 x 1 x
dif_y = tf.subtract(y_xi,y_)
dif_norm = tf.norm(dif_y, ord = 'euclidean', axis = (1,2))
其中y_xi196 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_sumprod,0-我不认为这是你想要它做的
假设y和y_500个图像有值,500x10矩阵有10个标签。当tf.reduce_sumprod时,0处理您将有1个值,每个值是500个值的总和,这将是第二级中所有值的总和
我不认为这是你想要的,每个标签上的错误总和。也许你想要的是平均水平,至少在我的经验中,这对我来说是个奇迹。此外,我不希望有一大堆损失,每个图像一个,而是一批损失
我的偏好是使用
loss = tf.reduce_mean ( tf.reduce_mean( prod ) )
这会使优化器参数变得简单。我还没有遇到过这样的情况,我必须使用1.0以外的任何东西作为GradientDescent、Adam或MomentumOptimizer的学习率
现在,您的丢失将与批次大小或标签数量无关。如果其他人有类似问题,请记录:记住规范化数据!我实际上是从[0255]范围内的值中减去[0,1]范围内的值。非常愚蠢的错误,我通过艰苦的方式学会了 输入值/255 期望值/255
问题已解决。如此高的损耗意味着网络无法适应您的数据/任务,一个不同的体系结构,即更深层次的体系结构可能会有所帮助。您能否提供代码行以计算损耗。@wontonimo我添加了我测试中的代码行,我相信问题在于dif_norm=tf.norm。即使当我运行一个小得多的批次15张图像而不是196张图像时,损失仍然保持不变,并且dif_标准值不变。我同意这样的想法,我希望损失的是整个批次,而不是批次的每个图像。现在,我用批次大小196除以平均损失,但我一定会用tf.reduce_平均值试试。这是有道理的。此外,你认为我必须设置我的学习速度,而不是让Adam来决定吗?我会首先使用Adam的默认值。事实上,我会首先使用动量作为基线如果有人读了上面关于Momentum vs Adam的评论,想让我们了解更多,这里有一个很好的链接,基本上说,试试Adam,因为它很棒。