理解一个简单的LSTM pytorch

时间:2017-07-10 22:41:16

标签: neural-network lstm pytorch rnn

import torch,ipdb
import torch.autograd as autograd
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.autograd import Variable

rnn = nn.LSTM(input_size=10, hidden_size=20, num_layers=2)
input = Variable(torch.randn(5, 3, 10))
h0 = Variable(torch.randn(2, 3, 20))
c0 = Variable(torch.randn(2, 3, 20))
output, hn = rnn(input, (h0, c0))

这是文档中的LSTM示例。我不明白以下事项:

  1. 什么是输出尺寸,为什么没有在任何地方指定?
  2. 为什么输入有3个维度。 5和3代表什么?
  3. h0和c0中的2和3是什么,这些代表什么?
  4. 编辑:

    import torch,ipdb
    import torch.autograd as autograd
    import torch.nn as nn
    import torch.nn.functional as F
    import torch.optim as optim
    from torch.autograd import Variable
    import torch.nn.functional as F
    
    num_layers=3
    num_hyperparams=4
    batch = 1
    hidden_size = 20
    rnn = nn.LSTM(input_size=num_hyperparams, hidden_size=hidden_size, num_layers=num_layers)
    
    input = Variable(torch.randn(1, batch, num_hyperparams)) # (seq_len, batch, input_size)
    h0 = Variable(torch.randn(num_layers, batch, hidden_size)) # (num_layers, batch, hidden_size)
    c0 = Variable(torch.randn(num_layers, batch, hidden_size))
    output, hn = rnn(input, (h0, c0))
    affine1 = nn.Linear(hidden_size, num_hyperparams)
    
    ipdb.set_trace()
    print output.size()
    print h0.size()
    
      

    *** RuntimeError:预期的矩阵,

    获得3D,2D张量

3 个答案:

答案 0 :(得分:27)

LSTM的输出是最后一层上所有隐藏节点的输出 hidden_size - 每层LSTM块的数量 input_size - 每个时间步的输入要素数 num_layers - 隐藏图层的数量 总共有hidden_size * num_layers个LSTM块。

输入尺寸为(seq_len, batch, input_size) seq_len - 每个输入流中的时间步数 batch - 每批输入序列的大小。

隐藏和单元格尺寸为:(num_layers, batch, hidden_size)

  

输出(seq_len,batch,hidden_​​size * num_directions):包含来自RNN最后一层的输出要素(h_t)的张量,每个t。

因此会有hidden_size * num_directions个输出。您没有将RNN初始化为双向,因此num_directions为1.所以output_size = hidden_size

编辑:您可以使用线性图层更改输出数量:

out_rnn, hn = rnn(input, (h0, c0))
lin = nn.Linear(hidden_size, output_size)
v1 = nn.View(seq_len*batch, hidden_size)
v2 = nn.View(seq_len, batch, output_size)
output = v2(lin(v1(out_rnn)))

注意:对于这个答案,我认为我们只讨论非双向LSTM。

来源:PyTorch docs

答案 1 :(得分:7)

通过cdo256回答几乎是正确的。在提到hidden_​​size的含义时,他错了。他将其解释为:

hidden_​​size - 每层LSTM块的数量。

但实际上,这是一个更好的解释:

单元格中的每个sigmoid,tanh或隐藏状态层实际上是一组节点,其数量等于隐藏层大小。因此,LSTM单元中的每个“节点”实际上是正常神经网络节点的集群,如在密集连接的神经网络的每一层中。 因此,如果设置hidden_​​size = 10,那么每个LSTM块或单元将具有神经网络,其中包含10个节点。 LSTM模型中LSTM块的总数将等于序列长度的总数。

通过分析nn.LSTM和nn.LSTMCell之间的例子差异可以看出这一点:

https://pytorch.org/docs/stable/nn.html#torch.nn.LSTM

https://pytorch.org/docs/stable/nn.html#torch.nn.LSTMCell

答案 2 :(得分:2)

您可以设置

  

batch_first = True

如果您想以

的形式提供输入和输出
  

(batch_size,seq,input_size)

我今天知道了,所以和你分享。