pytorch RNN
rnn流程图
在说rnn时有2个点需要注意,其中上图rnn从左到右表示时间序列,理解为一个句子一个个词的输入。还有一个是从下到上表示多层的rnn,图中只有一层。
多层rnn
rnn参数
import torch
import torch.nn as nn
rnn = nn.RNN(100, 20)
print(rnn._parameters.keys())
print(rnn.weight_ih_l0.shape) # w_{xh} [20, 100]
print(rnn.weight_hh_l0.shape) # w_{hh} [20, 20]
print(rnn.bias_ih_l0.shape) # b_{xh} [20]
print(rnn.bias_hh_l0.shape) # b_{hh} [20]
rnn的构建有3个参数
必选参数 input_size,指定输入序列中单个样本的尺寸大小,例如上图可能用一个 100 长度的向量表示一个单词,则 input_size=100
必选参数 hidden_size,指的是隐藏层中输出特征的大小
必选参数 num_layers,指的是纵向的隐藏层个数,一般设置为 1~10,default=1
rnn forward函数和输出参数
rnn的输入有2个参数,x是必选的,h0默认为一个全零的向量
rnn输出参数
out:所有时间戳上的最后一层 memory 状态。也就是说每一个单词的最后一层rnn的输出的向量我们都会保存到out。这也是为什么out向量的维度只有最后一个h dim与x不一样,其他都一样的原因。
ht=最后一个时间戳上面所有的 memory 状态。就是说对于最后一个时间,我们会把每一层输出的向量进行拼接。
也就是说out的最后一个向量和ht最后一个向量其实指的是同一个。