paddle:使用CrossEntropyLoss作为loss,训练时loss不下降?

0. 问题描述

做多分类任务时,使用了paddle的CrossEntropyLoss损失函数,但是在训练时,计算出的loss一直不变,如下图:
paddle:使用CrossEntropyLoss作为loss,训练时loss不下降?_第1张图片

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

你可能感兴趣的:(paddlepaddle,Debug专栏,paddle,paddlepaddle,深度学习)