使用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而失败。有没有细节我不在这里?
Sigmoid + crossentropy可用于多标签分类(假设有狗和猫的图片,您希望模型返回“狗和猫”)。当类不相互排斥或样本包含您想要识别的多个对象时,它可以工作。
在您的情况下,MNIST具有互斥类,并且在每个图像中只有一个数字,因此最好使用logsoftmax +负对数似然,假设这些类是互斥的,并且只有一个与图像关联的正确标签。
所以,你真的不希望从sigmoid那里获得那种行为。