Pytorch将PackSequence参数传递给LSTM

时间:2018-11-07 20:54:56

标签: lstm pytorch

根据我的理解,pack_sequencepack_padded_sequence返回一个PackedSequence,其data属性应始终为1维。

但是,以下代码给出了错误: RuntimeError: input must have 2 dimensions, got 1

import torch
import torch.nn.utils.rnn as rnn_utils
a = torch.Tensor([1, 2, 3])
b = torch.Tensor([4, 5])
c = torch.Tensor([6])
seq = rnn_utils.pack_sequence([a, b, c])
lstm = torch.nn.LSTM(
    input_size=3,
    hidden_size=3
)
lstm(seq)

我尝试了batch_first=True,但没有用。

错误代码的源文件:https://github.com/pytorch/pytorch/blob/master/torch/nn/modules/rnn.py#L127

1 个答案:

答案 0 :(得分:1)

您的代码有些错误。

  1. 输入大小应为1
  2. LSTM在每个时间步都取一个向量,您传递了标量,因此传递了尺寸误差。

下面的代码应解决此问题。我为每个输入设置了一个(1,)大小数组,并将输入大小更改为1。

import torch 
import torch.nn.utils.rnn as rnn_utils 
a = torch.Tensor([[1], [2], [3]]) 
b = torch.Tensor([[4], [5]]) 
c = torch.Tensor([[6]]) 
seq = rnn_utils.pack_sequence([a, b, c]) 
lstm = torch.nn.LSTM(input_size=1, hidden_size=3) 
lstm(seq) 

打包序列可以是多维的,并且取决于每个时间步长的数据。例如,在这种情况下,seq将是

PackedSequence(data=tensor([[1.],
        [4.],
        [6.],
        [2.],
        [5.],
        [3.]]), batch_sizes=tensor([3, 2, 1]))