На выходе модели я получаю одни и те же значения в эпоху для разны индексов

Рейтинг: 1Ответов: 0Опубликовано: 20.07.2023

На выходе модели я получаю одни и те же значения в эпоху для разны индексов

прикрепляю скрин с ошибкой

Я не могу понять, что происходит.

Это может быть проблема в архитектура или набор данных.

из-за этого модель не обучается, и 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 и не могу понять как исправить

Ответы

Ответов пока нет.