В настоящее время я пытаюсь реализовать RNN, используя PyTorch для основной задачи обучения. Раньше я пытался решить ту же задачу, используя только линейные и простые нелинейные слои, которые работали достаточно хорошо, но теперь я не знаю, как на самом деле использовать PyN-сети PyTorch в моей сети. В частности, я не понимаю, в каком формате должны быть данные, чтобы я мог передать их в свой RNN.
Это сеть, которая у меня сейчас есть:
import torch
import torch.nn as nn
import hyperparameters as hyper
class FirstNet(nn.Module):
def __init__(self):
super(FirstNet, self).__init__()
self.hidden_dim = 10
self.rnn = nn.RNN(hyper.batch_size, self.hidden_dim, 2)
self.linear = nn.Linear(self.hidden_dim, 1)
def forward(self, x, h):
x, h1 = self.rnn(x, h)
x = self.linear(x)
return x, h1
Теперь, если я попытаюсьподать пакет моих данных (который в данном случае является партией векторов 2х1 [x,y]
) в эту сеть, вызвав
out, h = net(batch, h)
Я получаю
RuntimeError: input.size(-1) must be equal to input_size. Expected 850, got 1
, где 850 - мой текущийразмер пакета.
Документация гласит, что ввод должен быть в форме (seq_len, batch, input_size)
, которая, как я думал, в моем случае будет (850, data, 2)
, но, видимо, здесь я что-то неправильно понял.
Я пробовал разные способы сгруппировать входные данные, но, похоже, не могу найти правильный формат, поэтому я был бы очень признателен, если бы кто-то указал мне правильное направление относительно того, что я делаю неправильно.
Для примера ввода:
Я не могу воспроизвести сообщение об ошибке, которое я получил ранее, но чтобы привести пример ввода, я попытался подать в сеть кортеж (850, batch, 2)
, где batch - это тензор с размерностью 850x2x1, но затем получил ошибкуr сообщение
AttributeError: 'tuple' object has no attribute 'size'
, которое звучит для меня как кортеж, не является правильным форматом (хотя оно написано как кортеж в документации).
Редактировать 2: Теперь мне также удалосьвоспроизвести первую ошибку:
С
batch_in = torch.zeros(hyper.batch_size, 1, 2)
seq_ls = []
for i in range(0,len(lbatch)):
batch_in[i] = lbatch[i]
seq_ls.append(2)
packed_batch = pack_sequence(batch_in, seq_ls)
Я получаю RuntimeError: input.size(-1) must be equal to input_size. Expected 850, got 2
, где я полностью теряюсь в том, почему это так.