了解简单的 LSTM pytorch

Understanding a simple LSTM pytorch

提问人:Abhishek Bhatia 提问时间:7/11/2017 最后编辑:Abhishek Bhatia 更新时间:12/20/2018 访问量:33962

问:

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. 什么是output-size,为什么没有在任何地方指定它?
  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:预期矩阵,得到 3D、2D 张量

神经网络 LSTM PyTorch 循环神经网络

评论


答:

45赞 cdo256 7/11/2017 #1

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

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

隐藏维度和单元格维度为:(num_layers, batch, hidden_size)

output (seq_len, batch, hidden_size * num_directions):张量包含每个 t 的 RNN 最后一层的输出特征 (h_t)。

所以会有输出。您没有将 RNN 初始化为双向的,因此 1 是双向的。所以。hidden_size * num_directionsnum_directionsoutput_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 文档

评论

0赞 Abhishek Bhatia 7/11/2017
你在这里所说的 LSTM 块是什么意思。它是一个单一的神经元,输出连接到下一层,隐藏连接自身吗?
1赞 Abhishek Bhatia 7/11/2017
什么是num_directions?
1赞 cdo256 7/11/2017
LSTM 块就是其中之一。 只是一个值,指示 LSTM 是双向的(1 还是 2)。在大多数情况下,它将是 1。num_directions
1赞 cdo256 7/11/2017
是的,那是我的错误。我认为它现在已经修复了。
3赞 peer 8/24/2019
@cdo256您的链接已失效。
9赞 zzuczy 11/27/2017 #2

您可以设置

batch_first = 真

如果要将输入和输出作为

(batch_size、以下、input_size)

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

17赞 Lsehovac 6/14/2018 #3

cdo256 的回答几乎是正确的。当他提到hidden_size的含义时,他错了。他将其解释为:

hidden_size - 每层的 LSTM 块数。

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

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

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

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

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