StaticRNN_cn.rst 9.1 KB
Newer Older
H
Hao Wang 已提交
1 2 3 4 5
.. _cn_api_fluid_layers_StaticRNN:

StaticRNN
-------------------------------

L
liuwei1031 已提交
6
:api_attr: 声明式编程模式(静态图)
7

H
Hao Wang 已提交
8 9
.. py:class:: paddle.fluid.layers.StaticRNN(name=None)

10 11 12 13
该OP用来处理一批序列数据,其中每个样本序列的长度必须相等。StaticRNN将序列按照时间步长展开,用户需要定义每个时间步中的处理逻辑。

参数:
  - **name** (str,可选) - 具体用法请参见 :ref:`api_guide_Name` ,一般无需设置,默认值为None。
H
Hao Wang 已提交
14

15
**代码示例**
H
Hao Wang 已提交
16 17 18

.. code-block:: python

19 20 21 22 23
      import paddle.fluid as fluid
      import paddle.fluid.layers as layers

      vocab_size, hidden_size=10000, 200
      x = layers.data(name="x", shape=[-1, 1, 1], dtype='int64')
H
Hao Wang 已提交
24

25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
      # 创建处理用的word sequence
      x_emb = layers.embedding(
          input=x,
          size=[vocab_size, hidden_size],
          dtype='float32',
          is_sparse=False)
      # 把batch size变换到第1维。
      x_emb = layers.transpose(x_emb, perm=[1, 0, 2])

      rnn = fluid.layers.StaticRNN()
      with rnn.step():
          # 将刚才创建的word sequence标记为输入,每个时间步取一个word处理。
          word = rnn.step_input(x_emb)
          # 创建memory变量作为prev,batch size来自于word变量。
          prev = rnn.memory(shape=[-1, hidden_size], batch_ref = word)
          hidden = fluid.layers.fc(input=[word, prev], size=hidden_size, act='relu')
          # 用处理完的hidden变量更新prev变量。
          rnn.update_memory(prev, hidden)
          # 把每一步处理后的hidden标记为输出序列。
          rnn.step_output(hidden)
      # 获取最终的输出结果
      result = rnn()
H
Hao Wang 已提交
47 48 49

.. py:method:: step()

50
定义在每个时间步执行的操作。step用在with语句中,with语句中定义的OP会被执行sequence_len次(sequence_len是输入序列的长度)。
H
Hao Wang 已提交
51 52 53 54


.. py:method:: memory(init=None, shape=None, batch_ref=None, init_value=0.0, init_batch_dim_idx=0, ref_batch_dim_idx=1)
 
55
为静态RNN创建一个内存变量。
56
如果init不为None,则用init将初始化memory。 如果init为None,则必须设置shape和batch_ref,函数会使用shape和batch_ref创建新的Variable来初始化init。
H
Hao Wang 已提交
57

58
参数:
59 60 61 62 63 64
  - **init** (Variable,可选) - 用来初始化memory的Tensor。如果没有设置,则必须提供shape和batch_ref参数。默认值None。
  - **shape** (list|tuple) - 当init为None时用来设置memory的维度,注意不包括batch_size。默认值None。
  - **batch_ref** (Variable,可选) - 当init为None时,memory变量的batch size会设置为该batch_ref变量的ref_batch_dim_idx轴。默认值None。
  - **init_value** (float,可选) - 当init为None时用来设置memory的初始值,默认值0.0。
  - **init_batch_dim_idx** (int,可选) - init变量的batch_size轴,默认值0。
  - **ref_batch_dim_idx** (int,可选) - batch_ref变量的batch_size轴,默认值1。
H
Hao Wang 已提交
65

66
返回:返回创建的memory变量。
H
Hao Wang 已提交
67

68
返回类型;Variable
H
Hao Wang 已提交
69

70 71

**代码示例一**
H
Hao Wang 已提交
72

