我在Pytorch中无法运行任何神经网络,我做错了什么?
我在处理数据方面有一定的经验,掌握了python的基本技能,知道怎么使用不同的模型,但我之前从来没有尝试过神经网络。
所以我对pytorch还是很陌生,决定通过网上的教程和视频来学习。
不幸的是,我发现我真的无法让这些模型正常工作,得到的结果完全错误。无论我跟随哪个指南,这种情况都发生,所以肯定是我哪里做错了。
举个例子,我跟着这个逐步指南,学习如何使用波士顿房价数据集来创建一个回归神经网络。
这是我基本上从指南中复制过来的代码,所以应该没有什么区别。
import torch
from torch import nn
from torch.utils.data import DataLoader
from sklearn.preprocessing import StandardScaler
import pandas as pd
### importing the dataset
boston = pd.read_csv('./housing.csv', header=None, sep='\s+')
boston.columns = [
'CRIM',
'ZN',
'INDUS',
'CHAS',
'NOX',
'RM',
'AGE',
'DIS',
'RAD',
'TAX',
'PTRATIO',
'B',
'LSTAT',
'MEDV'
]
xcol = boston.drop(columns=['MEDV']).columns
ycol = ['MEDV']
X = boston[xcol].values
y = boston[ycol].values
### Creating the Torch Dataset
class TorchDataset(torch.utils.data.Dataset):
def __init__(self, X, y, scale_data=True):
if not torch.is_tensor(X) and not torch.is_tensor(y):
if scale_data:
X = StandardScaler().fit_transform(X)
self.X = torch.from_numpy(X)
self.y = torch.from_numpy(y)
def __len__(self):
return len(self.X)
def __getitem__(self, i):
return self.X[i], self.y[i]
### building the MLP
class MLP(nn.Module):
def __init__(self):
super().__init__()
self.layers = nn.Sequential(
nn.Linear(13, 64),
nn.ReLU(),
nn.Linear(64, 32),
nn.ReLU(),
nn.Linear(32, 1)
)
def forward(self, x):
return self.layers(x)
torch.manual_seed(42)
dataset = TorchDataset(X, y)
trainloader = DataLoader(dataset, batch_size=10, shuffle=True, num_workers=0)
mlp = MLP()
loss_function = nn.L1Loss()
optimizer = torch.optim.Adam(mlp.parameters(), lr=0.001)
### training loop
loss_vec = []
for epoch in range(1000):
epoch_loss = 0
for i, data in enumerate(trainloader, 0):
inputs, targets = data
inputs, targets = inputs.float(), targets.float()
targets = targets.reshape((targets.shape[0], 1))
## Zero the gradient
optimizer.zero_grad()
## Forward Pass
outputs = mlp(inputs)
## compute loss
loss = loss_function(outputs, targets)
## backward pass
loss.backward()
## Optimization
optimizer.step()
## Statisitcs
epoch_loss += loss.item()
loss_vec.append(epoch_loss)
## Visualizing the Loss curve
import plotly.express as px
px.scatter(loss_vec)
## Checking the R2 score between observed and predicted values
from sklearn.metrics import r2_score
y_pred = mlp(torch.tensor(X, dtype=torch.float)).detach().numpy()
r2_score(y.flatten(), y_pred.flatten()) ##always a big negative number
但最奇怪的是预测的值
pd.DataFrame({
'Obs':y.flatten(),
'Pred':y_pred.flatten()
})
正如你所看到的,我的神经网络预测的值完全超出了范围。
你能告诉我我哪里做错了吗?
1 个回答
3
你在训练神经网络(NN)时使用了经过缩放的输入,因为在 TorchDataset
的构造函数中,scale_data
的默认值是 True
。
但是在评估时,你没有对输入进行缩放,因为你直接传递了一个 Tensor
,而不是从 Dataset
中使用 DataLoader
。这就是你看到的结果的原因。
另外:这不是你问的问题,但你应该把数据分成训练集、验证集和测试集,而不是在训练集上进行测试。
要进行预测,使用 DataLoader
:
mlp.eval()
with torch.no_grad():
y_pred = torch.stack([mlp(batch) for batch, _ in trainloader])