Neural network 理解一个简单的LSTM pytorch
这是文档中的LSTM示例。我不知道,我不明白以下几点: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的输出是最后一层上所有隐藏节点的输出。
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)))