Pytorch LSTM与LSTMCell

时间:2019-07-15 23:03:49

标签: pytorch lstm recurrent-neural-network lstm-stateful

Pytorch(当前为1.1版)中的LSTMLSTMCell有什么区别? LSTMCell似乎是LSTM的一种特殊情况(即仅一层,单向,无脱落)。

然后,同时实现这两种实现的目的是什么?除非我缺少任何东西,否则将LSTM对象用作LSTMCell很简单(或者,很容易使用多个LSTMCells创建LSTM对象)

2 个答案:

答案 0 :(得分:1)

是的,您可以互相模仿,将它们分开的原因是效率。

LSTMCell是一个带有参数的单元格:

  • 形状批量输入×输入尺寸;
  • 形状批处理x隐藏尺寸的LSTM隐藏状态元组。

这是等式的直接实现。

LSTM是在“ for循环”中应用LSTM单元(或多个LSTM单元)的层,但是使用cuDNN对循环进行了优化。它的输入是

  • 形状批处理×输入长度×输入尺寸的输入的三维张量;
  • 可选地,LSTM的初始状态,即形状批处理的隐藏状态元组×隐藏的暗淡元组(如果LSTM是双向的,则为此类元组的元组)

您通常可能希望在不同的上下文中使用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)

主要区别:

  1. LSTM:参数2,代表num_layers,循环层数。有 seq_len * num_layers=5 * 2 个单元格。 没有循环,但有更多的单元格。
  2. LSTMCell:在 for 循环(seq_len=5 次)中,ith 实例的每个输出都将是 (i+1)th 实例的输入。只有一个单元格,真正循环

如果我们在LSTM中设置num_layers=1或者再增加一个LSTMCell,上面的代码都是一样的。

显然,在 LSTM 中应用并行计算更容易。