52 lines
1.3 KiB
52 lines
1.3 KiB
# The `IfElse` Operator
|
|
|
|
PaddlePaddle's `IfElse` operator differs from TensorFlow's:
|
|
|
|
- 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
|
|
- 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.
|
|
|
|
## Example
|
|
|
|
The following PaddlePaddle program shows the usage of the IfElse operator:
|
|
|
|
```python
|
|
import paddle as pd
|
|
|
|
x = minibatch([10, 20, 30]) # shape=[None, 1]
|
|
y = var(1) # shape=[1], value=1
|
|
z = minibatch([10, 20, 30]) # shape=[None, 1]
|
|
cond = larger_than(x, 15) # [false, true, true]
|
|
|
|
ie = pd.ifelse()
|
|
with ie.true_block():
|
|
d = pd.layer.add(x, y)
|
|
ie.output(d, pd.layer.softmax(d))
|
|
with ie.false_block():
|
|
d = pd.layer.fc(z)
|
|
ie.output(d, d+1)
|
|
o1, o2 = ie(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;
|
|
}
|
|
```
|