为什么多类分类失败了sigmoid?

问题描述 投票:1回答:1

使用Sigmoid训练的MNIST失败,而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而失败。有没有细节我不在这里?

deep-learning pytorch loss-function multiclass-classification activation-function
1个回答
0
投票

Sigmoid + crossentropy可用于多标签分类(假设有狗和猫的图片,您希望模型返回“狗和猫”)。当类不相互排斥或样本包含您想要识别的多个对象时,它可以工作。

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

所以,你真的不希望从sigmoid那里获得那种行为。

© www.soinside.com 2019 - 2024. All rights reserved.