为什么多类分类因乙状结肠而失败?

时间:2019-04-01 20:40:32

标签: deep-learning pytorch loss-function multiclass-classification activation-function

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

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

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

当我将softmax作为最后一层的激活时,它的效果很好。 但是当我改用乙状结肠时,我发现事情分崩离析

这是我的网络代码

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训练失败的原因。 我有什么要注意的吗?

1 个答案:

答案 0 :(得分:0)

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

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

因此,您真的不能指望从S型产生这种行为。