对滥用技术术语表示道歉。 我正在通过CNN进行语义分割项目;尝试实现Encoder-Decoder类型的体系结构,因此输出与输入的大小相同。
您如何设计标签? 应该使用什么损失函数?特别是在重度失衡的情况下(但是类别之间的比例在图像之间是可变的)。
问题涉及两个类(感兴趣的对象和背景)。我正在使用带有张量流后端的Keras。
到目前为止,我将设计预期输出与输入图像的尺寸相同,应用按像素标记。模型的最后一层具有softmax激活(用于2个类)或sigmoid激活(用于表示像素属于对象类的概率)。我在为类似的任务设计合适的目标函数时遇到了麻烦:
功能(y_pred,y_true),
与Keras达成协议。
请尝试具体说明所涉及的张量尺寸(模型的输入/输出)。任何想法和建议都非常感谢。谢谢!
答案 0 :(得分:1)
实际上,当您使用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
然后使用整数编码的类提供单热编码特征映射或形状(image_height, image_width)
矩阵(请记住,在这种情况下,您应该使用sparse_categorical_crossentropy
作为丢失)。
为了处理类失衡(我猜它是由于背景类)我强烈建议你仔细阅读这个Stack Overflow question的答案。
答案 1 :(得分:1)
我建议从实践中使用的基础架构开始,例如神经分割中的基础架构:https://github.com/EdwardTyantov/ultrasound-nerve-segmentation。这里使用dice_loss作为损失函数。这对于两类问题非常有效,如文献中所示:https://arxiv.org/pdf/1608.04117.pdf。
另一种广泛使用的损失函数是这种问题的交叉熵。对于像您这样的问题,最常见的是长短跳过连接以稳定训练,如上文所述。
答案 2 :(得分:1)
两种方式:
您可以尝试'展平':
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
对每个像素进行一次热编码:
在这种情况下,最后一层应该是Upsample / Unpool / Deconvolve到HEIGHT x WIDTH x CLASSES。所以你的输出基本上是形状:( HEIGHT,WIDTH,NUM_CLASSES)。