Tensorflow 计算几个张量上的损失值

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个像素局部移动,因此,我想使用“像素级”比较的不确定性来计算交叉熵 为此,我将按照以下步骤进行处理: 我定义了想要的不确定性,这里

在计算我的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次迭代,这太快了,不可能是真实的,我以前的模型计算了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(…)
上。如果没有这个函数,它似乎是可以修复的。