View source on GitHub |
Create a switch/case operation, i.e. an integer-indexed conditional.
tf.switch_case( branch_index, branch_fns, default=None, name='switch_case' )
See also tf.case
.
This op can be substantially more efficient than tf.case
when exactly one branch will be selected. tf.switch_case
is more like a C++ switch/case statement than tf.case
, which is more like an if/elif/elif/else chain.
The branch_fns
parameter is either a list of (int, callable) pairs, or simply a list of callables (in which case the index is implicitly the key). The branch_index
Tensor
is used to select an element in branch_fns
with matching int
key, falling back to default
if none match, or max(keys)
if no default
is provided. The keys must form a contiguous set from 0
to len(branch_fns) - 1
.
tf.switch_case
supports nested structures as implemented in tf.nest
. All callables must return the same (possibly nested) value structure of lists, tuples, and/or named tuples.
Example:
switch (branch_index) { // c-style switch case 0: return 17; case 1: return 31; default: return -1; }
or
branches = {0: lambda: 17, 1: lambda: 31} branches.get(branch_index, lambda: -1)()
def f1(): return tf.constant(17) def f2(): return tf.constant(31) def f3(): return tf.constant(-1) r = tf.switch_case(branch_index, branch_fns={0: f1, 1: f2}, default=f3) # Equivalent: tf.switch_case(branch_index, branch_fns={0: f1, 1: f2, 2: f3})
Args | |
---|---|
branch_index | An int Tensor specifying which of branch_fns should be executed. |
branch_fns | A list of (int, callable) pairs, or simply a list of callables (in which case the index serves as the key). Each callable must return a matching structure of tensors. |
default | Optional callable that returns a structure of tensors. |
name | A name for this operation (optional). |
Returns | |
---|---|
The tensors returned by the callable identified by branch_index , or those returned by default if no key matches and default was provided, or those returned by the max-keyed branch_fn if no default is provided. |
Raises | |
---|---|
TypeError | If branch_fns is not a list/dictionary. |
TypeError | If branch_fns is a list but does not contain 2-tuples or callables. |
TypeError | If fns[i] is not callable for any i, or default is not callable. |
branch_fns
could be a dictionary in v1. However, tf.Tensor and tf.Variable are no longer hashable in v2, so cannot be used as a key for a dictionary. Please use a list or a tuple instead.
© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/switch_case