PyTorch LSTM输入格式验证与相关疑问咨询
探究PyTorch LSTM输入规则的疑问
我正在研究PyTorch LSTM的输入规则,已查阅官方文档,希望有经验的开发者确认或修正我对输入格式的理解。先依照文档定义符号:
- N = 批量大小(Batch Size)
- L = 序列长度(Sequence Length)
- H-IN = input_size,即输入x的预期特征数(x为t时刻的输入)
验证示例
示例1
设置批量大小N=3,每个序列长度L=2,每个时间步为单个数值,输入张量构造如下:
batch_tensor = torch.tensor([ # 第一个序列 [1, 2],长度为2,1是第一个时间步,2是第二个时间步 [[1], [2]], # 第二个序列 [4, 5],长度为2,4是第一个时间步,5是第二个时间步 [[4], [5]], # 第三个序列 [7, 8],长度为2,7是第一个时间步,8是第二个时间步 [[7], [8]] ], dtype=torch.float32) print(batch_tensor.shape) # 输出 -> torch.Size([3, 2, 1]) # 每个时间步维度为1,所以input_size设为1 lstm = nn.LSTM(input_size=1, hidden_size=4, num_layers=1, batch_first=True)
这里我设置input_size=1,因为每个时间步的特征维度是1。
示例2
设置批量大小N=3,每个序列长度L=2,每个时间步为二维向量,输入张量构造如下:
batch_tensor = torch.tensor([ # 第一个序列 [[1, 1.5], [2, 2.5]],长度为2,[1, 1.5]是第一个时间步,[2, 2.5]是第二个时间步 [[1, 1.5], [2, 2.5]], # 第二个序列 [[4, 4.5], [5, 5.5]],长度为2,[4, 4.5]是第一个时间步,[5, 5.5]是第二个时间步 [[4, 4.5], [5, 5.5]], # 第三个序列 [[7, 7.5], [8, 8.5]],长度为2,[7, 7.5]是第一个时间步,[8, 8.5]是第二个时间步 [[7, 7.5], [8, 8.5]] ], dtype=torch.float32) print(batch_tensor.shape) # 输出 -> torch.Size([3, 2, 2]) # 每个时间步维度为2,所以input_size设为2 lstm = nn.LSTM(input_size=2, hidden_size=4, num_layers=1, batch_first=True)
这里我设置input_size=2,因为每个时间步的特征维度是2。
问题
- 上述两个输入格式示例是否正确?
- 在两个示例中,我尝试将
input_size设置为2000时代码仍能运行,请问这是为什么?
回答
两个示例的输入格式完全正确。因为你设置了
batch_first=True,输入张量的维度顺序是[N, L, H-IN],和定义的符号完全对应:- 示例1中
[3,2,1]对应N=3,L=2,H-IN=1,input_size=1匹配,符合LSTM的输入要求; - 示例2中
[3,2,2]对应N=3,L=2,H-IN=2,input_size=2匹配,同样正确。
- 示例1中
代码能运行是因为PyTorch在初始化LSTM层时不会自动校验输入张量的特征维度,只有当你把输入张量传入LSTM层进行前向传播时,才会触发维度不匹配的报错。比如你只初始化了
lstm = nn.LSTM(input_size=2000, ...)但没执行output, (h_n, c_n) = lstm(batch_tensor),PyTorch不会检查维度是否匹配。一旦执行前向传播,就会抛出类似RuntimeError: input.size(-1) must be equal to input_size的错误,因为输入张量的最后一维(特征数)和input_size不匹配。
内容的提问来源于stack exchange,提问作者PatelisGM
相关产品推荐
相关产品推荐

