RNN介绍及Pytorch源码解析

介绍一下RNN模型的结构以及源码,用作自己复习的材料。 

RNN模型所对应的源码在:\PyTorch\Lib\site-packages\torch\nn\modules\RNN.py文件中。

RNN的模型图如下:

RNN介绍及Pytorch源码解析_第1张图片

源码注释中写道,RNN的数学公式:

h_t = \tanh(W_{ih} x_t + b_{ih} + W_{hh} h_{(t-1)} + b_{hh})

h_t表示在t时刻的隐藏状态,

x_t表示在t时刻的输入,

h_{t-1}表示前一层在时间t-1的隐藏状态,或者是在时间“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,默认关闭。

下面是输入部分:

RNN介绍及Pytorch源码解析_第2张图片

这是Pytorch官方文档中给出的解释:

输入分为input和h_0,当没有提供h_0的时候,h_0默认为0。

当batch_size == Ture时,输入的维度一般为(batch_size * seq_len * emb_dim)。

下面是输出部分:

RNN介绍及Pytorch源码解析_第3张图片

其中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;

你可能感兴趣的:(深度学习模型,rnn,pytorch,人工智能)