Skip to content

Commit 01beccd

Browse files
committed
Small improvement to docstring of Pnp
1 parent bb23abb commit 01beccd

File tree

2 files changed

+23
-11
lines changed

2 files changed

+23
-11
lines changed

pyproximal/optimization/pnp.py

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def PlugAndPlay(proxf, denoiser, dims, x0, tau, niter=10,
4242
.. math::
4343
4444
\mathbf{x},\mathbf{z} = \argmin_{\mathbf{x}}
45-
f(\mathbf{x}) + g(\mathbf{x})
45+
f(\mathbf{x}) + \lambda g(\mathbf{x})
4646
4747
where :math:`f(\mathbf{x})` is a function that has a known proximal
4848
operator where :math:`g(\mathbf{x})` is a function acting as implicit
@@ -88,21 +88,33 @@ def PlugAndPlay(proxf, denoiser, dims, x0, tau, niter=10,
8888
.. math::
8989
9090
\mathbf{x}^{k+1} = \prox_{\tau f}(\mathbf{z}^{k} - \mathbf{u}^{k})\\
91-
\mathbf{z}^{k+1} = \operatorname{Denoise}(\mathbf{x}^{k+1} + \mathbf{u}^{k}, \tau \sigma)\\
91+
\mathbf{z}^{k+1} = \operatorname{Denoise}(\mathbf{x}^{k+1} + \mathbf{u}^{k}, \tau \lambda)\\
9292
\mathbf{u}^{k+1} = \mathbf{u}^{k} + \mathbf{x}^{k+1} - \mathbf{z}^{k+1}
9393
94-
where :math:`\operatorname{Denoise}` is a denoising algorithm of choice and
95-
:math:`\tau \sigma` is the denoising parameter (should be chosen to
96-
represent an estimate of the noise variance). This rather peculiar step
97-
originates from the intuition that the optimization process associated
98-
with the z-update can be interpreted as a denoising inverse problem -
99-
for this reason any denoising of choice can be used instead of a function
100-
with known proximal operator.
94+
where :math:`\operatorname{Denoise}` is a denoising algorithm of choice. This rather peculiar step originates
95+
from the intuition that the optimization process associated with the z-update can be interpreted as a denoising
96+
inverse problem, or more specifically a MAP denoiser where the noise is gaussian with zero mean and variance
97+
equal to :math:`\tau \lambda`. For this reason any denoising of choice can be used instead of a function with
98+
known proximal operator.
99+
100+
Finally, whilst the :math:`\tau \lambda` denoising parameter should be chosen to
101+
represent an estimate of the noise variance (of the denoiser, not the data of the problem we wish to solve!),
102+
special care must be taken when setting up the denoiser and calling this optimizer. More specifically,
103+
:math:`\lambda` should not be passed to the optimizer, rather set directly in the denoiser.
104+
On the other hand :math:`\tau` must be passed to the optimizer as it is also affecting the x-update;
105+
when defining the denoiser, ensure that :math:`\tau` is multiplied to :math:`\lambda` as shown in the tutorial.
106+
107+
Alternative, as suggested in [2]_, the :math:`\tau` could be set to 1. The parameter :math:`\lambda` can then be set
108+
to maximize the value of the denoiser and a second tuning parameter can be added directly to :math:`f`.
101109
102110
.. [1] Venkatakrishnan, S. V., Bouman, C. A. and Wohlberg, B.
103111
"Plug-and-Play priors for model based reconstruction",
104112
IEEE. 2013.
105113
114+
.. [1] Meinhardt, T., Moeller, M, Hazirbas, C., and Cremer, D.
115+
"Learning Proximal Operators: Using Denoising Networks for Regularizing Inverse Imaging Problems",
116+
arXiv. 2017.
117+
106118
"""
107119
# Denoiser
108120
proxpnp = _Denoise(denoiser, dims=dims)

pyproximal/projection/Euclidean.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,6 @@ def __init__(self, center, radius):
3737

3838
def __call__(self, x):
3939
x = self.center + \
40-
self.radius / (max(np.linalg.norm(x - self.center),
41-
self.radius)) * (x - self.center)
40+
self.radius / (max(np.linalg.norm(x - self.center),
41+
self.radius)) * (x - self.center)
4242
return x

0 commit comments

Comments
 (0)