语义分割Keras的交叉熵损失

TSW*_*TSW 14 image-processing image-segmentation deep-learning keras

我很确定这是一个愚蠢的问题,但我无法在其他任何地方找到它,所以我会在这里问它.

我正在使用带有7个标签的keras中的cnn(unet)进行语义图像分割.所以每个图像的标签是(7,n_rows,n_cols)使用theano后端.因此,对于每个像素的7个层,它是一个热编码的.在这种情况下,使用分类交叉熵是正确的误差函数吗?这似乎对我来说,但网络似乎更好地学习二进制交叉熵损失.有人可以阐明为什么会这样,原则目标是什么?

ind*_*you 15

二元交叉熵损失应该与sigmod最后一层中的激活一起使用,并严重惩罚相反的预测.它没有考虑到输出是一个热门的编码,预测的总和应该是1.但由于错误预测严重惩罚模型,有些学会正确分类.

现在强制执行单热代码的先验是使用softmax具有分类交叉熵的激活.这是你应该使用的.

现在问题是使用softmax你的情况,因为Keras不支持每个像素上的softmax.

最简单的方法是使用Permute图层将尺寸置换为(n_rows,n_cols,7),然后使用图层将其重新整形为(n_rows*n_cols,7)Reshape.然后,您可以添加softmax激活层并使用共生丢失.数据也应相应地重新整形.

另一种方法是实现depth-softmax:

def depth_softmax(matrix):
    sigmoid = lambda x: 1 / (1 + K.exp(-x))
    sigmoided_matrix = sigmoid(matrix)
    softmax_matrix = sigmoided_matrix / K.sum(sigmoided_matrix, axis=0)
    return softmax_matrix
Run Code Online (Sandbox Code Playgroud)

并将其用作lambda层:

model.add(Deconvolution2D(7, 1, 1, border_mode='same', output_shape=(7,n_rows,n_cols)))
model.add(Permute(2,3,1))
model.add(BatchNormalization())
model.add(Lambda(depth_softmax))
Run Code Online (Sandbox Code Playgroud)

如果tf image_dim_ordering使用,那么您可以使用Permute图层.

欲了解更多参考检查这里.