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

Tensorflow 基于编解码器CNNs的语义分割,tensorflow,deep-learning,keras,Tensorflow,Deep Learning,Keras,因误用技术术语而道歉。 我正在从事一个通过CNN进行语义切分的项目;尝试实现一种类型编码器-解码器的体系结构,因此输出与输入大小相同 你是如何设计标签的? 应该应用什么样的损失函数?特别是在重类不平衡的情况下(但类之间的比率因图像而异) 这个问题涉及两类(感兴趣的对象和背景)。我将Keras与tensorflow后端一起使用 到目前为止,我将设计与输入图像相同尺寸的预期输出,应用像素级标签。模型的最后一层具有softmax激活(用于2个类)或sigmoid激活(表示像素属于对象类的概率)。我很难

因误用技术术语而道歉。 我正在从事一个通过CNN进行语义切分的项目;尝试实现一种类型编码器-解码器的体系结构,因此输出与输入大小相同

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

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

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

函数(y_pred,y_true)

与Keras的意见一致


请尽量具体说明所涉及的张量的尺寸(模型的输入/输出)。非常感谢您的任何想法和建议。谢谢大家!

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

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
然后使用整数编码类(记住,在这种情况下,您应该使用稀疏分类熵作为损失)来馈送一个热编码特征映射或形状矩阵
(图像高度、图像宽度)


为了处理类不平衡(我想这是因为一个背景类),我强烈建议您仔细阅读这个堆栈溢出的答案

我建议从实践中使用的基本架构开始,比如在神经分割中使用的架构:。这里,骰子损失被用作损失函数。这对于两类问题非常有效,如文献所示:

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

两种方式:

  • 你可以试试“压扁”:

    model.add(Reshape(NUM_CLASSES,HEIGHT*WIDTH))  #shape : HEIGHT x WIDTH x NUM_CLASSES
    model.add(Permute(2,1)) # now itll be NUM_CLASSES x HEIGHT x WIDTH
    #Use some activation here- model.activation()
    #You can use Global averaging or Softmax
    
  • 每像素一次热编码:

    在这种情况下,最后一层应该向上采样/取消采样/去卷积到高度x宽度x类。所以您的输出基本上是形状:(高度、宽度、NUM_类)


  • 建议移动此问题建议将此问题移动到当我使用
    sparse\u category\u crossentropy
    时,我得到一个形状错误:
    预期conv2d\u 19具有形状(无,4,64,1),但得到了具有形状的数组(634,4,64,64)
    ——但当我使用
    category\u crossentropy
    时,模型会训练(虽然损失似乎没有改变)——有什么想法吗?