深度学习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呢?

你可能感兴趣的:(深度学习,人工智能)