BaseFlow

class tfsnippet.layers.BaseFlow(x_value_ndims, y_value_ndims=None, require_batch_dims=False, name=None, scope=None)

Bases: tfsnippet.layers.base.BaseLayer

The basic class for normalizing flows.

A normalizing flow transforms a random variable x into y by an (implicitly) invertible mapping \(y = f(x)\), whose Jaccobian matrix determinant \(\det \frac{\partial f(x)}{\partial x} \neq 0\), thus can derive \(\log p(y)\) from given \(\log p(x)\).

Attributes Summary

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.
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

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.

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.