为什么多类分类在 sigmoid 中失败



MNIST 用 Sigmoid 训练失败,而 Softmax 工作正常

正在尝试研究不同的激活如何影响最终结果,因此我使用 PyTorch 为 MNIST 实现了一个简单的网络。

我正在使用NLLLoss(负对数似然(,因为它在与softmax一起使用时实现了交叉熵损失。

当我将softmax作为最后一层的激活时,它工作得很好。但是当我改用sigmoid时,我注意到事情分崩离析了。

这是我的网络代码

def forward(self, x):
        x = F.relu(F.max_pool2d(self.conv1(x), 2))
        x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))
        x = x.view(-1, 80)
        x = F.relu(self.fc1(x))
        x = F.dropout(x, training=self.training)
        x = self.fc2(x)
        return F.XXXX(x)

其中 XXXX 是激活函数

Sigmoid 和 Softmax 的输出值都介于 (0, 1( 之间。是的,Softmax 保证 1 的总和,但我不确定这是否回答了为什么使用 Sigmoid 训练失败。有什么细节我没有在这里捕捉到吗?

Sigmoid + 交叉熵可用于多标签分类(假设一张有狗和猫的图片,您希望模型返回"狗和猫"(。当类不互斥或示例包含要识别的多个对象时,它有效。

在您的情况下,MNIST 具有互斥类,并且每个图像中只有一个数字,因此最好使用 logsoftmax + 负对数似然,它假设这些类是互斥的,并且只有一个正确的标签与图像相关联。

所以,你不能真的期望从sigmoid中获得这种行为。

相关内容

  • 没有找到相关文章

最新更新