| | import torch |
| | import numpy as np |
| |
|
| |
|
| | def append_dims(x, target_dims): |
| | """Appends dimensions to the end of a tensor until it has target_dims dimensions. |
| | From https://github.com/crowsonkb/k-diffusion/blob/master/k_diffusion/utils.py""" |
| | dims_to_append = target_dims - x.ndim |
| | if dims_to_append < 0: |
| | raise ValueError(f'input has {x.ndim} dims but target_dims is {target_dims}, which is less') |
| | return x[(...,) + (None,) * dims_to_append] |
| |
|
| |
|
| | def renorm_thresholding(x0, value): |
| | |
| | pred_max = x0.max() |
| | pred_min = x0.min() |
| | pred_x0 = (x0 - pred_min) / (pred_max - pred_min) |
| | pred_x0 = 2 * pred_x0 - 1. |
| |
|
| | s = torch.quantile( |
| | rearrange(pred_x0, 'b ... -> b (...)').abs(), |
| | value, |
| | dim=-1 |
| | ) |
| | s.clamp_(min=1.0) |
| | s = s.view(-1, *((1,) * (pred_x0.ndim - 1))) |
| |
|
| | |
| | |
| |
|
| | |
| | pred_x0 = np.clip(pred_x0.cpu().numpy(), -s.cpu().numpy(), s.cpu().numpy()) / s.cpu().numpy() |
| | pred_x0 = torch.tensor(pred_x0).to(self.model.device) |
| |
|
| | |
| | pred_x0 = (pred_x0 + 1.) / 2. |
| | pred_x0 = (pred_max - pred_min) * pred_x0 + pred_min |
| | return pred_x0 |
| |
|
| |
|
| | def norm_thresholding(x0, value): |
| | s = append_dims(x0.pow(2).flatten(1).mean(1).sqrt().clamp(min=value), x0.ndim) |
| | return x0 * (value / s) |
| |
|
| |
|
| | def spatial_norm_thresholding(x0, value): |
| | |
| | s = x0.pow(2).mean(1, keepdim=True).sqrt().clamp(min=value) |
| | return x0 * (value / s) |