PyTorch中的CrossEntropyLoss已经使用Softmax实现:
https://pytorch.org/docs/stable/nn.html#torch.nn.CrossEntropyLoss
该标准将nn.LogSoftmax()和nn.NLLLoss()组合在一个单独的类中。
的 编辑 强> : 答案的第二部分答案有点复杂。导致准确性降低的原因可能有多种。从理论上讲,由于您添加的softmax图层可以以合理的精度预测正确答案,因此下一层应该能够通过保留最后两层之间的最大值来保持最大值。尽管softmax再次对这些有界输出(在0和1之间)进行归一化,但它可能会改变分布的方式,但仍然可以保留最大值,从而保留预测的类别。
然而,在实践中,事情有点不同。当您在输出层中具有双softmax时,您基本上会更改输出函数,以便更改传播到网络的渐变。具有交叉熵的softmax由于其产生的梯度而是优选的损耗函数。您可以通过计算成本函数的梯度来证明自己,并考虑每个“激活”(softmax)在0和1之间的范围。附加的softmax“在”原始的“后面”只是将梯度与值相乘在0和1之间,从而减少了价值。这会影响权重的更新。也许它可以通过改变学习率来修复,但强烈建议不要这样做。只需要一个softmax就可以了。 看到 迈克尔尼尔森的书,第3章 对此有更深刻的解释。