denoising-diffusion-pytorch 2.3.1__tar.gz → 2.3.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. {denoising_diffusion_pytorch-2.3.1 → denoising_diffusion_pytorch-2.3.2}/PKG-INFO +2 -2
  2. {denoising_diffusion_pytorch-2.3.1 → denoising_diffusion_pytorch-2.3.2}/denoising_diffusion_pytorch/classifier_free_guidance.py +26 -8
  3. denoising_diffusion_pytorch-2.3.2/denoising_diffusion_pytorch/version.py +1 -0
  4. {denoising_diffusion_pytorch-2.3.1 → denoising_diffusion_pytorch-2.3.2}/denoising_diffusion_pytorch/xm.py +9 -0
  5. denoising_diffusion_pytorch-2.3.1/denoising_diffusion_pytorch/version.py +0 -1
  6. {denoising_diffusion_pytorch-2.3.1 → denoising_diffusion_pytorch-2.3.2}/.gitignore +0 -0
  7. {denoising_diffusion_pytorch-2.3.1 → denoising_diffusion_pytorch-2.3.2}/LICENSE +0 -0
  8. {denoising_diffusion_pytorch-2.3.1 → denoising_diffusion_pytorch-2.3.2}/README.md +0 -0
  9. {denoising_diffusion_pytorch-2.3.1 → denoising_diffusion_pytorch-2.3.2}/denoising_diffusion_pytorch/__init__.py +0 -0
  10. {denoising_diffusion_pytorch-2.3.1 → denoising_diffusion_pytorch-2.3.2}/denoising_diffusion_pytorch/attend.py +0 -0
  11. {denoising_diffusion_pytorch-2.3.1 → denoising_diffusion_pytorch-2.3.2}/denoising_diffusion_pytorch/continuous_time_gaussian_diffusion.py +0 -0
  12. {denoising_diffusion_pytorch-2.3.1 → denoising_diffusion_pytorch-2.3.2}/denoising_diffusion_pytorch/denoising_diffusion_pytorch.py +0 -0
  13. {denoising_diffusion_pytorch-2.3.1 → denoising_diffusion_pytorch-2.3.2}/denoising_diffusion_pytorch/denoising_diffusion_pytorch_1d.py +0 -0
  14. {denoising_diffusion_pytorch-2.3.1 → denoising_diffusion_pytorch-2.3.2}/denoising_diffusion_pytorch/elucidated_diffusion.py +0 -0
  15. {denoising_diffusion_pytorch-2.3.1 → denoising_diffusion_pytorch-2.3.2}/denoising_diffusion_pytorch/fid_evaluation.py +0 -0
  16. {denoising_diffusion_pytorch-2.3.1 → denoising_diffusion_pytorch-2.3.2}/denoising_diffusion_pytorch/guided_diffusion.py +0 -0
  17. {denoising_diffusion_pytorch-2.3.1 → denoising_diffusion_pytorch-2.3.2}/denoising_diffusion_pytorch/karras_unet.py +0 -0
  18. {denoising_diffusion_pytorch-2.3.1 → denoising_diffusion_pytorch-2.3.2}/denoising_diffusion_pytorch/karras_unet_1d.py +0 -0
  19. {denoising_diffusion_pytorch-2.3.1 → denoising_diffusion_pytorch-2.3.2}/denoising_diffusion_pytorch/karras_unet_3d.py +0 -0
  20. {denoising_diffusion_pytorch-2.3.1 → denoising_diffusion_pytorch-2.3.2}/denoising_diffusion_pytorch/learned_gaussian_diffusion.py +0 -0
  21. {denoising_diffusion_pytorch-2.3.1 → denoising_diffusion_pytorch-2.3.2}/denoising_diffusion_pytorch/repaint.py +0 -0
  22. {denoising_diffusion_pytorch-2.3.1 → denoising_diffusion_pytorch-2.3.2}/denoising_diffusion_pytorch/simple_diffusion.py +0 -0
  23. {denoising_diffusion_pytorch-2.3.1 → denoising_diffusion_pytorch-2.3.2}/denoising_diffusion_pytorch/v_param_continuous_time_gaussian_diffusion.py +0 -0
  24. {denoising_diffusion_pytorch-2.3.1 → denoising_diffusion_pytorch-2.3.2}/denoising_diffusion_pytorch/weighted_objective_gaussian_diffusion.py +0 -0
  25. {denoising_diffusion_pytorch-2.3.1 → denoising_diffusion_pytorch-2.3.2}/pyproject.toml +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: denoising-diffusion-pytorch
3
- Version: 2.3.1
3
+ Version: 2.3.2
4
4
  Summary: Denoising Diffusion Probabilistic Models - Pytorch
5
5
  Project-URL: Homepage, https://github.com/lucidrains/denoising-diffusion-pytorch
6
6
  Project-URL: Repository, https://github.com/lucidrains/denoising-diffusion-pytorch
@@ -411,7 +411,8 @@ class Unet(nn.Module):
411
411
  x,
412
412
  time,
413
413
  classes,
