微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

缩放 sigmoid 输出

如何解决缩放 sigmoid 输出

我正在训练一个用于二进制分类的图像网络。输入图像被归一化为具有范围 [0,1] 内的像素值。此外,权重矩阵从正态分布初始化。然而,我最后一个带有 sigmoid 激活的 Dense 层的输出为两个类产生了非常微小的差异。例如 -

output for class1- 0.377525 output for class2- 0.377539

类的差异在小数点后 4 位后出现。是否有任何解决方法可以确保第 1 类的输出介于 0 到 0.5 之间,而对于第 2 类,它的输出介于 0.5 到 1 之间。

编辑:

这两种情况我都试过了。

案例 1 - 具有二元交叉熵的 Dense(1,'sigmoid') 案例 2- Dense(2,'softmax') 与二元交叉熵

对于案例 1,输出值的差异非常小,如上述问题中所述。因此,我将预测值的平均值作为分类阈值。这在一定程度上有效,但不是永久解决方案。

对于案例 2 - 预测仅过拟合到一类。

示例代码:-

inputs = Input(shape = (128,156,1))
x = Conv2D(.....)(inputs)
x = Batchnormalization()(x)
x = Maxpooling2D()(x)
...
.
.
flat=Flatten()(x)

out = Dense(1,'sigmoid')(x)
model = Model(inputs,out)
model.compile(optimizer='adamax',loss='binary_crossentropy',metrics=['binary_accuracy'])

解决方法

首先,我想说您提供的信息不足以准确调试您的问题,因为您没有提供模型和优化器的任何代码。我怀疑标签中可能有错误,我还建议您在最后一层使用 softmax 激活函数而不是 sigmoid 函数,尽管它仍然可以通过您的方法,二进制分类问题必须输出一个单节点,损失必须是二元交叉熵。

如果您想获得准确的解决方案,请提供更多信息。

,

您似乎将二元分类架构与 2 标签多类分类架构设置混淆了。

既然您提到了 class1class2 这 2 个类的概率,那么您已经设置了单标签多类设置。这意味着,您正在尝试预测 2 个类别的概率,其中一个样本一次只能有一个标签。

在此设置中,使用 softmax 而不是 sigmoid 是正确的。您的损失函数也是 binary_crossentropy

enter image description here

现在,通过多标签设置和 sigmoid 激活,您可以独立预测样本同时为 class1class2(也就是多标签多类分类)。

更改为 softmax 后,如果样本确实确实属于 2 个类别之一,并且您的模型训练有素且对其预测充满信心(验证与训练结果),则您应该会看到概率之间的更显着差异)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。