gpt4 book ai didi

image-processing - 语义分割 Keras 的交叉熵损失

转载 作者:行者123 更新时间:2023-12-03 22:22:56 24 4
gpt4 key购买 nike

我很确定这是一个愚蠢的问题,但我在其他任何地方都找不到,所以我要在这里问。

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

最佳答案

二元交叉熵损失应与 sigmod 一起使用在最后一层激活,它会严重惩罚相反的预测。它没有考虑到输出是单热编码并且预测的总和应该是 1。但是由于错误预测严重惩罚了模型,所以模型在某种程度上学会了正确分类。

现在强制执行 one-hot 代码的优先级是使用 softmax使用分类交叉熵激活。这是你应该使用的。

现在问题是使用 softmax在您的情况下,Keras 不支持每个像素上的 softmax。

最简单的方法是使用 Permute 将维度排列为 (n_rows,n_cols,7)图层,然后使用 Reshape 将其整形为 (n_rows*n_cols,7)层。然后你可以添加 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

并将其用作 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))

tf image_dim_ordering使用然后你可以用 Permute 做方法层。

如需更多引用,请查看 here .

关于image-processing - 语义分割 Keras 的交叉熵损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42118821/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com