-
对于一个
rnn_out, rnn_hidden = nn.RNN(input_size=input_size, hidden_size=hidden_size, batch_first=True, bidirectional, num_layers=num_layers)
, 其输入维度为(batch_size, seq_length, input_size),其输出维度有如下通项:rnn_out.shape = (batch_size, seq_length, hidden_size*num_directions)
其中 num_directions为1或2,分别对应单项和双向RNN
rnn_hidden.shape = (num_layers*num_directions, batch_size, hidden_size)
测试代码:
import torch import torch.nn as nn # 定义输入序列 input_size = 10 # 输入特征的维度 seq_len = 8 # 序列长度 batch_size = 3 # 批次大小 input_seq = torch.randn(batch_size, seq_len, input_size) # 使用nn.RNN rnn_layer = nn.RNN(input_size=input_size, hidden_size=20, batch_first=True, bidirectional=True, num_layers=2) rnn_out, rnn_hidden = rnn_layer(input_seq) print("Using nn.RNN:") print("Input shape:", input_seq.shape) print("Output shape:", rnn_out.shape) print("Hidden shape:", rnn_hidden.shape)
-
nn.RNN返回两个值,rnn_out和rnn_hidden,前者为整个序列的隐藏状态,后者为最后一个单元的隐藏状态,后者其实是被前者包含的,可以用如下代码验证:
- 当
bidirectional=False
时(单向 单/多层):# 最后一个隐藏状态 torch.equal(rnn_out[:, -1, :], rnn_hidden[-1, :, :].squeeze(dim=0))
- 当
bidirectional=True
时(双向 单/多层):# 正向的最后一个隐藏状态 torch.equal(rnn_out[:, -1, :hidden_size], rnn_hidden[-2, :, :].squeeze(dim=0)) # 逆向的最后一个隐藏状态 torch.equal(rnn_out[:, 0, hidden_size:], rnn_hidden[-1, :, :].squeeze(dim=0))
均应返回True
- 当
把握torch.nn.RNN的输入输出维度
最新推荐文章于 2024-04-24 00:02:52 发布