使用torch.nn.CrossEntropyLoss时是否必须在def forward中添加softmax

问题描述

https://pytorch.org/docs/stable/generated/torch.nn.CrossEntropyLoss.html

当我阅读以上内容时,我了解到torch.nn.CrossEntropy已经计算出最后一层的exp得分。因此,我认为前向功能不必包含softmax。例如, 返回self.fc(x)而不是返回nn.softmax(self.fc(x))。但是,我很困惑,因为我已经看到了几种同时使用这两种方式的ConvNet分类器实现(它们在返回或不返回softmax的情况下都使用交叉熵损失)。

此问题会影响分类器的性能吗?哪种方法正确?

解决方法

JHPark,

您是正确的-使用torch.nn.CrossEntropyLoss不需要包含softmax图层。如果确实包含softmax,则它仍将导致正确的分类结果,因为softmax不会更改哪个元素的得分最高。但是,如果应用两次,它可能会使输出的相对水平失真,从而使梯度减弱,并可能会减慢训练速度。