StackedPhysicsDataFidelity#

class deepinv.optim.StackedPhysicsDataFidelity(data_fidelity_list)[source]#

Bases: DataFidelity

Stacked data fidelity term \(\datafid{x}{y} = \sum_i d_i(A_i(x),y_i)\).

Adapted to deepinv.physics.StackedPhysics physics composed of multiple physics operators.

Parameters:

data_fidelity_list (list[deepinv.optim.DataFidelity]) – list of data fidelity terms, one per physics operator.


Examples:

Define a stacked data fidelity term with two data fidelity terms \(f_1(A_1(x),y_1) + f_2(A_2(x,y_2)\):

>>> import torch
>>> import deepinv as dinv
>>> # define two observations, one with Gaussian noise and one with Poisson noise
>>> physics1 = dinv.physics.Denoising(dinv.physics.GaussianNoise(.1))
>>> physics2 = dinv.physics.Denoising(dinv.physics.PoissonNoise(.1))
>>> physics = dinv.physics.StackedLinearPhysics([physics1, physics2])
>>> fid1 = dinv.optim.L2()
>>> fid2 = dinv.optim.PoissonLikelihood()
>>> data_fidelity = dinv.optim.StackedPhysicsDataFidelity([fid1, fid2])
>>> x = torch.ones(1, 1, 3, 3) # image
>>> y = physics(x) # noisy measurements
>>> d = data_fidelity(x, y, physics)
fn(x, y, physics, *args, **kwargs)[source]#

Computes the data fidelity term \(\datafid{x}{y} = \sum_i d_i(A_i(x),y_i)\).

Parameters:
Returns:

(torch.Tensor) data fidelity \(\datafid{x}{y}\).

Return type:

torch.Tensor

grad(x, y, physics, *args, **kwargs)[source]#

Calculates the gradient of the data fidelity term \(\datafidname\) at \(x\).

The gradient is computed using the chain rule:

\[\nabla_x \distance{\forw{x}}{y} = \sum_i \left. \frac{\partial A_i}{\partial x} \right|_x^\top \nabla_u \distance{u}{y_i},\]

where \(\left. \frac{\partial A_i}{\partial x} \right|_x\) is the Jacobian of \(A_i\) at \(x\), and \(\nabla_u \distance{u}{y_i}\) is computed using grad_d with \(u = \forw{x}\). The multiplication is computed using the A_vjp method of each physics.

Parameters:
Returns:

(torch.Tensor) gradient \(\nabla_x \datafid{x}{y}\), computed in \(x\).

Return type:

torch.Tensor