总述:

第一次看到这个函数时,脑袋有点懵,总结了下总共有五个问题:

1.这个input_size是啥?要输入啥?feature num又是啥?

2.这个hidden_size是啥?要输入啥?feature num又是啥?

3.不是说RNN会有很多个节点连在一起的吗?这怎么定义连接的节点数呢?

4.num_layer中说的stack是怎么stack的?

5.怎么输出会有两个东西呀output,hn

此篇博客介绍pytorch中RNN的一些参数,并且解决以上五个问题

1.Pytorch中的RNN

RNN课后实验 pytorch pytorch rnn参数_RNN

RNN课后实验 pytorch pytorch rnn参数_神经网络_02

2.input_size是啥?

说白了input_size无非就是你输入RNN的维度,比如说NLP中你需要把一个单词输入到RNN中,这个单词的编码是300维的,那么这个input_size就是300.这里的input_size其实就是规定了你的输入变量的维度。用f(wX+b)来类比的话,这里输入的就是X的维度。

ps:  “维度”可能造成了大家的误解,专业一点的说法是“特征数量”或者“通道数”。如果你有一个【bs * sequence_length * hidden_dim】的向量,我这里的维度指的是这个“hidden_dim”.

3.hidden_size是啥?

和最简单的BP网络一样的,每个RNN的节点实际上就是一个BP嘛,包含输入层,隐含层,输出层。这里的hidden_size呢,你可以看做是隐含层中,隐含节点的个数。(讲到这里还不清楚的,请复习一下最简单的三层神经网络的架构)。

RNN课后实验 pytorch pytorch rnn参数_大数据_03

那个输入层的三个节点代表输入维度为3,也就是input_size=3,然后这个hidden_size就是5了。当然这是是对于RNN某一个节点而言的,那么如何规定RNN的节点个数呢?

4.如何规定节点个数?

事实上,节点个数并不需要规定,你的输入序列是这样子的,[x1,x2,x3,x4,x5],那么input_size呢就是你的xi的维度,而你的RNN的节点数呢,就是由你的序列长度决定的,在这里我们的序列长度是5,所以会有5个节点。那么问题来了,我咋知道你的序列长度呢?pytorch里面不是只有input_size的参数吗?实际上,你声明RNN是这样声明的

self.encoder = nn.RNN(input_size=300,hidden_size=128,dropout=0.5)

但是你用的时候;

output,hn = self.encoder(encoder_input,encoder_hidden)

你会把你的数据丢进去吧,也就是你把encoder_input这一整个序列丢进去了,那么序列长度他不就知道了?

5.num_layers是啥?

一开始你是不是以为这个就是RNN的节点数呀,hhh,然而并不是:),如果num_layer=2的话,表示两个RNN堆叠在一起。那么怎么堆叠的呢?

如果是num_layer==1的话:

RNN课后实验 pytorch pytorch rnn参数_神经网络_04

如果num_layer==2的话:

RNN课后实验 pytorch pytorch rnn参数_神经网络_05

ok了~最后再来看看最后一个问题

6.hn,output分别是啥?

看图找答案:

RNN课后实验 pytorch pytorch rnn参数_RNN课后实验 pytorch_06

hn就是RNN的最后一个隐含状态。

经评论区的提醒,output是最后一层所有节点的hn集合,上图有一点点错误,请见谅~

如果还不理解的话,可以参见某个大佬总结的RNN,%%%%%%%%

RNN_机器学习/NLP/搜广推/算法开发工程/大数据-_rnn