我有一系列使用自定义数据加载器加载的正弦波。使用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'))
您可以分享一个简单的数据示例来确认吗?
此外,您必须为您的形状订购不同的订单。通常,第一个维度始终是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)