我正在使用Sigmoid激活函数和二进制交叉熵训练二元分类器,其准确率高达98%左右。
当我使用带有categorical_crossentropy的softmax进行训练时,精度非常低(<40%)。
我将binary_crossentropy的目标作为0和1的列表传递,例如; [0,1,1,1,0]。
知道为什么会这样吗?
答案 0 :(得分:14)
现在,你的第二个模型总能回答&#34; 0级和34级;因为它只能在一个类别(最后一层的输出数量)之间进行选择。
由于你有两个类,你需要在两个输出上计算softmax + categorical_crossentropy以选择最可能的一个。
因此,您的最后一层应为:
model.add(Dense(2, activation='softmax')
model.compile(...)
你的sigmoid + binary_crossentropy模型,它计算&#34; Class 0&#34;的概率。通过分析单个输出数字为真,已经是正确的。
编辑:以下是关于Sigmoid功能的小解释
Sigmoid可以被视为实数空间和概率空间之间的映射。
请注意:
Sigmoid(-infinity) = 0
Sigmoid(0) = 0.5
Sigmoid(+infinity) = 1
因此,如果网络的实数,输出非常低,则sigmoid将决定&#34; Class 0&#34;接近0,并决定&#34; Class 1&#34;
相反,如果你的网络输出非常高,那么sigmoid将决定&#34; Class 0&#34;接近1,并决定&#34; 0级和#34;
它的决定类似于仅通过查看输出的符号来决定类。但是,这不允许您的模型学习!实际上,这种二进制损失的梯度几乎无处不在,使得模型无法从错误中学习,因为它没有被正确量化。
这就是为什么sigmoid和&#34; binary_crossentropy&#34;使用:
它们是二进制损失的替代品,它具有良好的平滑特性,并且可以实现学习。
另外,请找到有关Softmax Function和Cross Entropy
的更多信息