在我的CNN深度学习网络的计算过程中,训练阶段的损失是用交叉熵函数计算的:
tf.nn.weighted_cross_entropy_with_logits(targets = labels_flat, logits = logits_flat, pos_weight=98.22)
但是,它假设预测和真实情况的位置非常好,但这里的情况并非如此。实际上,我的地面实况可以从 2-3 个像素进行局部偏移,因此,我想使用“像素级”比较的不确定性来计算交叉熵。
为此,我按以下方式处理: 我定义了想要的不确定性,这里是 2 个像素。然后,我可以在地面实况的每一侧裁剪 2 个像素。预测也会在不同的位置进行裁剪,模拟预测和真实情况之间的“转变”。 接下来,我必须计算这个“转移”预测和真实情况之间的损失,保存它并转到下一个“转移”预测。这样做,我用不同的偏移值计算了损失。
如果我正确理解了 tensorflow 中的交叉熵函数,那么如果预测良好,GT 和预测之间的像素比较应该是最小的。因此,我可以使用交叉熵张量每个分量的最小值来计算预测和 GT 之间的平均损失。
with tf.variable_scope('loss_layer'):
Unc = 2
labelsCropped = tf.image.crop_to_bounding_box(labels, Unc, Unc, 256-Unc*2, 256-Unc*2)
labels_flat = tf.reshape(labelsCropped, [-1, depth])
Allcross_entropy_loss = []
for x in range(2*2):
for y in range(2*2):
logitsCropped = tf.image.crop_to_bounding_box(logits, x, y, 256-Unc*2, 256-Unc*2)
logits_flat = tf.reshape(logitsCropped, [-1, depth])
Allcross_entropy_loss += [tf.nn.weighted_cross_entropy_with_logits(targets = labels_flat, logits = logits_flat, pos_weight=98.22)]
loss = tf.reduce_mean(tf.reduce_min(tf.stack(Allcross_entropy_loss), 0))
顺便说一句,这会非常快地产生等于 0 的损失(大约 100 次迭代,这快得令人难以置信,我之前的模型计算了超过 20 000 次迭代(20 个时期和 1000 次迭代/时期,有一个损失 ~0.4)。我预计这里会出现问题,但我不知道如何显示每个函数的输出,例如,我想知道 reduce_min
函数是否给出最小张量252x252 或仅 1 个值。如果返回 1 个值,则错误。
最佳答案
为了社区的利益,提及下面的解决方案。
从下面的行中删除 tf.stack
可以解决该问题。
loss = tf.reduce_mean(tf.reduce_min(tf.stack(Allcross_entropy_loss), 0))
正确代码如下:
loss = tf.reduce_mean(tf.reduce_min(Allcross_entropy_loss), 0)
关于tensorflow - 计算多个张量的损失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58395211/