交叉熵损失 Pytorch

Posted

技术标签:

【中文标题】交叉熵损失 Pytorch【英文标题】:Cross Entropy Loss Pytorch 【发布时间】:2021-08-25 10:17:24 【问题描述】:

我有一个关于在我的 pytorch - 网络中优化交叉熵损失的问题。我正在构建一个预测体积图片的 3D 分割的网络。我有一个背景类或一个前景类,但它应该也有可能预测两个或更多不同的前景类。

训练时输入到我的网络的形状为 [batch_size, input_channels, width, height, depth]。输入通道等于 1,因为我只有灰度图像,深度取决于构成 3D 体积的 2D 图片的数量。

网络的输出是[batch_size, #classes, width, height, depth]。 #classes 现在等于 2,并且这两个维度几乎是彼此的倒数,因为我现在只有背景类和一个前景类。

现在我想计算交叉熵损失。现在我的实现如下所示:

    def loss(output, gt):
    loss_fn = nn.CrossEntropyLoss()
    gt_temp = torch.tensor(np.zeros((output.shape[0], output.shape[2],output.shape[3], output.shape[4]))).long()
    gt_temp[:, :, :, :] = gt[:, 0, :, :, :]
    return loss_fn(output, gt_temp)

我必须对 groundtruth 进行一些维度更改,因为 nn.CrossEntropyLoss() 期望 groundtruth 的大小为 (5, 384, 384, 81),而输出的大小为 (5, 2, 384, 384) , 81) --> batch_size = 5,#classes = 2,图片 = 384x384 和 81 张图片深度。

问题是这并没有真正起作用。它收敛到 0.5-0.6 的损失,它只是预测整个输出是背景。我该怎么办?

如果有人能帮忙就太好了!!!另外我不明白为什么输出和groundtruth不应该是相同的形状?!

谢谢!

【问题讨论】:

如果我理解正确,请参考focal loss,它旨在解决此类问题。 关于形状问题:如果没有正确的代码和堆栈跟踪,将无法提供帮助。 你的标签是什么形状的? groundtruth 的形状和预测是 (#batches, #classes, width, height, depth) 【参考方案1】:

关于形状问题,交叉熵损失有两个pytorch损失函数:

    Binary Cross Entropy Loss - 期望每个目标和输出是一个形状为 [batch_size, num_classes, ....] 的张量,每个都有一个 [0,1] 范围内的值。

    交叉熵损失 - 为简单起见,目标张量不是大小 [batch_size,...]。每个都有一个 [0,num_classes - 1] 范围内的整数值。

认为在交叉熵损失函数中做的第一件事是使用目标张量来计算二元交叉熵损失的目标张量可能会有所帮助,然后损失的计算方式与此损失函数中相同.唯一的区别是,根据您的目标数据的格式,其中一种或另一种公式可能会稍微方便一些,因为它需要的整形更少。

【讨论】:

感谢您的回答!我正在尝试使用 BCELoss 运行我的网络,看看会发生什么

以上是关于交叉熵损失 Pytorch的主要内容,如果未能解决你的问题,请参考以下文章

详解pytorch中的交叉熵损失函数nn.BCELoss()nn.BCELossWithLogits(),二分类任务如何定义损失函数,如何计算准确率如何预测

如何在 PyTorch 中计算自举交叉熵损失?

pytorch nn.CrossEntropyLoss() 中的交叉熵损失

Pytorch - 使用一种热编码和 softmax 的(分类)交叉熵损失

Pytorch常用的交叉熵损失函数CrossEntropyLoss()详解

PyTorch 交叉熵损失函数内部原理简单实现