我无法让任何神经网络在 Pytorch 中工作。我做错了什么?

问题描述 投票:0回答:1

我处理数据,并且在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()
})

如您所见,我的神经网络预测的值完全超出了范围。

你能告诉我我在这里做错了什么吗?

python pandas machine-learning pytorch neural-network
1个回答
0
投票

您可以在缩放输入上训练神经网络,因为

scale_data
的构造函数中
TorchDataset
的默认值为
True

但是在评估时您不会缩放输入,因为您只是传递

Tensor
而不是来自
DataLoader
Dataset
。这就是您所看到的结果的原因。

另外:这不是你问的问题,但你应该分成训练集、验证集和测试集,而不是在训练集上进行测试。

© www.soinside.com 2019 - 2024. All rights reserved.