【发布时间】: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)
标签: python neural-network pytorch image-segmentation loss-function