pytorch中RNN注意事项
batch_first为False的情况下,认为input的数据维度是(seq,batch,feature),output的数据维度(seq,batch,feature)。
batch_first为False的情况下,认为input的数据维度是(batch,seq,feature),output的数据维度(batch,seq,feature)。
1、Pytorch中的RNN参数详解
rnn = nn.RNN(*arg,**kwargs)
(1)input_size:输入x t x_tx
t
的维度
(2)hidden_size:输出h t h_th
t
的维度
(3)num_layers:网络的层数,默认为1层
(4)nonlinearity:非线性激活函数,默认是tanh,也可以选择relu等
(5)bias:是否有偏置。默认为True
(6)batch first:决定网络输入的维度顺序,默认为(seq,batch,feature),如果参数设置为True,顺序变为(batch,seq,feature)。RNN batch在第二个维度,CNN batch在第一个维度。
(7)dropout:接受一个0-1之间的数值,会在网络中除了最后一层外的其他输出层加上dropout层。
(8)bidirectional:默认为False,表示单项循环神经网络;如果设置为True,就是双向循环神经网络。
2、输入、输出的维度
(1)网络节后一个序列输入x t x_tx
t
和记忆输入h 0 h_0h
0
。x t x_tx
t
的维度是(seq,batch,feature);h 0 h_0h
0
隐状态的维度( l a y e r s ∗ d i r e c t i o n , b a t c h , h i d d e n ) (layersdirection,batch,hidden)(layers∗direction,batch,hidden),表示层数乘以方向(单项为1,双向为2),批量,输出的维度
(2)网络会输出output和h t h_th
t
。output表示网络实际的输出,维度是(seq,batch,hiddendirection),表示序列长度、批量和输出维度乘以方向;h t h_th
t
表示记忆单元,维度( l a y e r s ∗ d i r e c t i o n , b a t c h , h i d d e n ) (layers*direction,batch,hidden)(layers∗direction,batch,hidden),表示层数乘以方向,批量,输出的维度
3、需要注意的问题:
(1)网络输出是( s e q , b a t c h , h i d d e n ∗ d i r e c t i o n ) (seq,batch,hiddendirection)(seq,batch,hidden∗direction),direction=1或2。如果是双向的网络结构,相当于网络从左往右计算一次,再从右往左计算依次,这样会有两个结果。将两个结果按最后一个维度拼接起来,就是输出的维度。
(2)隐藏状态的网络大小、输入和输出都是(layerdirection,batch,hidden)时,因为如果网络有多层,那么每一层都有一个新的记忆单元,而双向网络结构在每一层左右会有两个不同的记忆单元,所以维度的第一位是l a y e r ∗ d i r e c t i o n layer*directionlayer∗direction