pytorch nn.LSTM的用法和理解

照例先贴官方文档~

以下是实例化一个nn.LSTM单元时会用到的参数,例如lstm = nn.LSTM(10, 20, 2)就实例化了一个input_size=10, hidden_size=20num_layer=2的LSTM网络,也就是输入的维度为10,隐层的神经元数目为20,总共有2个隐层。

pytorch nn.LSTM的用法和理解
实例化好的LSTM如何使用呢?以下是输入,h0和c0都是可选的,重点是input,是一个表示输入序列特征的tensor,维度是(seq_len, batch, input_size),比如接上例,x = torch.randn(5, 3, 10),每个句子5个词,每个词用10维向量表示(正好对应LSTM单元里的input_size),一次把3个句子作为一个batch一起输入。
pytorch nn.LSTM的用法和理解
至于h0和c0,分别是hidden和cell的初始状态,维度是(num_layers * num_directions, batch, hidden_size),比如h0 = torch.randn(2, 3, 20), c0 = torch.randn(2, 3, 20),这是因为实例化好的LSTM单元有2层,非双向,每批3个句子,每个句子到隐层的时候转化为20维向量。

然后,使用output, (hn, cn) = lstm(x, (h0, c0))得到输出。
输出的size是(seq_len, batch, num_directions × hidden_size) (正好和输入的size(seq_len, batch, input_size)对应,相当于把输入做了一个从input_size到num_directionshidden_size维度的变换!)*
这时候查看output.size(), 是torch.Size([5, 3, 20]),正好对应。
pytorch nn.LSTM的用法和理解
完整的例子见这里:

>>> rnn = nn.LSTM(10, 20, 2)
>>> input = torch.randn(5, 3, 10)
>>> h0 = torch.randn(2, 3, 20)
>>> c0 = torch.randn(2, 3, 20)
>>> output, (hn, cn) = rnn(input, (h0, c0))

以上是默认batch_first = False的情况。如果明确规定了batch_first = True, 那么input和output的size是(batch_size, seq_len,对应的featue_size)
对batch_first的设计,有人是这样解释原因的(待研究):pytorch nn.LSTM的用法和理解
差不多弄懂了,爽~

上一篇:深度学习入门(二)


下一篇:需求预测——Predicting origin-destination ride-sourcing demand with a spatio-temporal encoder-decoder