Pytorch(当前版本 1.1)中的LSTM和LSTMCell有什么区别?LSTMCell 似乎是 LSTM 的一个特例(即只有一层,单向,没有 dropout)。
那么,这两种实现的目的是什么?除非我遗漏了什么,否则将 LSTM 对象用作 LSTMCell 是微不足道的(或者,使用多个 LSTMCell 来创建 LSTM 对象非常容易)
是的,您可以一个一个地效仿,将它们分开的原因是效率。
LSTMCell
是一个接受参数的单元格:
这是方程的直接实现。
LSTM
是在“for 循环”中应用 LSTM 单元(或多个 LSTM 单元)的层,但该循环使用 cuDNN 进行了大量优化。它的输入是
您通常可能希望在不同的上下文中使用 LSTM 单元,而不是将其应用于序列,即创建一个在树状结构上运行的 LSTM。当您在序列到序列模型中编写解码器时,您还会在循环中调用单元并在序列结束符号被解码时停止循环。
让我展示一些具体的例子:
# 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
实例的输入。只有一个细胞,真正循环如果我们num_layers=1
在 LSTM 中设置或者再添加一个 LSTMCell,上面的代码都是一样的。
显然,在 LSTM 中应用并行计算更容易。