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

问题描述 投票:0回答:1

我有一系列使用自定义数据加载器加载的正弦波。使用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'))
python lstm pytorch rnn
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.