Ускорение обучения - RNN с LSTM в PyTorch

Я пытаюсь обучить LSTM прогнозированию спроса на энергию, но это занимает слишком много времени. Я не понимаю, почему, потому что модель выглядит «простой» и данных мало. Может быть, я не использую DataLoader? Как я могу использовать его с RNN, если у меня есть последовательность?

Полный код находится в Colab: https://colab.research.google.com/drive/130rG8_j1Lf8RQoVRrfXCeo5h_CcC5NU6?usp=sharing

Интересная часть, которую нужно улучшить, может заключаться в следующем:

for seq, y_train in train_data:
    optimizer.zero_grad()
    model.hidden = (torch.zeros(1,1,model.hidden_size),
                    torch.zeros(1,1,model.hidden_size))
    y_pred = model(seq)
    loss = criterion(y_pred, y_train)
    loss.backward()
    optimizer.step()

Заранее спасибо всем, кто мне помогает.


person jccarrasco    schedule 25.08.2020    source источник
comment
Это медленно, возможно, потому, что вы не тренируетесь на GPU.   -  person Girish Dattatray Hegde    schedule 25.08.2020
comment
Спасибо @GirishDattatrayHegde, это правда, но набор данных достаточно мал, и другие модели работают быстрее, будучи более сложными.   -  person jccarrasco    schedule 25.08.2020
comment
Что вы подразумеваете под более сложными моделями? Я имею в виду, какие модели с вашей стороны быстрее, чем RNN? Причина в том, что RNN не являются самыми сложными нейронными моделями, но определенно входят в число таких сложных моделей из-за их повторяющейся природы. @jccarrasco   -  person inverted_index    schedule 26.08.2020
comment
Что вы имеете в виду под словом «слишком долго»? Сколько времени для одной эпохи?   -  person Dimitri K. Sifoua    schedule 26.08.2020
comment
Я думаю, вам следует использовать другой оптимизатор, такой как Adam или RMSprop, который намного быстрее оптимизатора SGD.   -  person Dimitri K. Sifoua    schedule 26.08.2020
comment
Спасибо @inverted_index, проблема заключалась в пакетной загрузке. Я проходил всего 1 партию на тренировку, напишу решение.   -  person jccarrasco    schedule 26.08.2020
comment
Спасибо @ DimitriK.Sifoua. Проблема была в загрузчике данных. Я отвечу на вопрос.   -  person jccarrasco    schedule 26.08.2020
comment
[email protected] проголосуйте за решение, если вы сочли его полезным.   -  person jccarrasco    schedule 26.08.2020
comment
Пожалуйста, @ GirishDattatrayHegde проголосуйте за решение, если вы сочли его полезным.   -  person jccarrasco    schedule 26.08.2020
comment
Пожалуйста, @inverted_index проголосуйте за решение, если вы сочли его полезным.   -  person jccarrasco    schedule 26.08.2020


Ответы (1)


Если вы хотите ускорить процесс обучения, за одно обучение модели необходимо предоставить больше данных. В моем случае я предоставлял только 1 партию. Лучший способ решить эту проблему - использовать DataLoader.

Полный Colab с решением можно найти по этой ссылке: https://colab.research.google.com/drive/1QgtshCFETZ9oTvIYWy1Bdre-614kbwRX?usp=sharing

# This is to create the Dataset
from torch.utils.data import Dataset, DataLoader

class DemandDataset(Dataset):
    def __init__(self, X_train, y_train):
        self.X_train = X_train
        self.y_train = y_train

    def __len__(self):
        return len(self.y_train)

    def __getitem__(self, idx):
        data = self.X_train[idx]
        labels = self.y_train[idx]
        return data, labels

#This is to convert from typical RNN sequences
sq_0 =[]
y_0 =[]
for seq, y_train in train_data:
  sq_0.append(seq)
  y_0.append(y_train)

dataset=DemandDataset(sq_0,y_0)
dataloader = DataLoader(dataset, batch_size=20)

epochs = 30
t = 50

for i in range(epochs):
    print("New epoch")    
  
    for data,label in dataloader:
         
        optimizer.zero_grad()
        model.hidden = (torch.zeros(1,1,model.hidden_size),
                        torch.zeros(1,1,model.hidden_size))
        
        y_pred = model(seq)
        
        loss = criterion(y_pred, label)
        loss.backward()
        optimizer.step()
        
   
    print(f'Epoch: {i+1:2} Loss: {loss.item():10.8f}')
    
   
    preds = train_set[-window_size:].tolist()

    for f in range(t):  
        seq = torch.FloatTensor(preds[-window_size:])
        with torch.no_grad():
            model.hidden = (torch.zeros(1,1,model.hidden_size),
                            torch.zeros(1,1,model.hidden_size))
            preds.append(model(seq).item())
            
    loss = criterion(torch.tensor(preds[-window_size:]),y[-t:])

 
person jccarrasco    schedule 26.08.2020