当前位置:   article > 正文

AIGC笔记--DDIM的简单实现

AIGC笔记--DDIM的简单实现

1--DDIM介绍

原论文:DENOISING DIFFUSION IMPLICIT MODELS

2--核心代码

  1. # ddim的实现
  2. def compute_alpha(beta, t):
  3. beta = torch.cat([torch.zeros(1).to(beta.device), beta], dim=0) # beta -> [1, beta]
  4. # 先通过cumprod计算累乘结果,即: alpha_(t)_hat = alpha_(t) * alpha_(t-1) * ... * alpha_1 * alpha_0
  5. # 再选取alpha_(t)_hat, 这里用索引t+1来选取
  6. a = (1 - beta).cumprod(dim=0).index_select(0, t + 1).view(-1, 1, 1, 1)
  7. return a
  8. # ddim的实现, 参考: https://github.com/ermongroup/ddim/blob/main/functions/denoising.py
  9. def generalized_steps(x, seq, model, b, **kwargs):
  10. with torch.no_grad():
  11. n = x.size(0) # batchsize
  12. seq_next = [-1] + list(seq[:-1]) # t-skip: [-1, 0, 10, 20, ..., 980], len: 100
  13. x0_preds = []
  14. xs = [x]
  15. for i, j in zip(reversed(seq), reversed(seq_next)): # i = t, j = t-skip
  16. t = (torch.ones(n) * i).to(x.device) # t
  17. next_t = (torch.ones(n) * j).to(x.device) # t-1
  18. at = compute_alpha(b, t.long()) # alpha_(t)_hat
  19. at_next = compute_alpha(b, next_t.long()) # alpha_(t-1)_hat
  20. xt = xs[-1].to('cuda') # 获取当前时间步的样本,即x_t
  21. et = model(xt, t) # 预测噪声
  22. x0_t = (xt - et * (1 - at).sqrt()) / at.sqrt() # 论文公式(12)中的 predicted x0
  23. x0_preds.append(x0_t.to('cpu')) # 记录当前时间步的 predicted x0
  24. c1 = (kwargs.get("eta", 0) * ((1 - at / at_next) * (1 - at_next) / (1 - at)).sqrt()) # 计算公式(12)中的标准差(\sigma)_(t)
  25. c2 = ((1 - at_next) - c1 ** 2).sqrt() # 论文公式(12)中 direction pointing to xt 的系数
  26. xt_next = at_next.sqrt() * x0_t + c1 * torch.randn_like(x) + c2 * et # 根据公式(12)计算x_(t-1)
  27. xs.append(xt_next.to('cpu')) # 记录每一个时间步的x_(t-1)
  28. return xs, x0_preds # 保存了每一个时间步的结果

3--完整代码

DDIM_Demo

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/690159
推荐阅读
相关标签
  

闽ICP备14008679号