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示例。我不明白以下事项:
编辑:
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张量
答案 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
和
答案 2 :(得分:2)
您可以设置
batch_first = True
如果您想以
的形式提供输入和输出(batch_size,seq,input_size)
我今天知道了,所以和你分享。