我正在训练一个用于二进制分类的图像网络。对输入图像进行归一化,使其像素值在该范围内0,1。此外,权重矩阵是从正态分布初始化的。然而,我最后一次使用sigmoid激活的致密层的输出产生了两个类的非常微小的差异的值。例如:
output for class1- 0.377525 output for class2- 0.377539
类的差异出现在小数点后4位。是否有任何解决方法来确保类1的输出在0到0.5之间,而类2的输出在0.5到1之间。
编辑:这两个案子我都审理过。情况1-具有二元交叉点的密集(1,'sigmoid')情况2-具有二元交叉点的密集(2,'softmax')
对于case1,输出值的差异非常小,如上面的问题所述。因此,我将预测值的平均值作为分类的阈值。这在某种程度上是可行的,但不是永久的解决方案。
对于情况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'])发布于 2021-02-25 16:00:41
您似乎将二进制分类体系结构与2标签多类分类体系结构设置混淆了。
既然你提到了两个类的概率,class1和class2,您已经设置了单标签多类设置。这意味着,您正在尝试预测两个类别的概率,其中一个样本一次只能有一个标签。
在此设置中,可以使用softmax而不是sigmoid。你的损失函数是binary_crossentropy还有。

现在,使用多标签设置和sigmoid激活时,您可以独立地预测样本被class1和class2同时(也称为多标签多类分类)。一旦您更改为softmax如果样本确实属于这两个类别中的一个,并且如果您的模型经过良好的训练并对其预测充满信心(验证与训练结果),您应该会看到概率之间更显着的差异。
发布于 2021-02-25 15:28:11
首先,我想说您提供的信息不足以准确地调试您的问题,因为您没有提供模型和优化器的任何代码。我怀疑标签中可能有错误,我还建议您使用softmax激活函数,而不是sigmoid函数在最后一层,尽管它仍然可以通过您的方法工作,但二进制分类问题必须输出一个单节点,并且损失必须是二进制交叉熵。
如果您想收到准确的解决方案,请提供更多信息。
https://stackoverflow.com/questions/66363630
复制相似问题