使用Softmax的二元分类

18
我正在使用Sigmoid激活函数和二元交叉熵训练二元分类器,可以获得约98%的良好准确性。但是,当我使用softmax和分类交叉熵进行训练时,准确率很低(<40%)。我将二元交叉熵的目标传递为0和1的列表,例如[0,1,1,1,0]。
有任何想法,为什么会出现这种情况?
这是我用于第二个分类器的模型: enter image description here

2
请问您能否给我们展示一下您所使用的代码?也许答案就隐藏在您的描述中。我猜测您的第二个分类器中可能有超过2个官方类别,因为40%的准确率甚至比随机二元分类器还要差。 - Yohan Grember
1个回答

36

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

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

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

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

你的sigmoid + binary_crossentropy模型已经正确,它通过分析单个输出数字计算"Class 0"为真的概率。
编辑:以下是关于Sigmoid函数的简要说明
Sigmoid可以被认为是实数空间和概率空间之间的映射。

Sigmoid Function

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

如果你的网络的实数输出非常低,sigmoid函数将决定“类0”的概率接近于0,并决定“类1”;相反,如果你的网络输出非常高,sigmoid函数将决定“类0”的概率接近于1,并决定“类0”。它的决策类似于仅通过查看输出的符号来决定类别。然而,这样做不会让你的模型学习!事实上,这个二元损失的梯度几乎在任何地方都是零,使得模型无法从错误中学习,因为错误没有被适当地量化。这就是为什么要使用sigmoid和“binary_crossentropy”的原因:它们是二元损失的替代品,具有良好的平滑特性,并且可以实现学习。此外,请查找更多关于Softmax FunctionCross Entropy的信息。

我现在理解了逻辑。但是sigmoid如何只使用一个输出? - AKSHAYAA VAIDYANATHAN
1
@AKSHAYAAVAIDYANATHAN 我刚刚编辑了我的帖子,希望这可以帮到你! - Yohan Grember
1
我也意识到,对于分类交叉熵,输出应该采用[[0,1],[1,0]]格式,而不仅仅是1和0的列表。 - AKSHAYAA VAIDYANATHAN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接