keras分类和二元交叉熵

在通过实现一些示例并查找教程使用keras后,我对在我的项目中应该使用哪种交叉熵函数感到有些困惑。在我的案例中,我想使用LSTM模型预测在线评论的多个标签,如(正面、负面和中立)。这些标签已使用keras中的to_categorical方法转换为独热向量,这在keras中也有文档说明:

(…) 当使用categorical_crossentropy损失函数时,您的目标应为分类格式(例如,如果您有10个类别,则每个样本的目标应为一个10维向量,除了对应样本类的索引位置为1外,其他位置均为0)。

独热数组如下所示:

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

因为有多个标签,我更倾向于使用categorical_crossentropy。我还根据这一标准实现了一个模型,但该模型的准确率仅为20%以上。使用带有sigmoid函数的binary_crossentropy,我的准确率达到了80%。我真的很困惑,因为有些人用以下声明进行了争论:

当使用binary_crossentropy处理超过2个标签时,Keras方法”evaluate”计算的准确率完全是错误的

而其他人已经实现了使用binary crossentropy和多个标签的高性能模型,这与工作流程有点相似。

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

所以我只想知道,如果我像以下链接中那样选择binary_crossentropy来预测结果类别,是否会有什么问题。


回答:

您混淆了多标签多类别分类。

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

另一方面,多标签分类包括对N个问题做出二元选择。对于这种情况,使用二元交叉熵是有意义的,因为大多数神经网络框架的工作方式使其表现得像是在这些二元任务上计算平均二元交叉熵。在作为多标签分类器的神经网络中,sigmoid被用作最后一层(您链接的Kaggle内核在最后一层使用sigmoid作为激活函数)。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注