lstm

查看属性与别名

API属性:声明式编程(静态图)专用API

paddle.fluid.layers.lstm ( input, init_h, init_c, max_len, hidden_size, num_layers, dropout_prob=0.0, is_bidirec=False, is_test=False, name=None, default_initializer=None, seed=-1 ) [源代码]

注解

该OP仅支持 GPU 设备运行

该OP实现了 LSTM,即 Long-Short Term Memory(长短期记忆)运算 - Hochreiter, S., & Schmidhuber, J. (1997)

该OP的实现不包括 diagonal/peephole 连接,参见 Gers, F. A., & Schmidhuber, J. (2000)。 如果需要使用 peephole 连接方法,请使用 dynamic_lstm

该OP对于序列中每一个时间步的计算公式如下:

lstm - 图1

lstm - 图2

lstm - 图3

lstm - 图4

lstm - 图5

lstm - 图6

公式中的概念信息如下:

  • lstm - 图7

    表示时间步

    lstm - 图8

    的输入

  • lstm - 图9

    表示时间步

    lstm - 图10

    的 hidden 状态

  • lstm - 图11

    分别表示前一个时间步的 hidden 和 cell 状态

  • lstm - 图12

    表示候选的 cell 状态

  • lstm - 图13

    lstm - 图14

    lstm - 图15

    分别为 input gate,forget gate,output gate

  • lstm - 图16

    表示 weight (例如,

    lstm - 图17

    是在计算 input gate

    lstm - 图18

    时,对输入

    lstm - 图19

    做线性变换的 weight)

  • lstm - 图20

    表示 bias (例如,

    lstm - 图21

    是 input gate 的 bias)

  • lstm - 图22

    表示 gate 的非线性激活函数,默认为 sigmoid

  • lstm - 图23

    表示矩阵的 Hadamard product,即对两个维度相同的矩阵,将相同位置的元素相乘,得到另一个维度相同的矩阵

参数

  • input ( Variable ) - LSTM的输入张量,维度为

    lstm - 图24

    的 3-D Tensor,其中 seq_len 为序列的长度, input_dim 为序列词嵌入的维度。数据类型为 float32 或者 float64。

  • init_h ( Variable ) – LSTM的初始 hidden 状态,维度为

    lstm - 图25

    的 3-D Tensor,其中 num_layers 是LSTM的总层数,hidden_size 是隐层维度。 如果is_bidirec = True, 维度应该为

    lstm - 图26

    。数据类型为 float32 或者 float64。

  • init_c ( Variable ) - LSTM的初始 cell 状态。维度为

    lstm - 图27

    的 3-D Tensor,其中 num_layers 是LSTM的总层数,hidden_size 是隐层维度。 如果is_bidirec = True, 维度应该为

    lstm - 图28

    。数据类型为 float32 或者 float64。

  • max_len (int) – LSTM的最大长度。输入张量的第一个 input_dim 不能大于 max_len。
  • hidden_size (int) - LSTM hidden 状态的维度。
  • num_layers (int) – LSTM的总层数。例如,该参数设置为2,则会堆叠两个LSTM,其第一个LSTM的输出会作为第二个LSTM的输入。
  • dropout_prob (float,可选) – dropout比例,dropout 只在 rnn 层之间工作,而不是在时间步骤之间。dropout 不作用于最后的 rnn 层的 rnn 输出中。默认值为 0.0。
  • is_bidirec (bool,可选) – 是否是双向的LSTM。默认值为 False。
  • is_test (bool,可选) – 是否在测试阶段。默认值为 False。
  • name (str,可选) - 具体用法请参见 Name ,一般无需设置,默认值为None。
  • default_initializer (Initializer,可选) – 用于初始化权重的初始化器,如果为None,将进行默认初始化。默认值为 None。
  • seed (int,可选) – LSTM中dropout的seed,如果是-1,dropout将使用随机seed。默认值为 1。

返回

经过lstm运算输出的三个Tensor的tuple,包括

  • rnn_out:LSTM hidden的输出结果的Tensor,数据类型与input一致,维度为

    lstm - 图29

    。如果 is_bidirec 设置为True,则维度为

    lstm - 图30

  • last_h:LSTM最后一步的hidden状态的Tensor,数据类型与input一致,维度为

    lstm - 图31

    。如果 is_bidirec 设置为True,则维度为

    lstm - 图32

  • last_c:LSTM最后一步的cell状态的Tensor,数据类型与input一致,维度为

    lstm - 图33

    。如果 is_bidirec 设置为True,则维度为

    lstm - 图34

返回类型

tuple( Variable , Variable , Variable

代码示例

  1. import paddle.fluid as fluid
  2. import paddle.fluid.layers as layers
  3. emb_dim = 256
  4. vocab_size = 10000
  5. data = fluid.layers.data(name='x', shape=[-1, 100, 1],
  6. dtype='int64')
  7. emb = fluid.layers.embedding(input=data, size=[vocab_size, emb_dim], is_sparse=True)
  8. batch_size = 20
  9. max_len = 100
  10. dropout_prob = 0.2
  11. hidden_size = 150
  12. num_layers = 1
  13. init_h = layers.fill_constant( [num_layers, batch_size, hidden_size], 'float32', 0.0 )
  14. init_c = layers.fill_constant( [num_layers, batch_size, hidden_size], 'float32', 0.0 )
  15. rnn_out, last_h, last_c = layers.lstm(emb, init_h, init_c, max_len, hidden_size, num_layers, dropout_prob=dropout_prob)
  16. rnn_out.shape # (-1, 100, 150)
  17. last_h.shape # (1, 20, 150)
  18. last_c.shape # (1, 20, 150)