【发布时间】:2019-10-15 12:53:36
【问题描述】:
在我的CNN深度学习网络的计算过程中,训练阶段的loss是用交叉熵函数计算的:
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 epochs 和 1000 次迭代/epoch)中计算出来的,有损失 ~0.4). 我预计这里有问题,但我不知道如何显示每个函数的输出,例如,我想知道 reduce_min 函数是否给出 252x252 的最小张量或仅 1 个值. 如果它返回1个值,那就错了。
【问题讨论】:
-
我认为
tf.stack(...)是问题所在。好像没有这个功能就修好了。
标签: tensorflow deep-learning conv-neural-network