【问题标题】:Binary classification with Softmax使用 Softmax 进行二进制分类
【发布时间】:2018-01-29 08:04:33
【问题描述】:

我正在使用具有二元交叉熵的 Sigmoid 激活函数训练二元分类器,该函数的准确率约为 98%。
当我使用带有 categorical_crossentropy 的 softmax 进行训练时,同样会得到非常低的准确度( 我将 binary_crossentropy 的目标作为 0 和 1 的列表传递,例如; [0,1,1,1,0]。

知道为什么会这样吗?

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

【问题讨论】:

  • 您能告诉我们您使用的代码吗?也许答案隐藏在您的描述中。我的猜测是你的第二个分类器中正式有超过 2 个类,因为 40% 的准确率甚至比随机二元分类器更差。

标签: binary classification keras softmax sigmoid


【解决方案1】:

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

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

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

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

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

编辑:这里是关于Sigmoid函数的小解释

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

注意:

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 FunctionCross Entropy 的更多信息

【讨论】:

  • 我现在明白其中的逻辑了。但是 sigmoid 是如何只使用一个输出的呢?
  • @AKSHAYAAVAIDYANATHAN 我刚刚编辑了我的帖子,希望对您有所帮助!
  • 而且我还意识到输出应该采用格式-> [[0,1], [1,0]] 用于分类交叉熵,而不仅仅是 1 和 0 的列表
猜你喜欢
  • 2021-05-09
  • 1970-01-01
  • 2021-06-30
  • 2017-07-25
  • 2017-06-02
  • 2019-10-13
  • 2021-01-31
  • 2020-11-15
  • 2018-03-24
相关资源
最近更新 更多