73
.. code-block:: python
H
Hao Wang 已提交
74

75 76 77 78 79
      import paddle.fluid as fluid
      import paddle.fluid.layers as layers

      vocab_size, hidden_size=10000, 200
      x = layers.data(name="x", shape=[-1, 1, 1], dtype='int64')
80 81

      # 创建处理用的word sequence
82 83 84 85 86
      x_emb = layers.embedding(
          input=x,
          size=[vocab_size, hidden_size],
          dtype='float32',
          is_sparse=False)
87
      # 把batch size变换到第1维。
88 89 90 91
      x_emb = layers.transpose(x_emb, perm=[1, 0, 2])

      rnn = fluid.layers.StaticRNN()
      with rnn.step():
92
          # 将刚才创建的word sequence标记为输入,每个时间步取一个word处理。
93
          word = rnn.step_input(x_emb)
94
          # 创建memory变量作为prev,batch size来自于word变量。
95 96
          prev = rnn.memory(shape=[-1, hidden_size], batch_ref = word)
          hidden = fluid.layers.fc(input=[word, prev], size=hidden_size, act='relu')
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
          # 用处理完的hidden变量更新prev变量。
          rnn.update_memory(prev, hidden)

**代码示例二**

.. code-block:: python

      import paddle.fluid as fluid
      import paddle.fluid.layers as layers

      vocab_size, hidden_size=10000, 200
      x = layers.data(name="x", shape=[-1, 1, 1], dtype='int64')

      # 创建处理用的word sequence
      x_emb = layers.embedding(
          input=x,
          size=[vocab_size, hidden_size],
          dtype='float32',
          is_sparse=False)
      # 把batch size变换到第1维。
      x_emb = layers.transpose(x_emb, perm=[1, 0, 2])
      boot_memory = fluid.layers.data(name='boot', shape=[hidden_size], dtype='float32', lod_level=1)

      rnn = fluid.layers.StaticRNN()
      with rnn.step():
          # 将刚才创建的word sequence标记为输入,每个时间步取一个word处理。
          word = rnn.step_input(x_emb)
          # 用init初始化memory。
          prev = rnn.memory(init=boot_memory)
          hidden = fluid.layers.fc(input=[word, prev], size=hidden_size, act='relu')
          # 用处理完的hidden变量更新prev变量。
128
          rnn.update_memory(prev, hidden)
H
Hao Wang 已提交
129 130 131

.. py:method:: step_input(x)

132
标记StaticRNN的输入序列。
H
Hao Wang 已提交
133

134 135
参数:
  - **x** (Variable) – 输入序列,x的形状应为[seq_len, ...]。
H
Hao Wang 已提交
136

137
返回:输入序列中当前时间步的数据。
H
Hao Wang 已提交
138

139
返回类型:Variable
H
Hao Wang 已提交
140 141


142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
**代码示例**

.. code-block:: python

      import paddle.fluid as fluid
      import paddle.fluid.layers as layers

      vocab_size, hidden_size=10000, 200
      x = layers.data(name="x", shape=[-1, 1, 1], dtype='int64')

      # 创建处理用的word sequence
      x_emb = layers.embedding(
          input=x,
          size=[vocab_size, hidden_size],
          dtype='float32',
          is_sparse=False)
      # 把batch size变换到第1维。
      x_emb = layers.transpose(x_emb, perm=[1, 0, 2])

      rnn = fluid.layers.StaticRNN()
      with rnn.step():
          # 将刚才创建的word sequence标记为输入,每个时间步取一个word处理。
          word = rnn.step_input(x_emb)
          # 创建memory变量作为prev,batch size来自于word变量。
          prev = rnn.memory(shape=[-1, hidden_size], batch_ref = word)
          hidden = fluid.layers.fc(input=[word, prev], size=hidden_size, act='relu')
          # 用处理完的hidden变量更新prev变量。
          rnn.update_memory(prev, hidden)

