首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于编解码器CNNs的语义分割

基于编解码器CNNs的语义分割
EN

Stack Overflow用户
提问于 2017-02-07 23:27:44
回答 3查看 757关注 0票数 4

对技术术语的误用表示道歉。我正在做一个通过CNNs进行语义分割的项目;试图实现一个Encoder-Decoder类型的体系结构,因此输出与输入的大小相同。

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

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

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

函数(y_pred,y_true),

与凯拉斯达成一致。

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

EN

回答 3

Stack Overflow用户

发布于 2017-02-08 04:12:27

实际上,当您使用TensorFlow后端时,您可以通过以下方式简单地应用预定义的Keras目标:

代码语言:javascript
复制
output = Convolution2D(number_of_classes, # 1 for binary case
                       filter_height,
                       filter_width,
                       activation = "softmax")(input_to_output) # or "sigmoid" for binary
... 
model.compile(loss = "categorical_crossentropy", ...) # or "binary_crossentropy" for binary

然后用整数编码的类提供一个单一的编码特征图或形状(image_height, image_width)矩阵(记住,在这种情况下,您应该使用sparse_categorical_crossentropy作为损失)。

为了处理类的不平衡(我猜是因为背景类),我强烈建议你仔细阅读这篇堆栈溢出question的答案。

票数 1
EN

Stack Overflow用户

发布于 2017-02-08 18:50:32

我建议从实践中使用的基础架构开始,比如在神经分段中使用的基础架构:https://github.com/EdwardTyantov/ultrasound-nerve-segmentation。这里使用dice_loss作为损失函数。这对于一个两类问题非常有效,正如文献中所示:https://arxiv.org/pdf/1608.04117.pdf

另一个广泛使用的损失函数是用于此类问题的交叉熵。对于像您这样的问题,最常见的是部署长连接和短连接来稳定训练,如上面的论文所述。

票数 1
EN

Stack Overflow用户

发布于 2017-03-14 18:24:22

两种方式:

  1. 你可以尝试“展平”:

Model.add( NUM_CLASSES ( NUM_CLASSES *model.add))#NUM_CLASSES: HEIGHT x WIDTH x NUM_CLASSES model.add(Permute(2,1)) #现在它将是NUM_CLASSES x HEIGHT x WIDTH #在这里使用一些激活- model.activation() #你可以使用全局平均或Softmax

  • 对每个像素进行一次热编码:

在这种情况下,你的最后一层应该是Upsample/Unpool/Deconvolve to HEIGHT x WIDTH x CLASSES。因此,您的输出本质上是这样的:(HEIGHT,WIDTH,NUM_CLASSES)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42093632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档