我已经修改了我在Pytorch github上找到的代码帽以适应我的数据,但是我的损失结果很大,每次迭代它们都会变大,后来变成了nan.Code不会给我任何错误,只是也没有丢失结果而且没有预测 . 我有另一个代码处理简单的线性回归,所有工作正常 . 我想我在这里错过了一些简单的东西,但我无法看到它 . 任何帮助,将不胜感激 .
码:
import sklearn.linear_model as lm
from sklearn.preprocessing import PolynomialFeatures
import torch
import torch.autograd
import torch.nn.functional as F
from torch.autograd import Variable
train_data = torch.Tensor([
[40, 6, 4],
[44, 10, 4],
[46, 12, 5],
[48, 14, 7],
[52, 16, 9],
[58, 18, 12],
[60, 22, 14],
[68, 24, 20],
[74, 26, 21],
[80, 32, 24]])
test_data = torch.Tensor([
[6, 4],
[10, 5],
[4, 8]])
x_train = train_data[:,1:3]
y_train = train_data[:,0]
POLY_DEGREE = 3
input_size = 2
output_size = 1
poly = PolynomialFeatures(input_size * POLY_DEGREE, include_bias=False)
x_train_poly = poly.fit_transform(x_train.numpy())
class Model(torch.nn.Module):
def __init__(self):
super(Model, self).__init__()
self.fc = torch.nn.Linear(poly.n_output_features_, output_size)
def forward(self, x):
return self.fc(x)
model = Model()
criterion = torch.nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.001)
losses = []
for i in range(10):
optimizer.zero_grad()
outputs = model(Variable(torch.Tensor(x_train_poly)))
print(outputs)
loss = criterion(outputs, Variable(y_train))
print(loss.data[0])
losses.append(loss.data[0])
loss.backward()
optimizer.step()
if loss.data[0] < 1e-4:
break
print('n_iter', i)
print(loss.data[0])
plt.plot(losses)
plt.show()
输出:
[393494300459008.0,inf,inf,inf,nan,nan,nan,nan,nan,nan] n_iter 9 nan
1 回答
有几件事导致了这个问题 . 改变其中的一些或全部将为您提供合理的结果并使学习成为可能 .
np.max(x_train_poly)
. 当您的权重矩阵被随机初始化时,这会导致初始预测大部分关闭,并且损失很快接近无穷大 . 要抵消这种情况,您可能需要首先标准化您的功能(即为每个功能设置均值0和方差1) . 请注意,在非常深的网络中,使用了类似的想法"Batch Normalization" . 如果您有兴趣,可以在这里阅读更多内容:https://arxiv.org/abs/1502.03167您可以执行以下操作来修复您的示例:请注意,我在第一次线性变换后添加了非线性,因为否则没有多个层的点 .