Tensorflow 计算几个张量上的损失值
在计算我的CNN深度学习网络时,使用交叉熵函数计算训练阶段的损失:Tensorflow 计算几个张量上的损失值,tensorflow,deep-learning,conv-neural-network,Tensorflow,Deep Learning,Conv Neural Network,在计算我的CNN深度学习网络时,使用交叉熵函数计算训练阶段的损失: tf.nn.weighted_cross_entropy_with_logits(targets = labels_flat, logits = logits_flat, pos_weight=98.22) 但是,它假设预测和地面真相的位置很好,但这里的情况并非如此。事实上,我的基本真理可以从2-3个像素局部移动,因此,我想使用“像素级”比较的不确定性来计算交叉熵 为此,我将按照以下步骤进行处理: 我定义了想要的不确定性,这里
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次迭代,这太快了,不可能是真实的,我以前的模型计算了20000次迭代(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)
我认为问题出在
tf.stack(…)
上。如果没有这个函数,它似乎是可以修复的。