提交 868c7049 编写于 作者: G gfwm2013

Modify chinese documents of While and while_loop

test=develop
上级 afcfae7b
...@@ -14,12 +14,15 @@ While ...@@ -14,12 +14,15 @@ While
如果参数 ``cond`` 的形状为[1],强烈建议您使用新的OP :ref:`cn_api_fluid_layers_while_loop` 而不是 ``While``。 如果参数 ``cond`` 的形状为[1],强烈建议您使用新的OP :ref:`cn_api_fluid_layers_while_loop` 而不是 ``While``。
OP :ref:`cn_api_fluid_layers_while_loop` 的使用方式更简单,并且调用该OP所用的代码更少且功能与 ``While`` 一样。 OP :ref:`cn_api_fluid_layers_while_loop` 的使用方式更简单,并且调用该OP所用的代码更少且功能与 ``While`` 一样。
``While`` 类似于C++中的while,在 ``While`` 中创建的局部变量是无法通过 ``Executor`` 中的 ``fetch_list`` 来捕获的。
若想实现该功能,请参考示例代码2 或参考 `issue#22724 <https://github.com/PaddlePaddle/Paddle/issues/22724>`_ 。
参数: 参数:
- **cond** (Variable) – 用于判断循环继续进行的条件,为数据类型bool型的Tensor,其shape必须为[1]。 - **cond** (Variable) – 用于判断循环继续进行的条件,为数据类型bool型的Tensor,其shape必须为[1]。
- **is_test** (bool,可选) – 用于表明是否在测试阶段执行,默认值为False。 - **is_test** (bool,可选) – 用于表明是否在测试阶段执行,默认值为False。
- **name** (str,可选) - 具体用法请参见 :ref:`api_guide_Name` ,一般无需设置,默认值为None。 - **name** (str,可选) - 具体用法请参见 :ref:`api_guide_Name` ,一般无需设置,默认值为None。
**代码示例** **代码示例 1**
.. code-block:: python .. code-block:: python
...@@ -44,13 +47,32 @@ While ...@@ -44,13 +47,32 @@ While
print(res) # [array([10])] print(res) # [array([10])]
**代码示例 2**
.. code-block:: python
import paddle.fluid as fluid
import numpy as np
i = fluid.layers.fill_constant(shape=[1], dtype='int64', value=0)
loop_len = fluid.layers.fill_constant(shape=[1], dtype='int64', value=10)
one = fluid.layers.fill_constant(shape=[1], dtype='float32', value=1)
data = fluid.data(name='data', shape=[1], dtype='float32')
sums = fluid.layers.fill_constant(shape=[1], dtype='float32', value=0) # 在 While 外先定义要捕获的变量,需和要捕获的 While 内部的变量名称不同
cond = fluid.layers.less_than(x=i, y=loop_len)
while_op = fluid.layers.While(cond=cond)
with while_op.block():
sums_tensor = fluid.layers.elementwise_add(x=data, y=data)
fluid.layers.assign(input=sums_tensor, output=sums) # 将 While 内定义的变量 sums_tenosr 通过 layers.assign 更新至 While 外的变量 sums 中
i = fluid.layers.increment(x=i, value=1, in_place=True)
data = fluid.layers.elementwise_add(x=data, y=one)
fluid.layers.less_than(x=i, y=loop_len, cond=cond)
feed_data = np.ones([1]).astype('float32')
exe = fluid.Executor(fluid.CPUPlace())
exe.run(fluid.default_startup_program())
res = exe.run(fluid.default_main_program(), feed={'data': feed_data}, fetch_list=sums)
print(res[0]) # [2.] # 因 While 内的 data 没有将值更新到 While 外,故循环过后此处 sums 的值为 [2.]
...@@ -10,6 +10,10 @@ ____________________________________ ...@@ -10,6 +10,10 @@ ____________________________________
该API用于实现类似while的循环控制功能,只要循环条件 ``cond`` 的返回值为True,``while_loop`` 则会循环执行循环体 ``body`` ,直到 ``cond`` 的返回值为False。 该API用于实现类似while的循环控制功能,只要循环条件 ``cond`` 的返回值为True,``while_loop`` 则会循环执行循环体 ``body`` ,直到 ``cond`` 的返回值为False。
**注意**:
``body`` 中定义的局部变量无法使用 ``Executor`` 的 ``fetch_list`` 来捕获的,变量需在 ``body`` 外定义并将其置于 ``loop_vars`` 中进行循环更新后才可通过 ``fetch_list`` 捕获。
参数: 参数:
- **cond** (callable) - 返回boolean类型张量的可调用函数,用以判断循环是否继续执行。 ``cond`` 的参数和 ``loop_vars`` 相对应。 - **cond** (callable) - 返回boolean类型张量的可调用函数,用以判断循环是否继续执行。 ``cond`` 的参数和 ``loop_vars`` 相对应。
- **body** (callable) - 循环执行的结构体。其返回一个包含tensor或LoDTensorArray的列表或元组,且这些tensor或LoDTensorArray的长度,结构,类型和 ``loop_vars`` 中的相同。 且``body`` 的参数与 ``loop_vars`` 相对应。 - **body** (callable) - 循环执行的结构体。其返回一个包含tensor或LoDTensorArray的列表或元组,且这些tensor或LoDTensorArray的长度,结构,类型和 ``loop_vars`` 中的相同。 且``body`` 的参数与 ``loop_vars`` 相对应。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册