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