While_cn.rst 3.5 KB
Newer Older
H
Hao Wang 已提交
1 2 3 4 5
.. _cn_api_fluid_layers_While:

While
-------------------------------

6 7
**注意:该API仅支持【静态图】模式**

H
Hao Wang 已提交
8 9 10
.. py:class:: paddle.fluid.layers.While (cond, is_test=False, name=None)


P
Pei Yang 已提交
11
该类用于实现while循环控制功能,只要循环条件cond为True,就循环执行while循环体中的语句,直到cond为False为止。
H
Hao Wang 已提交
12

L
liym27 已提交
13 14 15
.. note::
    如果参数 ``cond`` 的形状为[1],强烈建议您使用新的OP :ref:`cn_api_fluid_layers_while_loop` 而不是 ``While``。
    OP :ref:`cn_api_fluid_layers_while_loop` 的使用方式更简单,并且调用该OP所用的代码更少且功能与 ``While`` 一样。
H
Hao Wang 已提交
16

17 18 19
    ``While`` 类似于C++中的while,在 ``While`` 中创建的局部变量是无法通过 ``Executor`` 中的 ``fetch_list`` 来捕获的。
    若想实现该功能,请参考示例代码2 或参考 `issue#22724 <https://github.com/PaddlePaddle/Paddle/issues/22724>`_ 。

H
Hao Wang 已提交
20
参数:
P
Pei Yang 已提交
21 22
    - **cond** (Variable) – 用于判断循环继续进行的条件,为数据类型bool型的Tensor,其shape必须为[1]。
    - **is_test** (bool,可选) – 用于表明是否在测试阶段执行,默认值为False。
P
Pei Yang 已提交
23
    - **name** (str,可选) - 具体用法请参见 :ref:`api_guide_Name` ,一般无需设置,默认值为None。
H
Hao Wang 已提交
24

25
**代码示例 1**
H
Hao Wang 已提交
26 27 28

..  code-block:: python

P
Pei Yang 已提交
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
    # 该示例代码展示整数循环+1,循环10次,输出计数结果
    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)    # 循环次数

    cond = fluid.layers.less_than(x=i, y=loop_len)              # 循环条件   
    while_op = fluid.layers.While(cond=cond)
    with while_op.block():  # 循环体
        i = fluid.layers.increment(x=i, value=1, in_place=True)
        fluid.layers.less_than(x=i, y=loop_len, cond=cond)      # 更新循环条件

    exe = fluid.Executor(fluid.CPUPlace())
    exe.run(fluid.default_startup_program())

    res = exe.run(fluid.default_main_program(), feed={}, fetch_list=[i])
    print(res) # [array([10])]

H
Hao Wang 已提交
49

50
**代码示例 2**
H
Hao Wang 已提交
51

52
..  code-block:: python
H
Hao Wang 已提交
53

54 55
    import paddle.fluid as fluid
    import numpy as np
H
Hao Wang 已提交
56

57 58 59 60
    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')
H
Hao Wang 已提交
61

62
    sums = fluid.layers.fill_constant(shape=[1], dtype='float32', value=0)  # 在 While 外先定义要捕获的变量,需和要捕获的 While 内部的变量名称不同
H
Hao Wang 已提交
63

64 65 66 67 68 69 70 71
    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)
H
Hao Wang 已提交
72

73 74 75 76 77
    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.]
H
Hao Wang 已提交
78