语义分割的损失函数?

机器算法验证 卷积神经网络 图像处理 图像分割
2022-02-28 08:49:11

为滥用技术术语道歉。我正在研究一个通过卷积神经网络 (CNN) 进行语义分割的项目;试图实现编码器-解码器类型的架构,因此输出与输入的大小相同。

你如何设计标签?应该应用什么损失函数?尤其是在严重的类不平衡的情况下(但类之间的比例因图像而异)。

该问题涉及两类(感兴趣的对象和背景)。我正在使用带有 tensorflow 后端的 Keras。

到目前为止,我正在设计预期的输出,使其与输入图像的尺寸相同,并应用逐像素标记。模型的最后一层具有 softmax 激活(用于 2 个类)或 sigmoid 激活(表示像素属于对象类的概率)。我在为这样的任务设计合适的目标函数时遇到了麻烦,类型如下:

function(y_pred,y_true),

Keras一致。

请尝试具体说明所涉及的张量的维度(模型的输入/输出)。任何想法和建议都非常感谢。

3个回答

交叉熵绝对是要走的路。我不知道 Keras,但 TF 有这个:https ://www.tensorflow.org/api_docs/python/tf/nn/sigmoid_cross_entropy_with_logits

这是一篇直接实现这一点的论文: Shelhamer 等人的Fully Convolutional Networks for Semantic Segmentation

U-Net 论文也是该想法的一个非常成功的实现,使用跳跃连​​接来避免空间分辨率的损失你可以在网上找到很多实现。

根据我的个人经验,您可能想先从简单的编码器-解码器网络开始,但不要使用 strides(或 strides=1),否则会因为上采样不完美而损失很多分辨率。使用小内核大小。我不知道您的具体应用,但即使是 2-3 隐藏层网络也会产生非常好的结果。每层使用 32-64 个通道。开始简单,2 个隐藏层,每个 32 个通道,3x3 内核,stride=1,并以孤立的方式试验参数以查看它们的效果。保持尺寸始终等于初学者的输入尺寸,以避免分辨率损失。之后,您可以开启跨步和上采样并实施 U-Net 之类的想法。U-Net 非常适用于医学图像分割。

对于类不平衡,请参阅https://swarbrickjones.wordpress.com/2017/03/28/cross-entropy-and-training-test-class-imbalance/ 这里的想法是用对不同的类进行加权参数。αβ

使用加权骰子损失和加权交叉熵损失。Dice loss 非常适合分割。您可以开始使用的权重应该是类频率的倒数,即采样 50-100 个样本,找到属于每个类的平均像素数,并使该类的权重为 1/均值。您可能必须自己实现骰子,但它很简单。此外,您可以查看反向骰子损失和焦点损失

让我先更具体,然后更笼统。如果我误解了你,我很抱歉。

我认为您正在谈论需要一个自动编码器神经网络,因为您提到了编码和解码,并且您提到了输入大小与输出大小相同。如果是这样,那么您的损失函数基于再现输入向量,同时还将数据压缩成中间隐藏层中的较短向量。选择是实现最小均方误差(用于回归)或对数损失或误分类率(用于分类)。然而,CNN 并不是我在自动编码器中使用过的东西,但我确实认为在平移不变性很重要的情况下这样做既可行又有用,例如图像中的边缘和对象检测。

更一般地说,自从您提到 CNN 以来,您似乎正在构建一个非常复杂的机器学习模型。CNN 和其他深度学习模型是现有的一些最复杂的机器学习模型。

然而,选择维度、标签和损失函数更像是基本的机器学习。我认为您可能对深度学习感到困惑。您是否先上过关于普通机器学习的课程?