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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是一个对称矩阵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值