H
Hao Wang 已提交
171 172
.. py:method:: step_output(o)

173
标记StaticRNN输出的序列。
H
Hao Wang 已提交
174

175 176
参数:
  -**o** (Variable) – 输出序列
H
Hao Wang 已提交
177

178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210
返回:无


**代码示例**

.. code-block:: python

      import paddle.fluid as fluid
      import paddle.fluid.layers as layers

      vocab_size, hidden_size=10000, 200
      x = layers.data(name="x", shape=[-1, 1, 1], dtype='int64')

      # 创建处理用的word sequence
      x_emb = layers.embedding(
          input=x,
          size=[vocab_size, hidden_size],
          dtype='float32',
          is_sparse=False)
      # 把batch size变换到第1维。
      x_emb = layers.transpose(x_emb, perm=[1, 0, 2])

      rnn = fluid.layers.StaticRNN()
      with rnn.step():
          # 将刚才创建的word sequence标记为输入,每个时间步取一个word处理。
          word = rnn.step_input(x_emb)
          # 创建memory变量作为prev,batch size来自于word变量。
          prev = rnn.memory(shape=[-1, hidden_size], batch_ref = word)
          hidden = fluid.layers.fc(input=[word, prev], size=hidden_size, act='relu')
          # 用处理完的hidden变量更新prev变量。
          rnn.update_memory(prev, hidden)
          # 把每一步处理后的hidden标记为输出序列。
          rnn.step_output(hidden)
H
Hao Wang 已提交
211

212
      result = rnn()
H
Hao Wang 已提交
213 214 215

.. py:method:: output(*outputs)

216
标记StaticRNN输出变量。
H
Hao Wang 已提交
217

218
参数:
219
  -**outputs** – 输出Tensor,可同时将多个Variable标记为输出。
H
Hao Wang 已提交
220

221
返回:无
H
Hao Wang 已提交
222 223


224
**代码示例**
H
Hao Wang 已提交
225

226
.. code-block:: python
H
Hao Wang 已提交
227

228 229
      import paddle.fluid as fluid
      import paddle.fluid.layers as layers
H
Hao Wang 已提交
230

231 232
      vocab_size, hidden_size=10000, 200
      x = layers.data(name="x", shape=[-1, 1, 1], dtype='int64')
H
Hao Wang 已提交
233

234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252
      # 创建处理用的word sequence
      x_emb = layers.embedding(
          input=x,
          size=[vocab_size, hidden_size],
          dtype='float32',
          is_sparse=False)
      # 把batch size变换到第1维。
      x_emb = layers.transpose(x_emb, perm=[1, 0, 2])

      rnn = fluid.layers.StaticRNN()
      with rnn.step():
          # 将刚才创建的word sequence标记为输入,每个时间步取一个word处理。
          word = rnn.step_input(x_emb)
          # 创建memory变量作为prev,batch size来自于word变量。
          prev = rnn.memory(shape=[-1, hidden_size], batch_ref = word)
          hidden = fluid.layers.fc(input=[word, prev], size=hidden_size, act='relu')
          # 用处理完的hidden变量更新prev变量。
          rnn.update_memory(prev, hidden)
          # 把每一步的hidden和word标记为输出。
253
          rnn.output(hidden, word)
H
Hao Wang 已提交
254

255
      result = rnn()
H
Hao Wang 已提交
256 257


258
.. py:method:: update_memory(mem, var)
H
Hao Wang 已提交
259 260


261
将memory从mem更新为var。
H
Hao Wang 已提交
262

263 264 265
参数:    
  - **mem** (Variable) – memory接口定义的变量。
  - **var** (Variable) – RNN块中的变量,用来更新memory。var的维度和数据类型必须与mem一致。
H
Hao Wang 已提交
266

267
返回:无
H
Hao Wang 已提交
268

269
代码示例参考前述示例。
H
Hao Wang 已提交
270