使用 Softmax 进行二元分类

Binary classification with Softmax

我正在使用带二元交叉熵的 Sigmoid 激活函数训练一个二元分类器,准确率在 98% 左右。
当我使用带有 categorical_crossentropy 的 softmax 进行训练时,同样给出了非常低的准确度(< 40%)。
我将 binary_crossentropy 的目标作为 0 和 1 的列表传递,例如; [0,1,1,1,0]。

知道为什么会这样吗?

这是我用于第二个分类器的模型:

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

因为你有两个 classes,你需要在两个输出上计算 softmax + categorical_crossentropy 以选择最可能的一个。

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

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

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

编辑:这里是关于Sigmoid函数

的一个小解释

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

注意:

Sigmoid(-infinity) = 0   
Sigmoid(0) = 0.5   
Sigmoid(+infinity) = 1   

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

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

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

此外,请查找有关 Softmax Function and Cross Entropy

的更多信息