如何在pytorch中将2D数据加载到LSTM中

时间:2018-09-06 04:34:14

标签: python lstm pytorch rnn

我有一系列使用自定义数据加载器加载的正弦波。使用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的输入数据,但是我不知道如何格式化长度为10000的1000个正弦波的数组数据。

下面是我的训练方法。

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 :(得分:0)

您可以分享一个简单的数据示例来确认吗?

此外,您的形状必须有不同的顺序。通常,第一个维度始终是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)