Pytorch 应用任何优化都会导致值为NaN

Pytorch 应用任何优化都会导致值为NaN,pytorch,Pytorch,我正在为此数据集开发分类器模型: 我在pytorch中提出了以下代码: import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim from sklearn import preprocessing from sklearn.model_selection import train_test_split import pandas as pd import numpy

我正在为此数据集开发分类器模型: 我在pytorch中提出了以下代码:

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from sklearn import preprocessing
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np


ILPDataset = pd.read_csv('preprocessed-ilpd.csv')
ILPDataset["Age"] = pd.to_numeric(ILPDataset["Age"])
LabelEncoder = preprocessing.LabelEncoder()
LabelEncoder.fit(ILPDataset["Gender"])
ILPDataset["Gender"] = LabelEncoder.transform(ILPDataset["Gender"])
print(ILPDataset["Gender"].describe())
ILPDataset["AAP"] = preprocessing.scale(ILPDataset["AAP"])
ILPDataset["SgAlAm"] = preprocessing.scale(ILPDataset["SgAlAm"])
ILPDataset["SgApAm"] = preprocessing.scale(ILPDataset["SgApAm"])
Features = ["Age","Gender","TB","DB","AAP","SgAlAm","SgApAm","TP","ALB","A/G"]
ILPDFeatures = ILPDataset[Features]
ILPDTarget = ILPDataset["Selector"]

X_Train, X_Test, Y_Train, Y_Test = train_test_split(ILPDFeatures,ILPDTarget,test_size=0.2,random_state=0)

print(X_Train.shape)
print(Y_Train.shape)
print(X_Test.shape)
print(Y_Test.shape)
torch.set_default_tensor_type(torch.DoubleTensor)
TrainX = torch.from_numpy(X_Train.values).double()
TestX = torch.from_numpy(X_Test.values).double()


TrainY = torch.from_numpy(Y_Train.values).long().view(1,-1)[0]
TestY = torch.from_numpy(Y_Test.values).long().view(1,-1)[0]
TrainY.reshape(TrainY.shape[0],1)
TestY.reshape(TestY.shape[0],1)
print(X_Train.shape[1])
input_layers = X_Train.shape[1]
output_layers = 2
hidden = 100

class Net(nn.Module):
    def __init__(self):
        super(Net,self).__init__()
        self.fc1 = nn.Linear(input_layers,hidden)
        self.fc2 = nn.Linear(hidden,hidden)
        self.fc3 = nn.Linear(hidden,output_layers)

    def forward(self,x):
        x = torch.sigmoid(self.fc1(x))
        x = torch.sigmoid(self.fc2(x))
        x = self.fc3(x)
        return F.softmax(x,dim=-1)

model = Net()
optimizer = torch.optim.SGD(model.parameters(),lr = 0.0001,momentum = 0.9)
loss_fn = nn.NLLLoss()
epochs_data = []
epochs = 601
print(TrainX.shape)
print(TestY.shape)
for epoch in range(1,3):
    optimizer.zero_grad()
    Ypred = model(TrainX)
    loss = loss_fn(Ypred,TrainY)
    loss.backward()
    optimizer.step()
    print(Ypred)
    if epoch%100==0:
        print("Epoch - %d, (%d%%) "%(epoch,epoch/epochs*100))

YPred_Test = model(TestX)
Loss_Test = loss_fn(YPred_Test,TestY)
print(Loss_Test.item())
print(YPred_Test)
print(YPred_Test)
print(TestY)

我使用了不同的优化程序,具有不同的LRs和动量,但在loss.backward()之后应用每一个优化程序时,它会将张量中的值转换为NaN。我在SO上查找了不同的答案,但即使尝试了这些答案,我也无法解决该错误。

问题在于,您使用的是
softmax
nlloss
,这两个选项不能一起工作。on
softmax
状态为:

此模块不直接与NLLLoss一起工作,NLLLoss需要日志 在Softmax和自身之间进行计算。改用LogSoftmax (速度更快,数值特性更好)

使用
NLLLoss
在最后一层中使用
log\u softmax
,如下所示:

def forward(self,x):
    ...
    return F.log_softmax(x,dim=-1)
...
loss_fn = nn.NLLLoss()

问题是,您正在将
softmax
NLLLoss
一起使用,这两种方法无法协同工作。on
softmax
状态为:

此模块不直接与NLLLoss一起工作,NLLLoss需要日志 在Softmax和自身之间进行计算。改用LogSoftmax (速度更快,数值特性更好)

使用
NLLLoss
在最后一层中使用
log\u softmax
,如下所示:

def forward(self,x):
    ...
    return F.log_softmax(x,dim=-1)
...
loss_fn = nn.NLLLoss()

该问题是由于未规范化数据集中的每一列造成的。我不知道为什么,但是规范化列可以解决这个问题。

这个问题是由于没有规范化数据集中的每一列造成的。我不知道为什么,但是规范化列可以解决这个问题。

不起作用,我尝试过log_softmax,但它仍然给我NaN。只有在不使用任何优化器的情况下,NAN才会消失。我不知道为什么。@Moth我想问题可能在于数据集中的值。尝试来自的建议不起作用,我已经尝试了log_softmax,但它仍然给我NaN。只有在不使用任何优化器的情况下,NAN才会消失。我不知道为什么。@Moth我想问题可能在于数据集中的值。尝试一下你的建议实际上你发现规范化是训练前最重要的事情之一,如果不是,那么肯定是训练前最重要的事情之一。你实际上发现规范化是,如果不是,那么肯定是训练前最重要的事情之一。