Neural network 理解一个简单的LSTM pytorch

Neural network 理解一个简单的LSTM pytorch,neural-network,lstm,pytorch,rnn,Neural Network,Lstm,Pytorch,Rnn,这是文档中的LSTM示例。我不知道,我不明白以下几点: 输出大小是什么?为什么不在任何地方指定 为什么输入有3个维度。5和3代表什么 h0和c0中的2和3是什么,它们代表什么 编辑: ***运行时错误:需要矩阵,在 LSTM的输出是最后一层上所有隐藏节点的输出。 hidden\u size-每层的LSTM块数。 input\u size-每个时间步的输入特征数。 num\u layers-隐藏层的数量。 总共有hidden_size*num_层LSTM块 输入维度为(顺序、批次、输入大小) se

这是文档中的LSTM示例。我不知道,我不明白以下几点:

  • 输出大小是什么?为什么不在任何地方指定
  • 为什么输入有3个维度。5和3代表什么
  • h0和c0中的2和3是什么,它们代表什么
  • 编辑:

    ***运行时错误:需要矩阵,在


    LSTM的输出是最后一层上所有隐藏节点的输出。
    hidden\u size
    -每层的LSTM块数。
    input\u size
    -每个时间步的输入特征数。
    num\u layers
    -隐藏层的数量。
    总共有
    hidden_size*num_层
    LSTM块

    输入维度为
    (顺序、批次、输入大小)

    seq_len
    -每个输入流中的时间步数。
    batch
    -每批输入序列的大小

    隐藏维度和单元格维度为:
    (层数、批次、隐藏大小)

    输出(顺序、批次、隐藏大小*数量方向):包含RNN最后一层输出特征(h_t)的张量,用于每个t

    因此将有
    隐藏的大小*num\u方向
    输出。您没有将RNN初始化为双向,因此
    num\u directions
    为1。所以
    output\u size=hidden\u size

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

    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()
    
    注意:对于这个答案,我假设我们只讨论非双向LSTM

    来源:。

    您可以设置

    批处理_first=True

    如果您想将输入和输出设置为

    (批次大小、顺序、输入大小)


    我今天就知道了,所以和大家分享。

    cdo256的回答几乎是正确的。当提到隐藏的大小意味着什么时,他错了。他解释说:

    隐藏大小-每层LSTM块的数量

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

    单元中的每个sigmoid、tanh或隐藏状态层实际上是一组节点,其数量等于隐藏层的大小。因此,LSTM单元中的每个“节点”实际上是正常神经网络节点的簇,就像在密集连接的神经网络的每一层中一样。 因此,如果将hidden_size设置为10,则每个LSTM块或单元都将具有包含10个节点的神经网络。 LSTM模型中LSTM块的总数将等于序列长度的总数

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


    这里的LSTM块是什么意思。它是一个输出连接到下一层,隐藏连接到自身的单个神经元吗?什么是num_方向?LSTM块是其中之一
    num_directions
    只是一个值,用于指示LSTM是双向的(1还是2)。在大多数情况下是1。是的,那是我的错误。我想现在已经修好了。@cdo256您的链接已断开。
    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()
    
    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)))