Как загрузить 2D-данные в LSTM в pytorch - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть серия синусоидальных волн, которые я загрузил с помощью специального загрузчика данных. Данные преобразуются в тензор факела с помощью from_numpy. Затем я пытаюсь загрузить данные с помощью перечислителя поверх train_loader. Итератор показан ниже.

for epoch in range(epochs):
    for i, data in enumerate(train_loader):
        input = np.array(data)
        train(epoch)

Я получаю ошибку:

RuntimeError: input must have 3 dimensions, got 2

Я знаю, что мне нужно иметь свои входные данные в [sequence length, batch_size, input_size] для LSTM, но я не знаю, как отформатировать данные моего массива из 1000 синусоидальных волн длиной 10000.

Ниже мой метод обучения.

def train(epoch):
    model.train()
    train_loss = 0
    def closure():
        optimizer.zero_grad()
        print(input.shape)
        output = model(Variable(input))
        loss = loss_function(output)
        print('epoch: ', epoch.item(),'loss:', loss.item())
        loss.backward()
        return loss
    optimizer.step(closure)

Я думал, что попробую добавить (seq_length, batch_size, input_size) в кортеж, но это не может быть передано в сеть. В дополнение к этому я предположил, что загрузчик данных вводил размер системы в систему. Любая помощь будет оценена.

редактировать

Вот мои примерные данные:

T = 20
L = 1000
N = 100

x = np.empty((N, L), 'int64')
x[:] = np.array(range(L)) + np.random.randint(-4 * T, 4 * T, N).reshape(N, 1)
data = np.sin(x / 1.0 / T).astype('float64')
torch.save(data, open('traindata.pt', 'wb'))

1 Ответ

0 голосов
/ 06 сентября 2018

Можете ли вы поделиться простым примером ваших данных только для подтверждения?

Кроме того, вы должны иметь другой порядок для вашей фигуры. Обычно первое измерение всегда batch_size, а затем - другие измерения, например [batch_size, sequence_length, input_dim].

Один из способов добиться этого, если размер партии равен 1, - это использовать torch.unsqueeze(). Это позволяет создать «поддельное» измерение:

import torch as t
x = t.Tensor([1,2,3])
print(x.shape)
x = x.unsqueeze(dim=0) # adds a 0-th dimension of size 1
print(x.shape)
...