语义分割的损失函数


10

对于滥用技术术语表示赞赏。我正在通过卷积神经网络(CNN)进行语义分割的项目;试图实现Encoder-Decoder类型的体系结构,因此输出的大小与输入的大小相同。

您如何设计标签?一个应该应用什么损失函数?尤其是在严重的类别不平衡的情况下(但是类别之间的比率在图像之间是可变的)。

该问题涉及两个类别(感兴趣的对象和背景)。我正在将Keras与tensorflow后端一起使用。

到目前为止,我将应用按像素标注将预期输出设计为与输入图像相同的尺寸。模型的最后一层具有softmax激活(针对2个类)或S型激活(表示像素属于对象类的概率)。我在为此类任务设计合适的目标函数时遇到麻烦:

function(y_pred,y_true)

同意Keras的观点

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


阅读此arxiv.org/pdf/1511.00561.pdf “我们使用交叉熵损失作为训练网络的目标函数。”
Palmer小姐

Answers:


6

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

这是直接实现此目的的论文:Shelhamer等人的用于语义分割全卷积网络

掌中纸也是一个非常成功实施的想法,采用空间分辨率的防止损失跳过连接。您可以在网上找到许多实现方法。

根据我的个人经验,您可能想先从一个简单的编码器/解码器网络开始,但不要使用跨度(或跨度= 1),否则会因为上采样效果不理想而损失很多分辨率。选择较小的内核。我不知道您的具体应用,但即使是2-3个隐藏层的网络也能提供很好的效果。每层使用32-64个通道。启动简单的2个隐藏层,每个隐藏层32个通道,使用3x3内核,步幅= 1,并以孤立的方式尝试参数以查看其效果。保持尺寸始终等于启动器的输入尺寸,以避免分辨率损失。之后,您可以大步前进并进行升采样,并实现U-Net之类的想法。U-Net对于医学图像分割非常有效。

αβ


我不是该领域的专家,但是在这种情况下,课程不应该排他吗?如果是,softmax损失不是更好的选择吗?tensorflow.org/api_docs/python/tf/nn/...
哈拉尔德·汤姆森

1
@HaraldThomson,细分是一个二进制问题。许多人使用softmax来解决二进制问题,但这完全是不必要的和过度的。代替具有两个输出节点,而是具有一个表示P(y = 1)的输出节点,然后使用交叉熵。
里卡多·克鲁兹

2

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


-1

首先让我更具体,然后再更笼统。如果您误会了,我深表歉意。

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

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

但是,选择尺寸,标签和损失函数更像是基础机器学习。我认为您可能对深度学习不感兴趣。您是否首先上了普通的旧机器学习课程?


这有必要吗?例如,请参阅Pixon方法
卡尔

这是一种有效的方法:arxiv.org/pdf/1511.00561.pdf
Palmer小姐

“ CNN和其他深度学习模型是存在的一些最复杂的机器学习模型。” 我倾向于不同意。该模型本身可能很复杂,但实际上在几乎没有理论知识的情况下,使用起来非常简单。这就是关于DL,理论量少,易于编写模型以及具有很高准确性的整个炒作的原因……
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.