Я не могу заставить работать ни одну NN в Пайторче. Что я делаю не так?Python

Программы на Python
Гость
Я не могу заставить работать ни одну NN в Пайторче. Что я делаю не так?

Сообщение Гость »


Я работаю с данными и имею приличные навыки работы с Python, я знаю, как работать с разными моделями, но никогда раньше не пробовал использовать нейронные сети.

Поэтому я новичок в pytorch и решил тренироваться с использованием онлайн-уроков и видео.
К сожалению, я обнаружил, что действительно не могу заставить эти модели работать и получаю крайне неправильные результаты. Это происходит независимо от руководства, которому я следую, поэтому я определенно делаю что-то неправильно.
Например, я следовал этому пошаговому руководству о том, как создать NN для регрессии с использованием Бостонского алгоритма. Набор данных о жилье.
Вот мой код, который я по сути скопировал из руководства, поэтому не должно быть никакой разницы.
< pre class="lang-py Prettyprint-override">

Код: Выделить всё

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()
})
Изображение
As you can see my NN is predicting values completely out of the range.
Can you tell me what I am doing wrong here?


Источник: https://stackoverflow.com/questions/781 ... oing-wrong

Вернуться в «Python»