语义分割损失函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了语义分割损失函数相关的知识,希望对你有一定的参考价值。
参考技术A 交叉熵损失在pytorch中有直接的实现一般我们搜索交叉熵损失都会搜到二分类的交叉熵损失
y'是经过sigmoid激活函数的输出,所以在0-1之间,对应预测样本为类别1的概率,1-y'就是对应预测样本为类别0的概率。
普通的交叉熵对于正样本而言,输出概率越大损失越小。对于负样本而言,输出概率越小则损失越小。
但上面的公式并不对应pytorch中的交叉熵损失
因为上面公式认为y'就一个值,而实际网络输出有多少类对应于有多少个y',可以说是
然后交叉熵损失就是
现在看看pytorch的交叉熵损失实现
只看 部分
和上面 也不一样
其实括号里面的一堆就是 ,只不过是对网络输出 做了一个softmax,让其值在0-1之间,对应预测样本为类别 的概率
存在的问题:
当负样本数量太大,占总的loss的大部分,而且多是容易分类的,因此使得模型的优化方向并不是我们所希望的那样。
改进:加权重
nn.CrossEntropyLoss()有一个参数weight
Focal loss主要是为了解决正负样本比例严重失衡的问题。该损失函数降低了大量简单负样本在训练中所占的权重,也可理解为一种困难样本挖掘
原文写作:
Dice系数,是一种集合相似度度量函数,通常用于计算两个样本的相似度(范围为[0, 1])
1
参考:
https://pytorch.org/docs/stable/generated/torch.nn.CrossEntropyLoss.html#torch.nn.CrossEntropyLoss
https://www.cnblogs.com/king-lps/p/9497836.html
https://zhuanlan.zhihu.com/p/57008984
https://zhuanlan.zhihu.com/p/94326225
https://blog.csdn.net/xijuezhu8128/article/details/111164936
Pytorch 语义分割损失函数
【中文标题】Pytorch 语义分割损失函数【英文标题】:Pytorch semantic segmentation loss function 【发布时间】:2021-07-30 18:11:20 【问题描述】:我是细分模型的新手。
我想使用 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
,我的输出和标签的大小应该是多少?
谢谢大家。
【问题讨论】:
【参考方案1】:你使用了错误的损失函数。
nn.BCEWithLogitsLoss()
代表 Binary 交叉熵损失:这是 Binary 标签的损失。在您的情况下,您有 5 个标签 (0..4)。
您应该使用nn.CrossEntropyLoss
:为离散标签设计的损失,超出二进制情况。
您的模型应该输出一个形状为 [32, 5, 256, 256]
的张量:对于该批次的 32 个图像中的每个像素,它应该输出一个 logits 的 5 维向量。 logits 是每个类的“原始”分数,稍后将使用 softmax 函数将其归一化为类概率。
为了数值稳定性和计算效率,nn.CrossEntropyLoss
不需要您显式计算 logits 的 softmax,而是在内部为您完成。如文档所述:
此标准将 LogSoftmax 和 NLLLoss 组合在一个类中。
【讨论】:
知道了。如果我想稍后计算 IOU 或像素精度,我是否应该将输出设为[32, 256, 256]
(可能是 output.argmax(dim=1))以匹配我的标签?
@KKKcat argmax 在通道暗淡上应该会给你预测的标签【参考方案2】:
鉴于您正在处理 5 个类,您应该使用 CrossEntropyLoss。顾名思义,二元交叉熵是您在拥有二元分割图时使用的损失函数。
PyTorch 中的 CrossEntropy 函数期望模型的输出具有以下形状 - [batch, num_classes, H, W]
(将其直接传递给您的损失函数),而基本事实的形状为 [batch, H, W]
其中H, W
在您的情况是 256、256。另外请通过在张量上调用 .long()
来确保基本事实是 long
类型
【讨论】:
以上是关于语义分割损失函数的主要内容,如果未能解决你的问题,请参考以下文章
为啥训练多类语义分割的unet模型中的分类交叉熵损失函数非常高?