На выходе модели я получаю одни и те же значения в эпоху для разны индексов
На выходе модели я получаю одни и те же значения в эпоху для разны индексов
Я не могу понять, что происходит.
Это может быть проблема в архитектура или набор данных.
из-за этого модель не обучается, и loss огромны
import torch
import torch.nn as nn
from torch.utils.data import Dataset
import torch.nn.functional as F
import pandas as pd
import numpy as np
from tqdm import tqdm
train_data = pd.read_csv('C:/Users/качёк/Desktop/ЮТУБ/ДНЕВНИК DL/УРОК 3. LSTM/data/LSTM-Multivariate_pollution.csv')
train_data.head()
test_data = pd.read_csv('C:/Users/качёк/Desktop/ЮТУБ/ДНЕВНИК DL/УРОК 3. LSTM/data/pollution_test_data1.csv')
test_data.head()
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
class Air_Pollution(Dataset):
def __init__(self, path_dir:str):
super().__init__()
self.path_dir = path_dir
self.DS_Air_Pollution = pd.read_csv(path_dir)
def __len__(self):
return len(self.DS_Air_Pollution)
def __getitem__(self, idx):
if self.path_dir == 'C:/Users/качёк/Desktop/ЮТУБ/ДНЕВНИК DL/УРОК 3. LSTM/data/LSTM-Multivariate_pollution.csv':
target = int(self.DS_Air_Pollution['pollution'][idx])
target = torch.tensor(target, dtype=torch.float32)
data = self.DS_Air_Pollution.iloc[[idx]].drop(['pollution', 'date'], axis=1)
replace = {'wnd_dir':{'SE':0,
'NW':1,
'cv':2,
'NE':3}}
data = data.replace(replace)
input_data = torch.tensor(np.array(data)).float()
else:
target = int(self.DS_Air_Pollution['pollution'][idx])
target = torch.tensor(target, dtype=torch.float32)
data = self.DS_Air_Pollution.iloc[[idx]].drop(['pollution'], axis=1)
replace = {'wnd_dir':{'SE':0,
'NW':1,
'cv':2,
'NE':3}}
data = data.replace(replace)
input_data = torch.tensor(np.array(data)).float()
return {'input_data': input_data, 'target': target}
train_dir = 'C:/Users/качёк/Desktop/ЮТУБ/ДНЕВНИК DL/УРОК 3. LSTM/data/LSTM-Multivariate_pollution.csv'
test_dir = 'C:/Users/качёк/Desktop/ЮТУБ/ДНЕВНИК DL/УРОК 3. LSTM/data/pollution_test_data1.csv'
train_Air_Pollution = Air_Pollution(train_dir)
test_Air_Pollution = Air_Pollution(test_dir)
train_Air_Pollution[0]['target']
batch_size = 16
train_loader = torch.utils.data.DataLoader(train_Air_Pollution,
batch_size=batch_size,
shuffle=True,
drop_last=True)
test_loader = torch.utils.data.DataLoader(test_Air_Pollution,
batch_size=batch_size,
shuffle=True,
drop_last=False)
class LSTM_model(nn.Module):
def __init__(self):
super(LSTM_model, self).__init__()
self.lstm = nn.LSTM(input_size=7, hidden_size=10, num_layers=3, batch_first=True)
self.flat = nn.Flatten()
self.act = nn.ReLU()
self.linear1 = nn.Linear(10, 128)
self.linear2 = nn.Linear(128, 64)
self.linear3 = nn.Linear(64, 1)
def forward(self, x):
out = torch.tanh(self.lstm(x)[0])
out = self.flat(out)
out = self.linear1(out)
out = self.act(out)
out = self.linear2(out)
out = self.act(out)
out = self.linear3(out)
return out
model = LSTM_model()
loss_fn = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.0001)
#def accuracy(pred, y):
#print(pred)
#print(y)
#answer = F.softmax(pred.detach().cpu()).numpy().argmax(1) == y.cpu().numpy().argmax(1)
#return answer.mean()
epochs = 5
for epoch in range(epochs):
loss_val = 0
#acc_val = 0
for sample in (pbar := tqdm(train_loader)):
X, y = sample['input_data'], sample['target']
pred = model(X)
loss = loss_fn(pred, y.reshape([16, 1]))
loss.backward()
loss_item = loss.item()
loss_val += loss_item
optimizer.step()
optimizer.zero_grad()
#acc_current = accuracy(pred, y)
#acc_val += acc_current
pbar.set_description(f'loss: {loss_item:.5f}')
print(f'epoch: {epoch + 1}')
print(f'loss: {loss_val/len(train_loader)}')
#print(f'acc: {acc_val/len(train_loader)}')
Я недавно изучаю PyTorch и не могу понять как исправить
Источник: Stack Overflow на русском