交叉熵损失Pytorch



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

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

网络的输出是[batch_size,#classes,width,height,depth]#类现在等于两个,两个维度基本上是相反的,因为我现在只有背景类和一个前景类。

现在我想计算交叉熵损失。现在我的实现是这样的:

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)

从nn开始,我必须对背景真相进行一些维度的改变。CrossEntropyLoss((期望地面实况的大小为(5,384,384,81(,而输出的大小为-->batch_size=5,#classes=2,picture=384x384和81个图片深度。

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

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

谢谢!

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

  1. 二进制交叉熵损失-期望每个目标和输出都是形状为〔batch_size,num_classes,……〕的张量,每个张量的值在[0,1]范围内。

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

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

最新更新