我是细分模型的新手。
我想使用 deeplabv3_resnet50 模型。
我的图像形状为 (256, 256, 3)
,我的标签形状为 (256, 256)
。我标签中的每个像素都有一个类值(0-4)。并且 DataLoader 中设置的批大小为 32。
因此,我的输入批次的形状为 [32, 3, 256, 256]
,对应目标的形状为 [32, 256, 256]
。我相信这是正确的。
我正在尝试使用 nn.BCEWithLogitsLoss()
。
CrossEntropy
代替?[32, 5, 256, 256]
。每个图像预测的形状为 [5,256, 256]
,第 0 层是否意味着第 0 类的未标准化概率?为了使 [32, 256, 256]
张量与目标匹配以输入 BCEWithLogitsLoss
,我是否需要将未标准化的概率转换为类?CrossEntropy
,我的输出和标签的大小应该是多少?谢谢大家。
答案 0 :(得分:0)
您使用了错误的损失函数。
nn.BCEWithLogitsLoss()
代表 Binary 交叉熵损失:这是 Binary 标签的损失。就您而言,您有 5 个标签 (0..4)。
您应该使用 nn.CrossEntropyLoss
:为离散标签设计的损失,超出二元情况。
您的模型应该输出形状为 [32, 5, 256, 256]
的张量:对于批次的 32 张图像中的每个像素,它应该输出 logits 的 5 维向量。 logits 是每个类的“原始”分数,稍后使用 softmax 函数归一化为类概率。
为了数值稳定性和计算效率,nn.CrossEntropyLoss
不要求您显式计算 logits 的 softmax,而是在内部为您计算。正如文档所读:
该标准将 LogSoftmax 和 NLLLoss 组合在一个类中。
答案 1 :(得分:0)
鉴于您正在处理 5 个类,您应该使用 CrossEntropyLoss。二元交叉熵,顾名思义是当你有二元分割图时使用的一种损失函数。
PyTorch 中的 CrossEntropy 函数期望模型的输出具有形状 - [batch, num_classes, H, W]
(将其直接传递给您的损失函数)并且基本事实具有形状 [batch, H, W]
其中H, W
在您的情况下是 256, 256。另外,请通过在张量上调用 long
来确保基本事实是 .long()
类型