while_loop

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

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

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

  • 参数:
    • 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.  
  5. def cond(i, ten): # 参数和loop_vars相对应
  6. return i < ten
  7.  
  8. def body(i, ten): # 参数和loop_vars相对应
  9. i = i + 1
  10. return [i, ten]
  11.  
  12. main_program = fluid.default_main_program()
  13. startup_program = fluid.default_startup_program()
  14. with fluid.program_guard(main_program, startup_program):
  15. i = layers.fill_constant(shape=[1], dtype='int64', value=0) # 循环计数器
  16. ten = layers.fill_constant(shape=[1], dtype='int64', value=10) # 循环次数
  17. i, ten = layers.while_loop(cond, body, [i, ten])
  18.  
  19. exe = fluid.Executor(fluid.CPUPlace())
  20. res = exe.run(main_program, feed={}, fetch_list=[i])
  21. print(res) #[array([10])]