使用 Softmax 进行二元分类

标签 binary classification keras softmax sigmoid

我正在使用带有二进制交叉熵的 Sigmoid 激活函数训练一个二进制分类器,它提供了大约 98% 的良好准确度。
当我使用带有 categorical_crossentropy 的 softmax 进行训练时,准确度非常低(< 40%)。
我将 binary_crossentropy 的目标作为 0 和 1 的列表传递,例如; [0,1,1,1,0]。

知道为什么会这样吗?

这是我用于第二个分类器的模型:
enter image description here

最佳答案

现在,您的第二个模型总是回答“Class 0”,因为它只能在一个类(最后一层的输出数量)之间进行选择。

由于您有两个类,您需要在两个输出上计算 softmax + categorical_crossentropy 以选择最可能的一个。

因此,你的最后一层应该是:

model.add(Dense(2, activation='softmax')
model.compile(...)

您的 sigmoid + binary_crossentropy 模型通过仅分析单个输出数字来计算“0 类”为真的概率,它已经是正确的。

编辑 :这里是关于Sigmoid的小说明功能

Sigmoid 可以看作是实数空间和概率空间之间的映射。

Sigmoid Function

请注意:
Sigmoid(-infinity) = 0   
Sigmoid(0) = 0.5   
Sigmoid(+infinity) = 1   

因此,如果您的网络输出的实数非常低,则 sigmoid 将决定“0 类”的概率接近 0,并决定“1 类”
相反,如果你的网络输出非常高,sigmoid 会判定“Class 0”的概率接近1,并判定“Class 0”

它的决定类似于仅通过查看输出的符号来决定 Class。但是,这不会让您的模型学习!事实上,这种二元损失的梯度几乎在任何地方都是空的,这使得您的模型无法从错误中学习,因为它没有被正确量化。

这就是使用 sigmoid 和“binary_crossentropy”的原因:
它们是二元损失的替代品,它具有很好的平滑特性,并且可以学习。

此外,请查找有关 Softmax Function 的更多信息和 Cross Entropy

关于使用 Softmax 进行二元分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45793856/

相关文章:

C++用另一个编辑二进制文件

colors - 计算机如何以不同的方式处理 ascii/文本和图像/颜色?

python - 在多列数据上拟合 MultinomialNB

python - 多标签分类损失函数

php - Varchar值以数值分类

python - iris 上的 keras 的 GridSearchCV 结果不佳

python - Tensorflow 1.14+ 序列化子类 Keras 层?

tensorflow - 没有传递到第一层的 `input_shape` 的顺序模型无法重新加载优化器状态

haskell - 如何在其他机器上运行 ghc 编译的二进制文件?

java - 计算两个给定的具有相同属性的二进制数之间存在多少个具有 X 个 1 位的二进制数