缩放 sigmoid 输出

Scaling the sigmoid output

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

output for class1- 0.377525 output for class2- 0.377539

classes 的区别在小数点后 4 位。是否有任何解决方法来确保 class 1 的输出落在 0 到 0.5 左右,而 class 2 的输出落在 0.5 到 1.

之间

编辑:

两种情况我都试过了。

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

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

对于情况 2 - 预测仅过拟合 class。

示例代码:-

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 函数,尽管它仍然可以通过你的方法工作,二元分类问题必须输出一个节点,损失必须是二元交叉熵。

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

您似乎混淆了二进制 class化架构与 2 标签多class class化架构设置。

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

在这个设置中,使用softmax而不是sigmoid是合适的。您的损失函数也将是 binary_crossentropy

现在,通过多标签设置和 sigmoid 激活,您可以独立预测样本同时为 class1class2 的概率(也称为多标签多class class化).

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