在实现RNN的时候遇到了一些问题,主要还是各种size没有搞清楚,特开一帖记录一下。
下图是pytorch中的RNN模块的原理图(图片来源见水印):
在PyTorch中可以使用下面两种方式去调用:
torch.nn.RNNCell()
,只能接受序列中单步的输入,且必须传入隐藏状态torch.nn.RNN()
,可以接受一个序列的输入,默认会传入全0的隐藏状态,也可以自己申明隐藏状态传入
class RNN(input_size, hidden_size, num_layers=1, bias=True, batch_first=False, dropout=0., bidirectional=False):
上述RNN默认为是图中的一层隐藏层结构。
参数解释:
input_size
:输入的 x x x的维度hidden_size
:隐藏层 h h h的维度num_layers
:隐藏层数,默认为1(即上图),若是大于1则意味着在上图中 h h h作为接续的RNN单元的输入,如下图:
当然了,这个图画的是双向RNN,咱们只看图的实线部分就可以了,num_layers
大于1说的就是这种情况。但是这里似乎只能加入和h同样size的RNN单元,要想改变一下的话可能还需要自己手动实现bias
:偏置项batch_first
:在输入张量中batch放在第一位。这里的batch指我们同时扔进去多个序列。
原本的输入:(seq_len, batch, feature),batch_first = True
时的输入:(batch, seq_len, feature)
dropout和bidirectional略…
在调用RNN时,一般地:
out, h_o = RNN(input, h_i)
这里,假设没有开启baytch_first,则:
对于输入参数而言:
- 输入的维度应该是:(seq_len, batch, input_size)
- h的维度应该是:(num_layers * num_directions, batch, hidden_size)
即考虑到了隐藏层数、batch和隐藏层规格
对于返回结果而言:
- 输出的维度应该是:(seq_len, batch, num_directions * hidden_size)
- 隐藏层的维度应该是:(num_layers * num_directions, batch, hidden_size)
举例:
rnn = nn.RNN(10, 20, 2)
input = torch.randn(5, 3, 10)
h0 = torch.randn(2, 3, 20)
output, hn = rnn(input, h0)