FutureWarning: Non"/>
(完全解决)FutureWarning: Non
开门见山。检查一下你的loss是否为nan。
如果是的话,检查你loss的计算公式。一定要使用那种饱和类型的损失,例如你希望模型二分类,loss不应该设置为,对于类别1,希望模型输出为正无穷大,对于类别0,希望模型输出为负无穷大,这样loss不会饱和,模型会一直训练下去,很容易nan。应该改为,对模型输出的结果,加一层sigmoid,从而对于类别1,希望模型输出为1,对于类别0,模型输出为0。而对于sigmoid这种饱和函数,输出为1,输入不需要是正无穷大,6,7,8这种数字就可以差不多输出为1了。
我这边的情况是,也同样是犯了一个错误,对于负样本,希望模型输出为0,结果我又用了log输出来作为损失的方式。这就导致,在输出可以做到为0的情况下,我log之后就会nan。改为:
下面这个不好,
neg_outputs=model(x)#这个数大于等于0
loss=torch.log(neg_outputs)
改为下面这个:
neg_outputs=model(x)
loss=torch.log(neg_outputs+1e-8)
这样,损失就会饱和,因为neg_outputs最小就是1e-8。
回到,标题错误,标题说的其实是梯度nan,但是我本文都在说损失,因为极大可能就是损失的原因。
更多推荐
(完全解决)FutureWarning: Non
发布评论