|
| 1 | +from functools import partial |
1 | 2 | import torch as t |
2 | 3 | from cdtools.models import CDIModel |
3 | 4 | from cdtools.datasets import Ptycho2DDataset |
@@ -46,6 +47,7 @@ def __init__(self, |
46 | 47 | fourier_probe=False, |
47 | 48 | prevent_aliasing=True, |
48 | 49 | phase_only=False, |
| 50 | + loss='amplitude mse', |
49 | 51 | units='um', |
50 | 52 | panel_plot_mode=False, |
51 | 53 | plot_level=1, |
@@ -155,9 +157,25 @@ def __init__(self, |
155 | 157 |
|
156 | 158 | self.as_prop = tools.propagators.generate_angular_spectrum_propagator(shape, spacing, self.wavelength, self.dz, self.bandlimit) |
157 | 159 |
|
| 160 | + # Here we set the appropriate loss function |
| 161 | + if (loss.lower().strip() == 'amplitude mse' |
| 162 | + or loss.lower().strip() == 'amplitude_mse'): |
| 163 | + self.loss = partial(tools.losses.amplitude_mse, use_sum=True) |
| 164 | + self.loss_normalizer = tools.losses.AmplitudeMSENormalizer() |
| 165 | + elif (loss.lower().strip() == 'poisson nll' |
| 166 | + or loss.lower().strip() == 'poisson_nll'): |
| 167 | + self.loss = tools.losses.poisson_nll |
| 168 | + self.loss_normalizer = tools.losses.SimplePoissonNLLNormalizer() |
| 169 | + elif (loss.lower().strip() == 'intensity mse' |
| 170 | + or loss.lower().strip() == 'intensity_mse'): |
| 171 | + self.loss = partial(tools.losses.intensity_mse, use_sum=True) |
| 172 | + self.loss_normalizer = tools.losses.IntensityMSENormalizer() |
| 173 | + else: |
| 174 | + raise KeyError('Specified loss function not supported') |
| 175 | + |
158 | 176 |
|
159 | 177 | @classmethod |
160 | | - def from_dataset(cls, dataset, dz, nz, probe_convergence_semiangle, padding=0, n_modes=1, dm_rank=None, translation_scale=1, saturation=None, propagation_distance=None, scattering_mode=None, oversampling=1, auto_center=True, bandlimit=None, replicate_slice=False, subpixel=True, exponentiate_obj=True, units='um', fourier_probe=False, phase_only=False, prevent_aliasing=True, probe_support_radius=None, panel_plot_mode=False, plot_level=1): |
| 178 | + def from_dataset(cls, dataset, dz, nz, probe_convergence_semiangle, padding=0, n_modes=1, dm_rank=None, translation_scale=1, saturation=None, propagation_distance=None, scattering_mode=None, oversampling=1, auto_center=True, bandlimit=None, replicate_slice=False, subpixel=True, exponentiate_obj=True, units='um', fourier_probe=False, phase_only=False, prevent_aliasing=True, probe_support_radius=None, panel_plot_mode=False, plot_level=1, loss='amplitude_mse'): |
161 | 179 |
|
162 | 180 | wavelength = dataset.wavelength |
163 | 181 | det_basis = dataset.detector_geometry['basis'] |
@@ -301,7 +319,9 @@ def from_dataset(cls, dataset, dz, nz, probe_convergence_semiangle, padding=0, n |
301 | 319 | phase_only=phase_only, |
302 | 320 | prevent_aliasing=prevent_aliasing, |
303 | 321 | panel_plot_mode=panel_plot_mode, |
304 | | - plot_level=plot_level) |
| 322 | + plot_level=plot_level, |
| 323 | + loss=loss, |
| 324 | + ) |
305 | 325 |
|
306 | 326 |
|
307 | 327 | def interaction(self, index, translations): |
@@ -415,11 +435,6 @@ def measurement(self, wavefields): |
415 | 435 | oversampling=self.oversampling) |
416 | 436 |
|
417 | 437 |
|
418 | | - def loss(self, sim_data, real_data, mask=None): |
419 | | - return tools.losses.amplitude_mse(real_data, sim_data, mask=mask) |
420 | | - #return tools.losses.poisson_nll(real_data, sim_data, mask=mask,eps=0.5) |
421 | | - |
422 | | - |
423 | 438 | def to(self, *args, **kwargs): |
424 | 439 | super(Multislice2DPtycho, self).to(*args, **kwargs) |
425 | 440 | self.wavelength = self.wavelength.to(*args,**kwargs) |
|
0 commit comments