【问题标题】:Scaling the sigmoid output缩放 sigmoid 输出
【发布时间】:2021-05-27 12:35:21
【问题描述】:

我正在训练一个用于二进制分类的图像网络。输入图像被归一化以具有范围 [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')

对于 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'])

【问题讨论】:

  • 你的输出是Dense(2, activation='sigmoid')还是Dense(1, activation='sigmoid')
  • 我已经编辑了这个问题。你提到的这两种方法我都试过了

标签: tensorflow keras classification sigmoid


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    在此设置中,使用softmax 代替sigmoid 是正确的。你的损失函数也是binary_crossentropy

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

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

    【讨论】:

      猜你喜欢
      • 2021-04-25
      • 1970-01-01
      • 1970-01-01
      • 2014-07-19
      • 2014-03-26
      • 2019-08-23
      • 2015-02-08
      • 1970-01-01
      • 2017-05-15
      相关资源
      最近更新 更多