Diffusion 公式推导和代码实现

预测噪声

Diffusion model(一): 公式推导详解

生成噪声的公式:

预测噪声

1、训练代码

:噪声预测公式及代码

    def q_sample(self, x_start, t, noise = None):
        noise = default(noise, lambda: torch.randn_like(x_start))

        return (
            extract(self.sqrt_alphas_cumprod, t, x_start.shape) * x_start +
            extract(self.sqrt_one_minus_alphas_cumprod, t, x_start.shape) * noise
        )

2、基础定义的公式


        alphas = 1. - betas
        alphas_cumprod = torch.cumprod(alphas, axis = 0)
        alphas_cumprod_prev = F.pad(alphas_cumprod[:-1], (1, 0), value = 1.)

        timesteps, = betas.shape
        self.num_timesteps = int(timesteps)

        if loss_type == 'l1':
            loss_fn = F.l1_loss
        elif loss_type == 'l2':
            loss_fn = F.mse_loss
        elif loss_type == 'huber':
            loss_fn = F.smooth_l1_loss
        else:
            raise NotImplementedError()

        self.loss_type = loss_type
        self.loss_fn = loss_fn

        # register buffer helper function to cast double back to float

        register_buffer = lambda name, val: self.register_buffer(name, val.to(torch.float32))

        register_buffer('betas', betas)
        register_buffer('alphas_cumprod', alphas_cumprod)
        register_buffer('alphas_cumprod_prev', alphas_cumprod_prev)

        # calculations for diffusion q(x_t | x_{t-1}) and others

        register_buffer('sqrt_alphas_cumprod', torch.sqrt(alphas_cumprod))
        register_buffer('sqrt_one_minus_alphas_cumprod', torch.sqrt(1. - alphas_cumprod))
        register_buffer('log_one_minus_alphas_cumprod', torch.log(1. - alphas_cumprod))
        register_buffer('sqrt_recip_alphas_cumprod', torch.sqrt(1. / alphas_cumprod))
        register_buffer('sqrt_recipm1_alphas_cumprod', torch.sqrt(1. / alphas_cumprod - 1))

        # calculations for posterior q(x_{t-1} | x_t, x_0)

        posterior_variance = betas * (1. - alphas_cumprod_prev) / (1. - alphas_cumprod)

        # above: equal to 1. / (1. / (1. - alpha_cumprod_tm1) + alpha_t / beta_t)

        register_buffer('posterior_variance', posterior_variance)

        # below: log calculation clipped because the posterior variance is 0 at the beginning of the diffusion chain

        register_buffer('posterior_log_variance_clipped', torch.log(posterior_variance.clamp(min =1e-20)))
        register_buffer('posterior_mean_coef1', betas * torch.sqrt(alphas_cumprod_prev) / (1. - alphas_cumprod))
        register_buffer('posterior_mean_coef2', (1. - alphas_cumprod_prev) * torch.sqrt(alphas) / (1. - alphas_cumprod))

        # p2 loss reweighting

        self.has_p2_loss_reweighting = p2_loss_weight_gamma > 0.
        register_buffer('p2_loss_weight', (p2_loss_weight_k + alphas_cumprod / (1 - alphas_cumprod)) ** -p2_loss_weight_gamma)

3、噪声采样:生成代码

pred = model_mean + nonzero_mask * (0.5 * model_log_variance).exp() * noise

生成t-1的图像

4、噪声损失函数

  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
当涉及到复现diffusion算法的代码时,我需要确一下您指的是哪个具体的diffusion算法。Diffusion算法是一种用于图像处理和计算机视觉任务的图像扩散方法,有多种不同的变体和实现方式。 以下是一个简单的示例,展示了如何使用Python和OpenCV库来实现基于Diffusion的图像去噪算法: ```python import cv2 def diffusion_denoising(image, iterations, kappa, delta): # 将图像转换为灰度图 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 将灰度图转换为浮点型 gray = gray.astype(float) # 迭代应用Diffusion算法 for _ in range(iterations): # 计算梯度 grad_x = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3) grad_y = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3) # 计算梯度的平方和 grad_xx = cv2.multiply(grad_x, grad_x) grad_yy = cv2.multiply(grad_y, grad_y) grad_xy = cv2.multiply(grad_x, grad_y) # 应用Diffusion公式 laplacian = cv2.Laplacian(gray, cv2.CV_64F) diffusion = kappa * (grad_xx + grad_yy) - delta * laplacian # 更新图像 gray += diffusion # 将浮点型图像转换为8位灰度图 denoised = cv2.convertScaleAbs(gray) return denoised # 读取图像 image = cv2.imread('input.jpg') # 调用Diffusion去噪函数 denoised_image = diffusion_denoising(image, iterations=10, kappa=0.1, delta=0.2) # 显示原始图像和去噪后的图像 cv2.imshow('Original Image', image) cv2.imshow('Denoised Image', denoised_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 请注意,这只是一个简单的示例,实际的Diffusion算法可能有更复杂的实现方式和参数设置。具体的复现代码可能会因算法的不同而有所变化。如果您有特定的Diffusion算法或代码实现要求,请提供更多详细信息,以便我能够更好地帮助您。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI周红伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值