FeatureShufflingFlow

class tfsnippet.layers.FeatureShufflingFlow(axis=-1, value_ndims=1, random_state=None, name=None, scope=None)

Bases: tfsnippet.layers.flows.base.FeatureMappingFlow

An invertible flow which shuffles the order of input features.

This type of flow is proposed in (Kingma & Dhariwal, 2018), as a possible replacement to the alternating pattern of coupling layers proposed in (Dinh et al., 2016). Although the experiments have shown that this flow is inferior to learnt feature mappings (e.g., InvertibleDense and InvertibleConv2d), it is faster than learnt mappings, and is still superior to the vanilla alternating pattern.

Attributes Summary

axis Get the feature axis/axes.
explicitly_invertible Whether or not this flow is explicitly invertible?
name Get the name of this object.
require_batch_dims Whether or not this flow requires batch dimensions.
value_ndims Get the number of value dimensions in both x and y.
variable_scope Get the variable scope of this object.
x_value_ndims Get the number of value dimensions in x.
y_value_ndims Get the number of value dimensions in y.

Methods Summary

__call__(…) <==> x(…)
apply(input) Apply the layer on input, to produce output.
build([input]) Build the layer, creating all required variables.
inverse_transform(y[, compute_x, …]) Transform y into x, and compute the log-determinant of f^{-1} at y (i.e., \(\log \det \frac{\partial f^{-1}(y)}{\partial y}\)).
invert() Get the inverted flow from this flow.
transform(x[, compute_y, compute_log_det, name]) Transform x into y, and compute the log-determinant of f at x (i.e., \(\log \det \frac{\partial f(x)}{\partial x}\)).

Attributes Documentation

axis

Get the feature axis/axes.

Returns:
The feature axis/axes, as is specified
in the constructor.
Return type:int or tuple[int]
explicitly_invertible

Whether or not this flow is explicitly invertible?

If a flow is not explicitly invertible, then it only supports to transform x into y, and corresponding \(\log p(x)\) into \(\log p(y)\). It cannot compute \(\log p(y)\) directly without knowing x, nor can it transform x back into y.

Returns:
A boolean indicating whether or not the flow is explicitly
invertible.
Return type:bool
name

Get the name of this object.

require_batch_dims

Whether or not this flow requires batch dimensions.

value_ndims

Get the number of value dimensions in both x and y.

Returns:The number of value dimensions in both x and y.
Return type:int
variable_scope

Get the variable scope of this object.

x_value_ndims

Get the number of value dimensions in x.

Returns:The number of value dimensions in x.
Return type:int
y_value_ndims

Get the number of value dimensions in y.

Returns:The number of value dimensions in y.
Return type:int

Methods Documentation

__call__(...) <==> x(...)
apply(input)

Apply the layer on input, to produce output.

Parameters:input (Tensor or list[Tensor]) – The input tensor, or a list of input tensors.
Returns:The output tensor, or a list of output tensors.
build(input=None)

Build the layer, creating all required variables.

Parameters:input (Tensor or list[Tensor] or None) – If build() is called within apply(), it will be the input tensor(s). Otherwise if it is called separately, it will be None.
inverse_transform(y, compute_x=True, compute_log_det=True, name=None)

Transform y into x, and compute the log-determinant of f^{-1} at y (i.e., \(\log \det \frac{\partial f^{-1}(y)}{\partial y}\)).

Parameters:
  • y (Tensor) – The samples of y.
  • compute_x (bool) – Whether or not to compute \(x = f^{-1}(y)\)? Default True.
  • compute_log_det (bool) – Whether or not to compute the log-determinant? Default True.
  • name (str) – If specified, will use this name as the TensorFlow operational name scope.
Returns:

x and the (maybe summed) log-determinant.

The items in the returned tuple might be None if corresponding compute_? argument is set to False.

Return type:

(tf.Tensor, tf.Tensor)

Raises:
invert()

Get the inverted flow from this flow.

The transform() will become the inverse_transform() in the inverted flow, and the inverse_transform() will become the transform() in the inverted flow.

If the current flow has not been initialized, it must be initialized via inverse_transform() in the new flow.

Returns:The inverted flow.
Return type:tfsnippet.layers.InvertFlow
transform(x, compute_y=True, compute_log_det=True, name=None)

Transform x into y, and compute the log-determinant of f at x (i.e., \(\log \det \frac{\partial f(x)}{\partial x}\)).

Parameters:
  • x (Tensor) – The samples of x.
  • compute_y (bool) – Whether or not to compute \(y = f(x)\)? Default True.
  • compute_log_det (bool) – Whether or not to compute the log-determinant? Default True.
  • name (str) – If specified, will use this name as the TensorFlow operational name scope.
Returns:

y and the (maybe summed) log-determinant.

The items in the returned tuple might be None if corresponding compute_? argument is set to False.

Return type:

(tf.Tensor, tf.Tensor)

Raises:

RuntimeError – If both compute_y and compute_log_det are set to False.