Pytorch(当前为1.1版)中的LSTM和LSTMCell有什么区别? LSTMCell似乎是LSTM的一种特殊情况(即仅一层,单向,无脱落)。
然后,同时实现这两种实现的目的是什么?除非我缺少任何东西,否则将LSTM对象用作LSTMCell很简单(或者,很容易使用多个LSTMCells创建LSTM对象)
答案 0 :(得分:1)
是的,您可以互相模仿,将它们分开的原因是效率。
LSTMCell
是一个带有参数的单元格:
这是等式的直接实现。
LSTM
是在“ for循环”中应用LSTM单元(或多个LSTM单元)的层,但是使用cuDNN对循环进行了优化。它的输入是
您通常可能希望在不同的上下文中使用LSTM单元,而不是将其应用于序列,即,使LSTM单元在树状结构上运行。在序列到序列模型中编写解码器时,您还可以在循环中调用单元,并在解码序列结束符号后停止循环。
答案 1 :(得分:-1)
让我举一些具体的例子:
# LSTM example:
>>> rnn = nn.LSTM(10, 20, 2)
>>> input = torch.randn(5, 3, 10)
>>> h0 = torch.randn(2, 3, 20)
>>> c0 = torch.randn(2, 3, 20)
>>> output, (hn, cn) = rnn(input, (h0, c0))
# LSTMCell example:
>>> rnn = nn.LSTMCell(10, 20)
>>> input = torch.randn(3, 10)
>>> hx = torch.randn(3, 20)
>>> cx = torch.randn(3, 20)
>>> output = []
>>> for i in range(6):
hx, cx = rnn(input[i], (hx, cx))
output.append(hx)
主要区别:
2
,代表num_layers
,循环层数。有 seq_len * num_layers=5 * 2
个单元格。 没有循环,但有更多的单元格。for
循环(seq_len=5
次)中,ith
实例的每个输出都将是 (i+1)th
实例的输入。只有一个单元格,真正循环如果我们在LSTM中设置num_layers=1
或者再增加一个LSTMCell,上面的代码都是一样的。
显然,在 LSTM 中应用并行计算更容易。