0. 问题描述
做多分类任务时,使用了paddle的CrossEntropyLoss损失函数,但是在训练时,计算出的loss一直不变,如下图:
1. 解决
实际上很有可能你在定义网络模型时的最后一层输出层,加上了nn.Softmax(),只要将这个层注释掉,loss就可以正常下降了
2. 原因
CrossEntropyLoss:该OP计算输入input和标签label间的交叉熵损失 ,它结合了 LogSoftmax 和 NLLLoss 的OP计算,可用于训练一个 n 类分类器。
原因在于CrossEntropyLoss函数实际上内置了LogSoftmax 和 NLLLoss,也就是你一旦使用CrossEntropyLoss,在计算预测值和标签值时就会自动帮你将预测值给LogSoftmax 和 NLLLoss。
但当我们再在模型里最后一层加上Softmax,那就相当于输出值在模型里推理时,被Softmax一遍,当使用输出计算loss又被LogSoftmax 和 NLLLoss一遍,此时计算的loss就很小很小,导致没有梯度,故出现训练没用的效果。
3. 一些其他的原因
这些不是我遇到的,只是记录一下万一遇到了呢?
【黄埔学院】自定义loss函数,训练网络权值不更新 #28685