keras 分类和二元交叉熵

Posted

技术标签:

【中文标题】keras 分类和二元交叉熵【英文标题】:keras categorical and binary crossentropy 【发布时间】:2018-11-03 09:52:15 【问题描述】:

在通过实现一些示例和寻找教程使用 keras 之后,我有点困惑我应该在我的项目中使用哪个交叉熵函数。就我而言,我想使用 LSTM 模型预测在线 cmets 的多个标签,例如(正面、负面和中性)。标签已通过 keras 中的 to_categorical 方法转换为 one-hot 向量,该方法也在 keras 中记录:

(...) 当使用 categorical_crossentropy 损失时,您的目标应该是分类格式(例如,如果您有 10 个类,则每个样本的目标应该是一个 10 维向量,期望为 1在与样本类别对应的索引处)。

one-hot 数组如下所示:

array([[1., 0., 0.],
      [1., 0., 0.],
      [0., 0., 1.],

因为有多个标签,我更喜欢使用 categorical_crossentropy。我也用这个标准实现了一个模型,但是这个模型的准确率只有 20% 以上。将 binary_crossentropy 与 sigmoid 函数一起使用,我的准确率已达到 80%。我真的很困惑,因为有些人与以下statements争论:

使用带有 2 个以上标签的 binary_crossentropy 时,使用 Keras 方法“评估”计算的准确度完全错误

而其他人已经使用二元交叉熵和多个标签实现了high performanced model,这是一种相同的工作流程。

我们想要每个类别的概率。所以我们在最后一层使用 sigmoid,输出范围为 0 到 1。如果我们的目标是找到类,那么我们将使用 softmax

所以我只想知道如果我要选择如下链接中的 binary_crossentropy 来预测结果类是否有任何问题。

【问题讨论】:

categorical_crossentropy 设计为与独占类一起使用,即当每个示例 100% 属于单个类时;它假定输出是一个 softmax 函数,其中类概率加起来为 1。binary_cropssentropy 可以在类不是排他性的情况下工作(例如“这张图片是 dog 但也是 outdoors”),并假设每个类都有从 0 到 1 的独立概率(因此是 sigmoid)。如果你的类之间的障碍不是超级明确的(例如,一个例子可以是“中性积极的”),使用二进制可能是有意义的,但这取决于问题。 【参考方案1】:

您混淆了 multilabelmulticlass 分类。

multiclass中,您的分类器从其他 N 个类中选择一个类。通常,进行多类分类的神经网络的最后一层是 softmax 层。这意味着每个输出行的总和为 1(它形成了这 N 个类别的概率分布)。

另一方面,

多标签分类包括对 N 个问题进行二元选择。为此使用二进制交叉熵是有意义的,因为大多数神经网络框架的工作方式使其表现得就像您在这些二进制任务上计算 average 二进制交叉熵一样。在作为多标签分类器的神经网络中,sigmoid 用作最后一层(您链接的 Kaggle 内核使用 sigmoid 作为最后一层的激活)。

【讨论】:

以上是关于keras 分类和二元交叉熵的主要内容,如果未能解决你的问题,请参考以下文章

Keras 和 TensorFlow 中所有这些交叉熵损失之间有啥区别?

使用 Keras 稀疏分类交叉熵进行像素级多类分类

自定义 keras 损失函数二元交叉熵给出不正确的结果

交叉熵损失和后勤损失之间有什么区别吗?

如何在 keras 中创建自定义损失函数? (自定义加权二元交叉熵)

二元交叉熵惩罚 one-hot 向量的所有分量