View source on GitHub |
Bijector which applies a sequence of bijectors.
Inherits From: Bijector
tf.contrib.distributions.bijectors.Chain(
bijectors=None, validate_args=False, name=None
)
Example Use:
chain = Chain([Exp(), Softplus()], name="one_plus_exp")
Results in:
- Forward:
exp = Exp()
softplus = Softplus()
Chain([exp, softplus]).forward(x)
= exp.forward(softplus.forward(x))
= tf.exp(tf.math.log(1. + tf.exp(x)))
= 1. + tf.exp(x)
```
* Inverse:
```python
exp = Exp()
softplus = Softplus()
Chain([exp, softplus]).inverse(y)
= softplus.inverse(exp.inverse(y))
= tf.math.log(tf.exp(tf.math.log(y)) - 1.)
= tf.math.log(y - 1.)
```
<!-- Tabular view -->
<table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2"><h2 class="add-link">Args</h2></th></tr>
<tr>
<td>
`bijectors`
</td>
<td>
Python `list` of bijector instances. An empty list makes this
bijector equivalent to the `Identity` bijector.
</td>
</tr><tr>
<td>
`validate_args`
</td>
<td>
Python `bool` indicating whether arguments should be
checked for correctness.
</td>
</tr><tr>
<td>
`name`
</td>
<td>
Python `str`, name given to ops managed by this object. Default:
E.g., `Chain([Exp(), Softplus()]).name == "chain_of_exp_of_softplus"`.
</td>
</tr>
</table>
<!-- Tabular view -->
<table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2"><h2 class="add-link">Raises</h2></th></tr>
<tr>
<td>
`ValueError`
</td>
<td>
if bijectors have different dtypes.
</td>
</tr>
</table>
<!-- Tabular view -->
<table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2"><h2 class="add-link">Attributes</h2></th></tr>
<tr>
<td>
`bijectors`
</td>
<td>
</td>
</tr><tr>
<td>
`dtype`
</td>
<td>
dtype of `Tensor`s transformable by this distribution.
</td>
</tr><tr>
<td>
`forward_min_event_ndims`
</td>
<td>
Returns the minimal number of dimensions bijector.forward operates on.
</td>
</tr><tr>
<td>
`graph_parents`
</td>
<td>
Returns this `Bijector`'s graph_parents as a Python list.
</td>
</tr><tr>
<td>
`inverse_min_event_ndims`
</td>
<td>
Returns the minimal number of dimensions bijector.inverse operates on.
</td>
</tr><tr>
<td>
`is_constant_jacobian`
</td>
<td>
Returns true iff the Jacobian matrix is not a function of x.
Note: Jacobian matrix is either constant for both forward and inverse or
neither.
</td>
</tr><tr>
<td>
`name`
</td>
<td>
Returns the string name of this `Bijector`.
</td>
</tr><tr>
<td>
`validate_args`
</td>
<td>
Returns True if Tensor arguments will be validated.
</td>
</tr>
</table>
## Methods
<h3 id="forward"><code>forward</code></h3>
<a target="_blank" href="https://github.com/tensorflow/tensorflow/blob/v1.15.0/tensorflow/python/ops/distributions/bijector_impl.py#L753-L768">View source</a>
<pre class="devsite-click-to-copy prettyprint lang-py tfo-signature-link">
<code>forward(
x, name='forward'
)
</code></pre>
Returns the forward `Bijector` evaluation, i.e., X = g(Y).
<!-- Tabular view -->
<table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2">Args</th></tr>
<tr>
<td>
`x`
</td>
<td>
`Tensor`. The input to the "forward" evaluation.
</td>
</tr><tr>
<td>
`name`
</td>
<td>
The name to give this op.
</td>
</tr>
</table>
<!-- Tabular view -->
<table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2">Returns</th></tr>
<tr class="alt">
<td colspan="2">
`Tensor`.
</td>
</tr>
</table>
<!-- Tabular view -->
<table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2">Raises</th></tr>
<tr>
<td>
`TypeError`
</td>
<td>
if `self.dtype` is specified and `x.dtype` is not
`self.dtype`.
</td>
</tr><tr>
<td>
`NotImplementedError`
</td>
<td>
if `_forward` is not implemented.
</td>
</tr>
</table>
<h3 id="forward_event_shape"><code>forward_event_shape</code></h3>
<a target="_blank" href="https://github.com/tensorflow/tensorflow/blob/v1.15.0/tensorflow/python/ops/distributions/bijector_impl.py#L677-L690">View source</a>
<pre class="devsite-click-to-copy prettyprint lang-py tfo-signature-link">
<code>forward_event_shape(
input_shape
)
</code></pre>
Shape of a single sample from a single batch as a `TensorShape`.
Same meaning as `forward_event_shape_tensor`. May be only partially defined.
<!-- Tabular view -->
<table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2">Args</th></tr>
<tr>
<td>
`input_shape`
</td>
<td>
`TensorShape` indicating event-portion shape passed into
`forward` function.
</td>
</tr>
</table>
<!-- Tabular view -->
<table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2">Returns</th></tr>
<tr>
<td>
`forward_event_shape_tensor`
</td>
<td>
`TensorShape` indicating event-portion shape
after applying `forward`. Possibly unknown.
</td>
</tr>
</table>
<h3 id="forward_event_shape_tensor"><code>forward_event_shape_tensor</code></h3>
<a target="_blank" href="https://github.com/tensorflow/tensorflow/blob/v1.15.0/tensorflow/python/ops/distributions/bijector_impl.py#L653-L670">View source</a>
<pre class="devsite-click-to-copy prettyprint lang-py tfo-signature-link">
<code>forward_event_shape_tensor(
input_shape, name='forward_event_shape_tensor'
)
</code></pre>
Shape of a single sample from a single batch as an `int32` 1D `Tensor`.
<!-- Tabular view -->
<table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2">Args</th></tr>
<tr>
<td>
`input_shape`
</td>
<td>
`Tensor`, `int32` vector indicating event-portion shape
passed into `forward` function.
</td>
</tr><tr>
<td>
`name`
</td>
<td>
name to give to the op
</td>
</tr>
</table>
<!-- Tabular view -->
<table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2">Returns</th></tr>
<tr>
<td>
`forward_event_shape_tensor`
</td>
<td>
`Tensor`, `int32` vector indicating
event-portion shape after applying `forward`.
</td>
</tr>
</table>
<h3 id="forward_log_det_jacobian"><code>forward_log_det_jacobian</code></h3>
<a target="_blank" href="https://github.com/tensorflow/tensorflow/blob/v1.15.0/tensorflow/python/ops/distributions/bijector_impl.py#L973-L997">View source</a>
<pre class="devsite-click-to-copy prettyprint lang-py tfo-signature-link">
<code>forward_log_det_jacobian(
x, event_ndims, name='forward_log_det_jacobian'
)
</code></pre>
Returns both the forward_log_det_jacobian.
<!-- Tabular view -->
<table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2">Args</th></tr>
<tr>
<td>
`x`
</td>
<td>
`Tensor`. The input to the "forward" Jacobian determinant evaluation.
</td>
</tr><tr>
<td>
`event_ndims`
</td>
<td>
Number of dimensions in the probabilistic events being
transformed. Must be greater than or equal to
`self.forward_min_event_ndims`. The result is summed over the final
dimensions to produce a scalar Jacobian determinant for each event,
i.e. it has shape `x.shape.ndims - event_ndims` dimensions.
</td>
</tr><tr>
<td>
`name`
</td>
<td>
The name to give this op.
</td>
</tr>
</table>
<!-- Tabular view -->
<table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2">Returns</th></tr>
<tr class="alt">
<td colspan="2">
`Tensor`, if this bijector is injective.
If not injective this is not implemented.
</td>
</tr>
</table>
<!-- Tabular view -->
<table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2">Raises</th></tr>
<tr>
<td>
`TypeError`
</td>
<td>
if `self.dtype` is specified and `y.dtype` is not
`self.dtype`.
</td>
</tr><tr>
<td>
`NotImplementedError`
</td>
<td>
if neither `_forward_log_det_jacobian`
nor {`_inverse`, `_inverse_log_det_jacobian`} are implemented, or
this is a non-injective bijector.
</td>
</tr>
</table>
<h3 id="inverse"><code>inverse</code></h3>
<a target="_blank" href="https://github.com/tensorflow/tensorflow/blob/v1.15.0/tensorflow/python/ops/distributions/bijector_impl.py#L787-L804">View source</a>
<pre class="devsite-click-to-copy prettyprint lang-py tfo-signature-link">
<code>inverse(
y, name='inverse'
)
</code></pre>
Returns the inverse `Bijector` evaluation, i.e., X = g^{-1}(Y).
<!-- Tabular view -->
<table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2">Args</th></tr>
<tr>
<td>
`y`
</td>
<td>
`Tensor`. The input to the "inverse" evaluation.
</td>
</tr><tr>
<td>
`name`
</td>
<td>
The name to give this op.
</td>
</tr>
</table>
<!-- Tabular view -->
<table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2">Returns</th></tr>
<tr class="alt">
<td colspan="2">
`Tensor`, if this bijector is injective.
If not injective, returns the k-tuple containing the unique
`k` points `(x1, ..., xk)` such that `g(xi) = y`.
</td>
</tr>
</table>
<!-- Tabular view -->
<table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2">Raises</th></tr>
<tr>
<td>
`TypeError`
</td>
<td>
if `self.dtype` is specified and `y.dtype` is not
`self.dtype`.
</td>
</tr><tr>
<td>
`NotImplementedError`
</td>
<td>
if `_inverse` is not implemented.
</td>
</tr>
</table>
<h3 id="inverse_event_shape"><code>inverse_event_shape</code></h3>
<a target="_blank" href="https://github.com/tensorflow/tensorflow/blob/v1.15.0/tensorflow/python/ops/distributions/bijector_impl.py#L721-L734">View source</a>
<pre class="devsite-click-to-copy prettyprint lang-py tfo-signature-link">
<code>inverse_event_shape(
output_shape
)
</code></pre>
Shape of a single sample from a single batch as a `TensorShape`.
Same meaning as `inverse_event_shape_tensor`. May be only partially defined.
<!-- Tabular view -->
<table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2">Args</th></tr>
<tr>
<td>
`output_shape`
</td>
<td>
`TensorShape` indicating event-portion shape passed into
`inverse` function.
</td>
</tr>
</table>
<!-- Tabular view -->
<table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2">Returns</th></tr>
<tr>
<td>
`inverse_event_shape_tensor`
</td>
<td>
`TensorShape` indicating event-portion shape
after applying `inverse`. Possibly unknown.
</td>
</tr>
</table>
<h3 id="inverse_event_shape_tensor"><code>inverse_event_shape_tensor</code></h3>
<a target="_blank" href="https://github.com/tensorflow/tensorflow/blob/v1.15.0/tensorflow/python/ops/distributions/bijector_impl.py#L697-L714">View source</a>
<pre class="devsite-click-to-copy prettyprint lang-py tfo-signature-link">
<code>inverse_event_shape_tensor(
output_shape, name='inverse_event_shape_tensor'
)
</code></pre>
Shape of a single sample from a single batch as an `int32` 1D `Tensor`.
<!-- Tabular view -->
<table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2">Args</th></tr>
<tr>
<td>
`output_shape`
</td>
<td>
`Tensor`, `int32` vector indicating event-portion shape
passed into `inverse` function.
</td>
</tr><tr>
<td>
`name`
</td>
<td>
name to give to the op
</td>
</tr>
</table>
<!-- Tabular view -->
<table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2">Returns</th></tr>
<tr>
<td>
`inverse_event_shape_tensor`
</td>
<td>
`Tensor`, `int32` vector indicating
event-portion shape after applying `inverse`.
</td>
</tr>
</table>
<h3 id="inverse_log_det_jacobian"><code>inverse_log_det_jacobian</code></h3>
<a target="_blank" href="https://github.com/tensorflow/tensorflow/blob/v1.15.0/tensorflow/python/ops/distributions/bijector_impl.py#L871-L900">View source</a>
<pre class="devsite-click-to-copy prettyprint lang-py tfo-signature-link">
<code>inverse_log_det_jacobian(
y, event_ndims, name='inverse_log_det_jacobian'
)
</code></pre>
Returns the (log o det o Jacobian o inverse)(y).
Mathematically, returns: `log(det(dX/dY))(Y)`. (Recall that: `X=g^{-1}(Y)`.)
Note that `forward_log_det_jacobian` is the negative of this function,
evaluated at `g^{-1}(y)`.
<!-- Tabular view -->
<table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2">Args</th></tr>
<tr>
<td>
`y`
</td>
<td>
`Tensor`. The input to the "inverse" Jacobian determinant evaluation.
</td>
</tr><tr>
<td>
`event_ndims`
</td>
<td>
Number of dimensions in the probabilistic events being
transformed. Must be greater than or equal to
`self.inverse_min_event_ndims`. The result is summed over the final
dimensions to produce a scalar Jacobian determinant for each event,
i.e. it has shape `y.shape.ndims - event_ndims` dimensions.
</td>
</tr><tr>
<td>
`name`
</td>
<td>
The name to give this op.
</td>
</tr>
</table>
<!-- Tabular view -->
<table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2">Returns</th></tr>
<tr class="alt">
<td colspan="2">
`Tensor`, if this bijector is injective.
If not injective, returns the tuple of local log det
Jacobians, `log(det(Dg_i^{-1}(y)))`, where `g_i` is the restriction
of `g` to the `ith` partition `Di`.
</td>
</tr>
</table>
<!-- Tabular view -->
<table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2">Raises</th></tr>
<tr>
<td>
`TypeError`
</td>
<td>
if `self.dtype` is specified and `y.dtype` is not
`self.dtype`.
</td>
</tr><tr>
<td>
`NotImplementedError`
</td>
<td>
if `_inverse_log_det_jacobian` is not implemented.
</td>
</tr>
</table>