Pytorch LSTM 与 LSTMCell
Pytorch LSTM vs LSTMCell
Pytorch(目前是1.1版本)LSTM and LSTMCell有什么区别?看起来 LSTMCell 是 LSTM 的一个特例(即只有一层,单向,没有 dropout)。
那么,两种实现的目的是什么?除非我遗漏了什么,否则将 LSTM 对象用作 LSTMCell 是微不足道的(或者,使用多个 LSTMCell 来创建 LSTM 对象非常容易)
是的,可以一个个模仿,分开来是为了效率。
LSTMCell
是一个接受参数的单元格:
- 形状批次输入×输入维度;
- 形状批次 x 隐藏维度的 LSTM 隐藏状态元组。
这是方程式的直接实现。
LSTM
是在 "for loop" 中应用一个 LSTM 单元(或多个 LSTM 单元)的层,但是使用 cuDNN 对循环进行了高度优化。它的输入是
- 一个three-dimensional shape batch×输入长度×输入维度的输入张量;
- 可选地,LSTM 的初始状态,即形状为 batch × hidden dim 的隐藏状态元组(如果 LSTM 是双向的,则为此类元组的元组)
您通常可能希望在不同的上下文中使用 LSTM 单元而不是将其应用于序列,即制作一个在 tree-like 结构上运行的 LSTM。当你在 sequence-to-sequence 模型中编写解码器时,你也在循环中调用单元格并在解码 end-of-sequence 符号时停止循环。
让我举一些具体的例子:
# 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)
主要区别:
- LSTM:参数
2
,代表num_layers
,循环层数。有 seq_len * num_layers=5 * 2
个单元格。 没有循环,但有更多单元格。
- LSTMCell:在
for
循环中(seq_len=5
次),ith
个实例的每个输出将是(i+1)th
个实例的输入。只有一个单元格,Truly Recurrent
如果我们在LSTM中设置num_layers=1
或者再增加一个LSTMCell,上面的代码都是一样的
显然,在LSTM中更容易应用并行计算。
Pytorch(目前是1.1版本)LSTM and LSTMCell有什么区别?看起来 LSTMCell 是 LSTM 的一个特例(即只有一层,单向,没有 dropout)。
那么,两种实现的目的是什么?除非我遗漏了什么,否则将 LSTM 对象用作 LSTMCell 是微不足道的(或者,使用多个 LSTMCell 来创建 LSTM 对象非常容易)
是的,可以一个个模仿,分开来是为了效率。
LSTMCell
是一个接受参数的单元格:
- 形状批次输入×输入维度;
- 形状批次 x 隐藏维度的 LSTM 隐藏状态元组。
这是方程式的直接实现。
LSTM
是在 "for loop" 中应用一个 LSTM 单元(或多个 LSTM 单元)的层,但是使用 cuDNN 对循环进行了高度优化。它的输入是
- 一个three-dimensional shape batch×输入长度×输入维度的输入张量;
- 可选地,LSTM 的初始状态,即形状为 batch × hidden dim 的隐藏状态元组(如果 LSTM 是双向的,则为此类元组的元组)
您通常可能希望在不同的上下文中使用 LSTM 单元而不是将其应用于序列,即制作一个在 tree-like 结构上运行的 LSTM。当你在 sequence-to-sequence 模型中编写解码器时,你也在循环中调用单元格并在解码 end-of-sequence 符号时停止循环。
让我举一些具体的例子:
# 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)
主要区别:
- LSTM:参数
2
,代表num_layers
,循环层数。有seq_len * num_layers=5 * 2
个单元格。 没有循环,但有更多单元格。 - LSTMCell:在
for
循环中(seq_len=5
次),ith
个实例的每个输出将是(i+1)th
个实例的输入。只有一个单元格,Truly Recurrent
如果我们在LSTM中设置num_layers=1
或者再增加一个LSTMCell,上面的代码都是一样的
显然,在LSTM中更容易应用并行计算。