通过实现一些示例和寻找教程来使用keras后,我有点困惑我应该在我的项目中使用哪种交叉熵函数。在我的情况下,我想用LSTM模型预测多个标签,如(正面,负面和中性)在线评论。使用keras中的 to_categorical 方法将标签转换为单热矢量,这也记录在keras中:
(...)当使用categorical_crossentropy损失时,你的目标应该是分类格式(例如,如果你有10个类,每个样本的目标应该是一个10维向量,全0期望为1在对应于样本类的索引处。)
单热阵列如下:
array([[1., 0., 0.],
[1., 0., 0.],
[0., 0., 1.],
因为有多个标签我更喜欢使用 categorical_crossentropy 。我还用这个标准实现了一个模型,但这个模型的准确率只有20%以上。使用带有sigmoid函数的 binary_crossentropy ,我的准确率已达到80%。我真的很困惑,因为有些人争论以下statements:
使用带有2个以上标签的binary_crossentropy时,使用Keras方法“evaluate”计算的准确度是完全错误的
而其他已经实现了high performanced model二进制交叉熵和多个标签,这是一种相同的工作流程。
我们想要每个班级的概率。所以我们在最后一层使用sigmoid,它给出了0到1范围内的输出。如果我们的目的是找到类,那么我们将使用softmax
所以我只想知道是否有任何问题,如果我想选择binary_crossentropy,就像在下面的链接中预测结果类一样。
答案 0 :(得分:1)
您混淆了多标记和多类分类。
在多类中,您的分类器会从N个其他类中选择一个类。通常,进行多类分类的神经网络中的最后一层是softmax层。这意味着每个输出行总和为1(它形成了这N个类的概率分布)。
另一方面,多标签分类包括为N个问题做出二元选择。因此,使用二进制交叉熵是有意义的,因为大多数神经网络框架的工作方式使其表现得像在这些二进制任务上计算平均二进制交叉熵。在作为多标记分类器的神经网络中,sigmoid用作最后一层(您链接的Kaggle内核使用sigmoid作为最后一层中的激活)。