【问题标题】:Understanding a simple LSTM pytorch了解一个简单的 LSTM pytorch
【发布时间】:2017-12-14 19:39:11
【问题描述】:
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 分别代表什么?

编辑:

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: matrices expected, got 3D, 2D tensors at

【问题讨论】:

    标签: neural-network lstm pytorch rnn


    【解决方案1】:

    你可以设置

    batch_first = 真

    如果您想将输入和输出提供为

    (batch_size, seq, input_size)

    今天才知道,所以分享给大家。

    【讨论】:

      【解决方案2】:

      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

      【讨论】:

        【解决方案3】:

        LSTM 的输出是最后一层上所有隐藏节点的输出。
        hidden_size - 每层 LSTM 块的数量。
        input_size - 每次输入特征的数量-step.
        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

        【讨论】:

        • 这里的 LSTM 块是什么意思。它是单个神经元,输出连接到下一层,隐藏连接到自身吗?
        • 什么是 num_directions?
        • LSTM 块是these things 之一。 num_directions 只是一个值,表示 LSTM 是否是双向的(1 或 2)。在大多数情况下,它将是 1。
        • 是的,那是我的错误。我认为它现在已修复。
        • @cdo256 你的链接失效了。
        猜你喜欢
        • 2020-08-21
        • 2020-08-09
        • 2017-10-23
        • 2020-06-14
        • 2020-05-28
        • 2016-07-07
        • 2018-07-27
        • 2016-12-07
        相关资源
        最近更新 更多