首页 > 解决方案 > Pytorch 将 PackSequence 参数传递给 LSTM

问题描述

根据我的理解,pack_sequencepack_padded_sequence返回 a 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

标签: lstmpytorch

解决方案


您的代码有一些问题。

  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]))

推荐阅读