受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训练失败的原因。 我有什么要注意的吗?答案 0 :(得分:0)
Sigmoid +交叉熵可用于多标签分类(假设有只猫和狗的图片,您希望模型返回“猫和狗”)。当类不是相互排斥的,或者样本包含多个您要识别的对象时,它可以工作。
在您的情况下,MNIST具有互斥类,并且在每张图像中只有一个数字,因此最好使用logsoftmax +负对数似然,假设这些类是互斥的,并且只有一个正确的标签与图片。
因此,您真的不能指望从S型产生这种行为。