如何在 Keras 的 FCN(U-Net)上使用加权分类交叉熵?

Posted

技术标签:

【中文标题】如何在 Keras 的 FCN(U-Net)上使用加权分类交叉熵?【英文标题】:How to use weighted categorical crossentropy on FCN (U-Net) in Keras? 【发布时间】:2017-10-13 13:29:11 【问题描述】:

我已经建立了一个用于图像分割 (U-Net) 的 Keras 模型。然而,在我的样本中,一些错误分类(区域)并不那么重要,而另一些则至关重要,因此我想为它们分配更高的损失函数权重。更复杂的是,我希望一些错误分类(1 类而不是 2 类)具有非常高的惩罚,而反向(2 类而不是 1 类)不应该受到太多惩罚。

在我看来,我需要使用加权分类交叉熵的总和(跨越所有像素),但我能找到的最好的是this:

def w_categorical_crossentropy(y_true, y_pred, weights):
    nb_cl = len(weights)
    final_mask = K.zeros_like(y_pred[:, 0])
    y_pred_max = K.max(y_pred, axis=1)
    y_pred_max = K.reshape(y_pred_max, (K.shape(y_pred)[0], 1))
    y_pred_max_mat = K.cast(K.equal(y_pred, y_pred_max), K.floatx())
    for c_p, c_t in product(range(nb_cl), range(nb_cl)):
        final_mask += (weights[c_t, c_p] * y_pred_max_mat[:, c_p] * y_true[:, c_t])
    return K.categorical_crossentropy(y_pred, y_true) * final_mask

但是,此代码仅适用于单个预测,并且我对 Keras 内部工作原理的了解不足(而且它的数学方面也好不了多少)。任何人都知道我可以如何调整它,甚至更好,是否有适合我情况的现成损失函数?

我将不胜感激。

编辑:我的问题类似于How to do point-wise categorical crossentropy loss in Keras?,除了我想使用加权分类交叉熵。

【问题讨论】:

【参考方案1】:

您可以使用权重图(如U-Net paper 中所建议的那样)。在这些权重图中,您可以对权重较大或较轻的区域进行加权。这是一些伪代码:

loss = compute_categorical_crossentropy()
weighted_loss = loss * weight_map # using element-wise multiplication

【讨论】:

我也在做与原始海报类似的事情,但使用二元交叉熵。我假设同样的伪代码适用?

以上是关于如何在 Keras 的 FCN(U-Net)上使用加权分类交叉熵?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 keras 中正确使用 U-net 批量标准化?

深度学习语义分割网络介绍对比-FCN,SegNet,U-net DeconvNet

Keras深度学习实战(17)——使用U-Net架构进行图像分割

Tensorflow (Keras) U-Net 分割训练失败

语义分割(semantic segmentation) 常用神经网络介绍对比-FCN SegNet U-net DeconvNet,语义分割,简单来说就是给定一张图片,对图片中的每一个像素点进行分类;

在构建和训练 3D Keras U-NET 时遇到 ValueError