anomalib.models.components.freia.modules.base¶
Base Module.
Module Contents¶
Classes¶
Base class for all invertible modules in FrEIA. |
- class anomalib.models.components.freia.modules.base.InvertibleModule(dims_in: Iterable[Tuple[int]], dims_c: Iterable[Tuple[int]] = None)[source]¶
Bases:
torch.nn.ModuleBase class for all invertible modules in FrEIA.
Given
module, an instance of some InvertibleModule. Thismoduleshall be invertible in its input dimensions, so that the input can be recovered by applying the module in backwards mode (rev=True), not to be confused withpytorch.backward()which computes the gradient of an operation:x = torch.randn(BATCH_SIZE, DIM_COUNT) c = torch.randn(BATCH_SIZE, CONDITION_DIM) # Forward mode z, jac = module([x], [c], jac=True) # Backward mode x_rev, jac_rev = module(z, [c], rev=True)
The
modulereturns \(\\log \\det J = \\log \\left| \\det \\frac{\\partial f}{\\partial x} \\right|\) of the operation in forward mode, and \(-\\log | \\det J | = \\log \\left| \\det \\frac{\\partial f^{-1}}{\\partial z} \\right| = -\\log \\left| \\det \\frac{\\partial f}{\\partial x} \\right|\) in backward mode (rev=True). Then,torch.allclose(x, x_rev) == Trueandtorch.allclose(jac, -jac_rev) == True.- abstract forward(x_or_z: Iterable[torch.Tensor], c: Iterable[torch.Tensor] = None, rev: bool = False, jac: bool = True) Tuple[Tuple[torch.Tensor], torch.Tensor][source]¶
Forward/Backward Pass.
Perform a forward (default,
rev=False) or backward pass (rev=True) through this module/operator.Note to implementers: - Subclasses MUST return a Jacobian when
jac=True, but CAN return avalid Jacobian when
jac=False(not punished). The latter is only recommended if the computation of the Jacobian is trivial.Subclasses MUST follow the convention that the returned Jacobian be consistent with the evaluation direction. Let’s make this more precise: Let \(f\) be the function that the subclass represents. Then: .. math:
J &= \\log \\det \\frac{\\partial f}{\\partial x} \\\\ -J &= \\log \\det \\frac{\\partial f^{-1}}{\\partial z}.
Any subclass MUST return \(J\) for forward evaluation (
rev=False), and \(-J\) for backward evaluation (rev=True).
- Parameters
x_or_z – input data (array-like of one or more tensors)
c – conditioning data (array-like of none or more tensors)
rev – perform backward pass
jac – return Jacobian associated to the direction
- log_jacobian(*args, **kwargs)[source]¶
This method is deprecated, and does nothing except raise a warning.
- abstract output_dims(input_dims: List[Tuple[int]]) List[Tuple[int]][source]¶
Use for shape inference during construction of the graph.
MUST be implemented for each subclass of
InvertibleModule.- Parameters
input_dims – A list with one entry for each input to the module. Even if the module only has one input, must be a list with one entry. Each entry is a tuple giving the shape of that input, excluding the batch dimension. For example for a module with one input, which receives a 32x32 pixel RGB image,
input_dimswould be[(3, 32, 32)]- Returns
A list structured in the same way as
input_dims. Each entry represents one output of the module, and the entry is a tuple giving the shape of that output. For example if the module splits the image into a right and a left half, the return value should be[(3, 16, 32), (3, 16, 32)]. It is up to the implementor of the subclass to ensure that the total number of elements in all inputs and all outputs is consistent.