From 544c76f15e2158bdf5fa175c500c4c475d450cec Mon Sep 17 00:00:00 2001 From: Zhaolong Xing Date: Fri, 11 Oct 2019 20:29:08 +0800 Subject: [PATCH] refine ifelse api doc (#1456) test=develop --- doc/fluid/api_cn/layers_cn/IfElse_cn.rst | 37 ++++++++++++------------ 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/doc/fluid/api_cn/layers_cn/IfElse_cn.rst b/doc/fluid/api_cn/layers_cn/IfElse_cn.rst index 77a9a60ae..8e2e7773a 100644 --- a/doc/fluid/api_cn/layers_cn/IfElse_cn.rst +++ b/doc/fluid/api_cn/layers_cn/IfElse_cn.rst @@ -5,7 +5,7 @@ IfElse .. py:class:: paddle.fluid.layers.IfElse(cond, name=None) -该类用于实现IfElse分支控制功能, IfElse包含两个Block,true_block, false_block,IfElse会将满足True或False条件的数据分别放入不同的block运行。 +该类用于实现IfElse分支控制功能, IfElse包含两个Block,true_block,false_block,IfElse会将满足True或False条件的数据分别放入不同的block运行。 cond是一个shape为[N, 1]、数据类型为bool的2-D tensor,表示输入数据对应部分的执行条件。 @@ -14,20 +14,20 @@ IfElse OP同其他的OP在使用上有一定的区别,可能会对一些用户 .. code-block:: python - # 以下代码完成的功能:对x中大于0的数据减去10,对x中小于0的数据加上10 + # 以下代码完成的功能:对x中大于0的数据减去10,对x中小于0的数据加上10,并将所有的数据求和 import numpy as np import paddle.fluid as fluid x = fluid.layers.data(name='x', shape=[4, 1], dtype='float32', append_batch_size=False) y = fluid.layers.data(name='y', shape=[4, 1], dtype='float32', append_batch_size=False) - x_d = np.array([[3], [1], [-1], [-3]]).astype(np.float32) + x_d = np.array([[3], [1], [-2], [-3]]).astype(np.float32) y_d = np.zeros((4, 1)).astype(np.float32) # 比较x, y对元素的大小,输出cond, cond是shape为[4, 1],数据类型为bool的2-D tensor。 # 根据输入数据x_d, y_d,可以推断出cond中的数据为[[true], [true], [false], [false]] cond = fluid.layers.greater_than(x, y) - # 同其他常见OP不同的是,该OP返回的ie不是Variable而是一个IfElse OP的对象 + # 同其他常见OP不同的是,该OP返回的ie是一个IfElse OP的对象 ie = fluid.layers.IfElse(cond) with ie.true_block(): @@ -41,18 +41,18 @@ IfElse OP同其他的OP在使用上有一定的区别,可能会对一些用户 out_1 = out_1 + 10 ie.output(out_1) - # 根据cond条件将两个block中处理后的数据进行合并,此处的output为输出的Variable - output = ie() + # 根据cond条件将两个block中处理后的数据进行合并,此处的output为输出,类型为List,List中的元素类型为Variable。 + output = ie() # [array([[-7.], [-9.], [ 8.], [ 7.]], dtype=float32)] + + # 将输出List中的第一个Variable获取出来,并计算所有元素和 + out = fluid.layers.reduce_sum(output[0]) exe = fluid.Executor(fluid.CPUPlace()) exe.run(fluid.default_startup_program()) - res = exe.run(fluid.default_main_program(), feed={"x":x_d, "y":y_d}, fetch_list=[output[0]]) + res = exe.run(fluid.default_main_program(), feed={"x":x_d, "y":y_d}, fetch_list=[out]) print res - # [array([[-7.], - # [-9.], - # [ 9.], - # [ 7.]], dtype=float32)] + # [array([-1.], dtype=float32)] 参数: - **cond** (Variable)- cond是一个shape为[N, 1]、数据类型为bool的2-D tensor,表示N个输入数据的对应的执行条件。数据类型为bool。 @@ -60,18 +60,17 @@ IfElse OP同其他的OP在使用上有一定的区别,可能会对一些用户 **返回:** -同其他常见OP不同的是:该OP调用返回一个IfElse OP对象(如例子中的 ie)而非Variable,需要调用对象内部函数对不同cond下的输入进行处理。 +同其他常见OP不同的是,该OP调用返回一个IfElse OP对象(如例子中的 ie),通过调用对象内部函数 ``true_block()`` , ``false_block()`` , ``input()`` , ``output()`` 对输入数据进行分支处理, +通过调用内部的 ``__call__()`` 函数,将不同分支处理的数据进行整合,作为整体的输出,输出类型为列表,列表中每个元素的类型为Variable。 **内部函数:** -通过调用对象中的 ``with ie.true_block()`` 函数构建block,将条件为true下的计算逻辑放入此block中。如果没有构建相应的block,则对应条件维度下的输入数据不做改变。 - -``out = ie.input(x)`` 会将x中对应条件维度的数据获取出来放入到out中,支持block内部处理多个输入。 - -``ie.output(out)`` 会将结果写入对应条件的输出中。 - -对象内部有 ``__call__()`` 函数,即通过对 ``output = ie()`` 的调用,将条件分别为True,False的block内部所有的输出进行融合作为整体的输出,输出的类型为列表,列表中每个元素的类型为Variable。 +- 通过调用对象中的 ``with ie.true_block()`` 函数构建block,将条件为true下的计算逻辑放入此block中。如果没有构建相应的block,则对应条件维度下的输入数据不做改变。 +- 通过调用对象中的 ``with ie.false_block()`` 函数构建block,将条件为false下的计算逻辑放入此block中。如果没有构建相应的block,则对应条件维度下的输入数据不做改变。 +- ``out = ie.input(x)`` 会将x中对应条件维度的数据获取出来放入到out中,支持block内部处理多个输入。 +- ``ie.output(out)`` 会将结果写入对应条件的输出中。 +- 对象内部有 ``__call__()`` 函数,即通过对 ``output = ie()`` 的调用,将条件分别为True,False的block内部所有的输出进行融合作为整体的输出,输出的类型为列表,列表中每个元素的类型为Variable。 -- GitLab