while_loop

查看属性与别名

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

paddle.fluid.layers.while_loop ( cond, body, loop_vars, is_test=False, name=None ) [源代码]

该API用于实现类似while的循环控制功能,只要循环条件 cond 的返回值为True,while_loop 则会循环执行循环体 body ,直到 cond 的返回值为False。

注意:

body 中定义的局部变量无法使用 Executorfetch_list 来获取的,变量需在 body 外定义并将其置于 loop_vars 中进行循环更新后才可通过 fetch_list 获取。

参数

  • cond (callable) - 返回boolean类型张量的可调用函数,用以判断循环是否继续执行。 cond 的参数和 loop_vars 相对应。
  • body (callable) - 循环执行的结构体。其返回一个包含tensor或LoDTensorArray的列表或元组,且这些tensor或LoDTensorArray的长度,结构,类型和 loop_vars 中的相同。 且``body`` 的参数与 loop_vars 相对应。
  • loop_vars (list|tuple) - 包含tensor或LoDTensorArray的列表或是元组,将其传入至 condbody 中,得到循环条件和输出值。
  • is_test (bool,可选) - 用于表明是否在测试阶段执行,默认值为False。
  • name (str,可选) - 具体用法请参见 Name。一般无需设置,默认值为None。

返回

循环迭代之后 body 的返回值,和 loop_vars 具有相同的结构。

返回类型

list|tuple

异常抛出:

  • TypeError:若 cond 不是可调用的。
  • TypeError:若 body 不是可调用的。
  • TypeError:若 loop_vars 不是列表或是元组。
  • TypeError:若 cond 返回值不是变量。
  • TypeError:若 cond 返回值不是boolean类型的variable。
  • TypeError:若 cond 返回值的shape不等于1。
  • ValueError:若 loop_vars 为空。
  • ValueError:若 cond 返回值的长度和类型和 loop_vars 不同。

代码示例

  1. # 该示例代码展示整数循环+1,循环10次,输出计数结果
  2. import paddle.fluid as fluid
  3. import paddle.fluid.layers as layers
  4. def cond(i, ten): # 参数和loop_vars相对应
  5. return i < ten
  6. def body(i, ten): # 参数和loop_vars相对应
  7. i = i + 1
  8. return [i, ten]
  9. main_program = fluid.default_main_program()
  10. startup_program = fluid.default_startup_program()
  11. with fluid.program_guard(main_program, startup_program):
  12. i = layers.fill_constant(shape=[1], dtype='int64', value=0) # 循环计数器
  13. ten = layers.fill_constant(shape=[1], dtype='int64', value=10) # 循环次数
  14. i, ten = layers.while_loop(cond, body, [i, ten])
  15. exe = fluid.Executor(fluid.CPUPlace())
  16. res = exe.run(main_program, feed={}, fetch_list=[i])
  17. print(res) #[array([10])]