Model返回Nan值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Model返回Nan值相关的知识,希望对你有一定的参考价值。

我试图构建一个具有4个输入节点/功能和一个输出功能(0/1)的神经网络。我编写了这段代码并运行但是在训练模型时返回NaN。我调试了,权重和偏差都很好,直到他们通过模型。

从我到目前为止的搜索结果来看,这可能是我传递数据的方式的问题。我的输入数据是:tensor([[0.0000e+00, 0.0000e+00, 0.0000e+00, 1.5340e+00], [1.5000e+01, 1.0000e-01, 2.4210e+00, 3.0000e+01], [3.0000e+00, 2.2000e-01, 2.2000e-01, 4.5000e+01], ..., [1.0000e+00, 2.0000e-02, 2.0000e-02, 1.5000e+01], [6.0000e+00, 2.0000e-01, 2.0000e-01, 1.5000e+01], [1.7000e+01, 5.2400e-01, 5.2400e-01, 2.0000e+00]], dtype=torch.float64)

import torch
from torchvision import datasets, transforms
import pandas as pd
import numpy as np
from torch.autograd import Variable
# Import tensor dataset & data loader
from torch.utils.data import TensorDataset, DataLoader
from torch import nn, optim
import torch.nn.functional as F

file = pd.read_csv('ks-projects-201801.csv')
array = np.array(file.values)
result = np.empty(len(array))
input_data = np.empty((len(array), 4))
for i in range(len(array)):
    input_data[i] = np.array([array[i][10], array[i][12]/1000, array[i][13]/1000, array[i][14]/1000])
    if array[i][9] == 'successful':
        result[i] = 1
    else:
        result[i] = 0


input_node = Variable(torch.from_numpy(input_data))
output = torch.from_numpy(result)
print(input_node)
print(output)

train_ds = TensorDataset(input_node.squeeze(), output.squeeze())

batch_size = 5
train_dl = DataLoader(train_ds, batch_size, shuffle=True)

这是实际的模型和培训

model = nn.Linear(4, 1)
print(model.weight)
print(model.bias)
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.003)

epochs = 5
model = model.double()
for e in range(epochs):
    running_loss = 0
    for xb, yb in train_dl:
        optimizer.zero_grad()
        res = model(xb)
        loss = criterion(res, yb)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
    else:
        print(f"model : {loss}")

这打印出模型:每个时期的nan并终止。我对pytorch很新,我不知道如何处理这个问题。

答案

如果你看到NaN的损失尝试渐变裁剪和数据规范化。归一化数据是必须的(即归一化输入数据,使得均值= 0和方差= 1)

以上是关于Model返回Nan值的主要内容,如果未能解决你的问题,请参考以下文章

LSTM 网络损失为 nan,对于大于 1 的批大小

为啥“valueAsNumber”返回 NaN 作为值?

scipy.pdist() 返回 NaN 值

Pandas 映射将所有值返回为 NaN [重复]

Tensorflow 强化学习 RNN 在使用 GradientTape 优化后返回 NaN

我试图在单击和返回 NaN 时增加一个值 [重复]