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