torch.nn.RNN
: PyTorch 中的循环神经网络(RNN)模块在 PyTorch 中,torch.nn.RNN
是一个用于构建 循环神经网络(RNN) 的模块。它提供了一个可以进行训练的 RNN 层,广泛应用于序列数据的建模,如自然语言处理、时间序列分析等。这个模块可以处理各种类型的序列数据,并支持多种功能和配置。
torch.nn.RNN
可以:
tanh
或 ReLU
。torch.nn.RNN
类的构造方法torch.nn.RNN(input_size, hidden_size, num_layers=1, nonlinearity='tanh', bias=True, batch_first=False, dropout=0, bidirectional=False)
input_size
:输入特征的维度。即每个时间步的输入向量大小。hidden_size
:隐藏层的维度。表示 RNN 网络中隐藏状态向量的大小。num_layers
:RNN 层数,默认值为 1。如果设置为大于 1,则为多层 RNN 网络。nonlinearity
:激活函数。默认值是 'tanh'
,也可以设置为 'relu'
。bias
:是否使用偏置项,默认值是 True
。batch_first
:如果设置为 True
,则输入和输出的形状为 (batch, seq_len, input_size)
,否则为 (seq_len, batch, input_size)
。默认值为 False
。dropout
:在多层 RNN 中,除了最后一层外,其他层的输出将使用 dropout。默认值是 0
,表示不使用 dropout。bidirectional
:是否使用双向 RNN。如果设置为 True
,则使用双向 RNN。默认值是 False
。torch.nn.RNN
的输出是一个包含两部分的元组:
(seq_len, batch, hidden_size)
或 (batch, seq_len, hidden_size)
,具体取决于 batch_first
的设置。(num_layers * num_directions, batch, hidden_size)
。这是 RNN 在最后时刻的隐藏状态。如果是多层或者双向的 RNN,num_directions
将是 2。下面是一个使用 torch.nn.RNN
进行序列建模的简单例子:
import torch
import torch.nn as nn
# 定义一个简单的 RNN 模型
class SimpleRNN(nn.Module):
def __init__(self, input_size, hidden_size, num_layers, output_size):
super(SimpleRNN, self).__init__()
self.rnn = nn.RNN(input_size, hidden_size, num_layers, batch_first=True)
self.fc = nn.Linear(hidden_size, output_size)
def forward(self, x):
# x 的形状是 (batch_size, seq_len, input_size)
out, _ = self.rnn(x) # 只关注 output,不使用隐藏状态 h_n
out = out[:, -1, :] # 只取最后一个时间步的输出
out = self.fc(out)
return out
# 定义输入和目标
input_size = 10 # 输入特征维度
hidden_size = 20 # 隐藏层维度
num_layers = 2 # RNN 层数
output_size = 1 # 输出维度(例如用于回归)
# 创建模型
model = SimpleRNN(input_size, hidden_size, num_layers, output_size)
# 创建示例输入数据 (batch_size=3, seq_len=5, input_size=10)
x = torch.randn(3, 5, 10)
# 获取模型输出
output = model(x)
print(output)
在上述代码中,模型包含:
nn.RNN
创建的 RNN 网络,接收输入序列并生成隐藏状态。nn.Linear
将 RNN 输出映射到目标空间。bidirectional=True
使得 RNN 成为双向的 RNN,即不仅考虑前向信息,还考虑后向信息,适用于序列前后都需要信息的情况。
import torch
import torch.nn as nn
# 定义一个双向 RNN 模型
class BiDirectionalRNN(nn.Module):
def __init__(self, input_size, hidden_size, num_layers, output_size):
super(BiDirectionalRNN, self).__init__()
self.rnn = nn.RNN(input_size, hidden_size, num_layers, batch_first=True, bidirectional=True)
self.fc = nn.Linear(2 * hidden_size, output_size) # 双向,所以输出维度乘以 2
def forward(self, x):
out, _ = self.rnn(x)
out = out[:, -1, :] # 取最后一个时间步的输出
out = self.fc(out)
return out
# 定义输入和目标
input_size = 10
hidden_size = 20
num_layers = 2
output_size = 1
# 创建模型
model = BiDirectionalRNN(input_size, hidden_size, num_layers, output_size)
# 创建示例输入数据 (batch_size=3, seq_len=5, input_size=10)
x = torch.randn(3, 5, 10)
# 获取模型输出
output = model(x)
print(output)
在上述双向 RNN 的例子中,模型通过 bidirectional=True
使得每个时间步不仅考虑前一个时间步的信息,还会考虑后一个时间步的信息。因此,输出的 hidden_size
为 2 倍,因为每个时间步的隐状态包含了 前向 和 后向 的隐藏层。
torch.nn.RNN
是 PyTorch 提供的一个循环神经网络层,适用于处理时序数据和序列任务。batch_first
参数支持批量训练,并通过 bidirectional
参数支持双向循环神经网络。