提交 04e2f3e4 编写于 作者: Y Yi Wang 提交者: GitHub

Merge pull request #4619 from wangkuiyi/update_ifelseop_design

Update if_else_op.md 
IfOp should have only one branch. An IfOp operator takes a `cond` variable whose value must be a vector of N boolean elements. Its return value has N instances. If cond[i] == True, input instance input[i] will go through true_block() and generate output[i]; otherwise it will produce output from false_bloack(). # The `IfElse` Operator
```python PaddlePaddle's `IfElse` operator differs from TensorFlow's:
import paddle as pd
x = var() - the TensorFlow version takes a scalar boolean value as the condition so that the whole mini-batch goes to either the true or the false branch, whereas
y = var() - the PaddlePaddle version takes a vector of boolean value as the condition, and instances corresponding to true values go to the true branch, those corresponding to false values go to the false branch.
cond = var()
default_value = var() ## Example
b = pd.create_ifelseop(inputs=[x], output_num=1)
with b.true_block(): The following PaddlePaddle program shows the usage of the IfElse operator:
x = b.inputs(0)
z = operator.add(x, y)
b.set_output(0, operator.softmax(z))
with b.false_block():
x = b.inputs(0)
z = layer.fc(x)
b.set_output(0, operator.softmax(z))
out = b(cond)
```
If only true_block is set in an IfElseOp, a special case is that we can have a default value for false as:
```python ```python
import paddle as pd import paddle as pd
x = var() x = minibatch([10, 20, 30]) # shape=[None, 1]
y = var() y = var(1) # shape=[1], value=1
cond = var() z = minibatch([10, 20, 30]) # shape=[None, 1]
default_value = var() cond = larger_than(x, 15) # [false, true, true]
b = pd.create_ifelseop(inputs=[x], output_num=1, default_value)
ie = pd.ifelse()
with b.true_block(): with ie.true_block():
x = b.inputs(0) d = pd.layer.add(x, y)
z = operator.add(x, y) ie.output(d, pd.layer.softmax(d))
b.set_output(0, operator.softmax(z)) with ie.false_block():
d = pd.layer.fc(z)
ie.output(d, d+1)
o1, o2 = ie(cond)
```
out = b(cond) A challenge to implement the `IfElse` operator is to infer those variables to be split, or, say, to identify the variable of the mini-batch or those derived from the mini-batch.
An equivalent C++ program is as follows:
```c++
namespace pd = paddle;
int x = 10;
int y = 1;
int z = 10;
bool cond = false;
int o1, o2;
if (cond) {
int d = x + y;
o1 = z;
o2 = pd::layer::softmax(z);
} else {
int d = pd::layer::fc(z);
o1 = d;
o2 = d+1;
}
``` ```
where default_value is a list of vars for `cond` == False.
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册