深度学习loss变为nan的问题
·
在网上查了一些资料,但是这个情况和网上都不太一样。前100epoch能正常训练,loss缓慢下降,精度缓慢增大,但是突然loss就Nan了,我想应该不是样本问题也不是梯度爆炸或者loss中有除0吧,毕竟都训练了100epoch了
最终发现问题:
之前代码为:
predict = torch.log(torch.softmax(result, dim=-1))
损失函数为:
torch.nn.NLLLOSS
更改后
#predict = torch.log(torch.softmax(result, dim=-1))
直接删去softmax和log而损失函数改为:
criterion= nn.CrossEntropyLoss()
nan消失
网上查阅nn.CrossEntropyLoss()的实现为:
import torch.nn as nn
m = nn.LogSoftmax()
loss = nn.NLLLoss()
# input is of size nBatch x nClasses = 3 x 5
input = autograd.Variable(torch.randn(3, 5), requires_grad=True)
# each element in target has to have 0 <= value < nclasses
target = autograd.Variable(torch.LongTensor([1, 0, 4]))
output = loss(m(input), target)
其实直接使用pytorch中的loss_func=nn.CrossEntropyLoss()计算得到的结果与softmax-log-NLLLoss计算得到的结果是一致的。那原因主要在nn.LogSoftmax()上了。直接使用nn.LogSoftmax()和分开写:torch.log(torch.softmax(result, dim=-1))有什么不一样吗?为什么torch.log(torch.softmax(result, dim=-1))这样写会在训练过程中产生nan呢?
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)