CouplingLayer¶
-
class
tfsnippet.layers.CouplingLayer(shift_and_scale_fn, axis=-1, value_ndims=1, secondary=False, scale_type='linear', sigmoid_scale_bias=2.0, epsilon=1e-06, name=None, scope=None)¶ Bases:
tfsnippet.layers.flows.base.FeatureMappingFlowA general implementation of the coupling layer (Dinh et al., 2016).
Basically, a
CouplingLayerdoes the following transformation:x1, x2 = split(x) if secondary: x1, x2 = x2, x1 y1 = x1 shift, scale = shift_and_scale_fn(x1, x2.shape[axis]) if scale_type == 'exp': y2 = (x2 + shift) * exp(scale) elif scale_type == 'sigmoid': y2 = (x2 + shift) * sigmoid(scale + sigmoid_scale_bias) elif scale_type == 'linear': y2 = (x2 + shift) * scale else: y2 = x2 + shift if secondary: y1, y2 = y2, y1 y = tf.concat([y1, y2], axis=axis)
The inverse transformation, and the log-determinants are computed according to the above transformation, respectively.
Attributes Summary
axisGet the feature axis/axes. explicitly_invertibleWhether or not this flow is explicitly invertible? nameGet the name of this object. require_batch_dimsWhether or not this flow requires batch dimensions. value_ndimsGet the number of value dimensions in both x and y. variable_scopeGet the variable scope of this object. x_value_ndimsGet the number of value dimensions in x. y_value_ndimsGet 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 withinapply(), it will be the input tensor(s). Otherwise if it is called separately, it will beNone.
-
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: Returns: Return type: (tf.Tensor, tf.Tensor)
Raises: RuntimeError– If both compute_x and compute_log_det are set toFalse.RuntimeError– If the flow is not explicitly invertible.
-
invert()¶ Get the inverted flow from this flow.
The
transform()will become theinverse_transform()in the inverted flow, and theinverse_transform()will become thetransform()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: Returns: Return type: (tf.Tensor, tf.Tensor)
Raises: RuntimeError– If both compute_y and compute_log_det are set toFalse.
-