414
- cond_drop_prob = None
414
+ cond_drop_prob = None,
415
+ cond_keep_mask = None
415
416
  ):
416
417
  batch, device = x.shape[0], x.device
417
418
 
@@ -421,8 +422,10 @@ class Unet(nn.Module):
421
422
 
422
423
  classes_emb = self.classes_emb(classes)
423
424
 
424
- if cond_drop_prob > 0:
425
- keep_mask = prob_mask_like((batch,), 1 - cond_drop_prob, device = device)
425
+ if cond_drop_prob > 0 or exists(cond_keep_mask):
426
+ keep_mask = default(cond_keep_mask, lambda: prob_mask_like((batch,), 1 - cond_drop_prob, device = device))
427
+ assert keep_mask.shape == (batch,)
428
+ keep_mask = keep_mask.to(device = device, dtype = torch.bool)
426
429
  null_classes_emb = repeat(self.null_classes_emb, 'd -> b d', b = batch)
427
430
 
428
431
  classes_emb = torch.where(
@@ -606,6 +609,20 @@ class GaussianDiffusion(nn.Module):
606
609
  def device(self):
607
610
  return self.betas.device
608
611
 
612
+ def random_times(self, batch_size):
613
+ return torch.randint(0, self.num_timesteps, (batch_size,), device = self.device).long()
614
+
615
+ def random_cond_keep_mask(self, batch_size):
616
+ keep_prob = 1. - self.model.cond_drop_prob
617
+ return prob_mask_like((batch_size,), keep_prob, device = self.device)
618
+
619
+ def xm_shared_random_kwargs(self, batch_size):
620
+ # condition dropping is shared across Forward XM candidates
621
+
622
+ return dict(
623
+ cond_keep_mask = self.random_cond_keep_mask(batch_size)
624
+ )
625
+
609
626
  def predict_start_from_noise(self, x_t, t, noise):
610
627
  return (
611
628
  extract(self.sqrt_recip_alphas_cumprod, t, x_t.shape) * x_t -
@@ -774,7 +791,7 @@ class GaussianDiffusion(nn.Module):
774
791
  extract(self.sqrt_one_minus_alphas_cumprod, t, x_start.shape) * noise
775
792
  )
776
793
 
777
- def p_losses(self, x_start, t, *, classes, noise = None, loss_reduction = 'mean'):
794
+ def p_losses(self, x_start, t, *, classes, noise = None, cond_keep_mask = None, loss_reduction = 'mean'):
778
795
  b, c, h, w = x_start.shape
779
796
  noise = default(noise, lambda: torch.randn_like(x_start))
780
797
 
@@ -784,7 +801,8 @@ class GaussianDiffusion(nn.Module):
784
801
 
785
802
  # predict and take gradient step
786
803
 
787
- model_out = self.model(x, t, classes)
804
+ model_kwargs = dict(cond_keep_mask = cond_keep_mask) if exists(cond_keep_mask) else dict()
805
+ model_out = self.model(x, t, classes, **model_kwargs)
788
806
 
789
807
  if self.objective == 'pred_noise':
790
808
  target = noise
@@ -806,13 +824,13 @@ class GaussianDiffusion(nn.Module):
806
824
 
807
825
  return loss.mean()
808
826
 
809
- def forward(self, img, *args, loss_reduction = 'mean', **kwargs):
827
+ def forward(self, img, *args, times = None, cond_keep_mask = None, loss_reduction = 'mean', **kwargs):
810
828
  b, c, h, w, device, img_size, = *img.shape, img.device, self.image_size
811
829
  assert h == img_size and w == img_size, f'height and width of image must be {img_size}'
812
- t = torch.randint(0, self.num_timesteps, (b,), device=device).long()
830
+ times = default(times, lambda: self.random_times(b))
813
831
 
814
832
  img = normalize_to_neg_one_to_one(img)
815
- return self.p_losses(img, t, *args, loss_reduction = loss_reduction, **kwargs)
833
+ return self.p_losses(img, times, *args, cond_keep_mask = cond_keep_mask, loss_reduction = loss_reduction, **kwargs)
816
834
 
817
835
  # example
818
836
 
@@ -0,0 +1 @@
1
+ __version__ = '2.3.2'
@@ -77,6 +77,15 @@ class XMWrapper(Module):
77
77
  first_tensor = next(t for t in leaves if is_tensor(t))
78
78
  batch = first_tensor.shape[0]
79
79
 
80
+ # sample anything that must be shared before expanding candidates
81
+
82
+ if hasattr(self.flow_model, 'xm_shared_random_kwargs'):
83
+ random_kwargs = self.flow_model.xm_shared_random_kwargs(batch)
84
+
85
+ for key, value in random_kwargs.items():
86
+ if key not in kwargs:
87
+ kwargs[key] = value
88
+
80
89
  if self.random_time_kwarg not in kwargs:
81
90
  assert hasattr(self.flow_model, self.random_time_method), f'flow_model must have a {self.random_time_method} method'
82
91
  fn = getattr(self.flow_model, self.random_time_method)
@@ -1 +0,0 @@
1
- __version__ = '2.3.1'