(
self,
model,
x0,
t_enc=None,
ddim_steps=100,
use_original_steps=True,
n_intermediates=0,
model_kwargs=None,
progress=True
)
| 222 | |
| 223 | @torch.no_grad() |
| 224 | def encode( |
| 225 | self, |
| 226 | model, |
| 227 | x0, |
| 228 | t_enc=None, |
| 229 | ddim_steps=100, |
| 230 | use_original_steps=True, |
| 231 | n_intermediates=0, |
| 232 | model_kwargs=None, |
| 233 | progress=True |
| 234 | ): |
| 235 | assert self.ddpm.parameterization == "eps", "Only works with eps parameterization" |
| 236 | if not use_original_steps: |
| 237 | warnings.warn('Using DDIM for encoding is not recommended, as it is not fully debugged.') |
| 238 | |
| 239 | bs, dev = x0.shape[0], x0.device |
| 240 | model_kwargs = model_kwargs or {} |
| 241 | return_intermediates = n_intermediates > 0 |
| 242 | |
| 243 | self.make_schedule(ddim_num_steps=ddim_steps, device=dev, ddim_eta=0.0, verbose=False) |
| 244 | |
| 245 | # steps |
| 246 | num_reference_steps = self.ddpm_num_timesteps if use_original_steps else self.ddim_timesteps.shape[0] |
| 247 | if t_enc is None: |
| 248 | t_enc = num_reference_steps |
| 249 | assert t_enc <= num_reference_steps |
| 250 | num_steps = t_enc |
| 251 | |
| 252 | if use_original_steps: |
| 253 | alphas_next = self.ddpm.alphas_cumprod[:num_steps] |
| 254 | alphas = self.ddpm.alphas_cumprod_prev[:num_steps] |
| 255 | else: |
| 256 | alphas_next = self.ddim_alphas[:num_steps] |
| 257 | alphas = torch.tensor(self.ddim_alphas_prev[:num_steps]) |
| 258 | |
| 259 | x_next = x0 |
| 260 | intermediates = [] |
| 261 | inter_steps = [] |
| 262 | for i in tqdm(range(num_steps), desc='Encoding x0', disable=not progress): |
| 263 | t = torch.full((bs,), i, device=dev, dtype=torch.long) |
| 264 | |
| 265 | noise_pred = model(x_next, t, **model_kwargs) |
| 266 | |
| 267 | xt_weighted = (alphas_next[i] / alphas[i]).sqrt() * x_next |
| 268 | weighted_noise_pred = alphas_next[i].sqrt() * ( |
| 269 | (1 / alphas_next[i] - 1).sqrt() - (1 / alphas[i] - 1).sqrt()) * noise_pred |
| 270 | x_next = xt_weighted + weighted_noise_pred |
| 271 | if return_intermediates and i % (num_steps // n_intermediates) == 0 and i < num_steps - 1: |
| 272 | intermediates.append(x_next) |
| 273 | inter_steps.append(i) |
| 274 | elif return_intermediates and i >= num_steps - 2: |
| 275 | intermediates.append(x_next) |
| 276 | inter_steps.append(i) |
| 277 | |
| 278 | out = {'x_encoded': x_next, 'intermediate_steps': inter_steps} |
| 279 | if return_intermediates: |
| 280 | out.update({'intermediates': intermediates}) |
| 281 | return x_next, out |
nothing calls this directly
no test coverage detected