介绍一下RNN模型的结构以及源码,用作自己复习的材料。
RNN模型所对应的源码在:\PyTorch\Lib\site-packages\torch\nn\modules\RNN.py文件中。
RNN的模型图如下:
源码注释中写道,RNN的数学公式:
表示在时刻的隐藏状态,
表示在时刻的输入,
表示前一层在时间的隐藏状态,或者是在时间“0”的初始隐藏状态。
接下来我们看一下源码中RNN类的初始化(只介绍几个重要的参数):
torch.nn.RNN(self, input_size, hidden_size, num_layers=1, nonlinearity='tanh', bias=True, batch_first=False, dropout=0.0, bidirectional=False, device=None, dtype=None)
- input_size:输入数据中的特征数(可以理解为嵌入维度 embedding_dim)。
- hidden_size:处于隐藏状态 h 的特征数(可以理解为输出的特征维度)。
- num_layers:代表着RNN的层数,默认是1(层),当该参数大于零时,又称为多层RNN。
- bidirectional:即是否启用双向RNN,默认关闭。
下面是输入部分:
这是Pytorch官方文档中给出的解释:
输入分为input和h_0,当没有提供h_0的时候,h_0默认为0。
当batch_size == Ture时,输入的维度一般为(batch_size * seq_len * emb_dim)。
下面是输出部分:
其中output的维度为(batch_size * seq_len * hidden_size * bidirectional)
其中bidirectional表示RNN是双向还是单向的,单向为1,双向为2。
下面使用代码举例:
import torch
import torch.nn as nn
rnn1 = nn.RNN(input_size=20,hidden_size=40,num_layers=4,bidirectional=True)
rnn2 = nn.RNN(input_size=20,hidden_size=40,num_layers=4,bidirectional=False)
tensor1 = torch.randn(5,10,20)
tensor2 = torch.randn(5,10,20)
out1,h_n = rnn1(tensor1)
out2,h_n = rnn2(tensor2)
print(out1.shape) # torch.Size([5, 10, 80])
print(out2.shape) # torch.Size([5, 10, 40])
可以看到当bidirectional=True时,输出的特征维度是hidden_size * 2;
可以看到当bidirectional=False时,输出的特征维度是hidden_size * 1;