【问题标题】:calculate loss value over several tensors计算多个张量的损失值
【发布时间】: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


【解决方案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)

【讨论】:

    猜你喜欢
    • 2021-10-08
    • 2021-01-23
    • 2020-10-31
    • 2017-09-13
    • 2020-04-09
    • 1970-01-01
    • 2018-07-06
    • 2018-12-16
    • 2017-11-07
    相关资源
    最近更新 更多