GNN Algorithms(7): DDPM

扩散模型 diffusion model:正向扩散过程 Forward Diffusion Process、反向生成过程 Reverse Generation Process.

本质:DDPM, Denoising Diffusion Probabilistic Model

  • T步加噪:没有参数q(x_t|x_{t-1}) ->随机取一个每一步都要加的随机高斯噪声\epsilon value,T步后生成一个符合正态分布的纯噪声图像x_T,这其实也是个噪声noise。
  • T步去噪:有参数p_{\theta}(x_{t-1}|x_{t}) ->模型生成一个每一步需要剔除的模拟高斯噪声\epsilon_{\theta},从噪声图像noise中恢复出一个新的清晰、有意义的图像。
    • 加噪声逆操作 \approx 用去噪网络近似模拟这个过程 = 去噪过程p_{\theta}(x_{t-1}|x_{t})
    • 去噪过程关键:构造一个优质的去噪模型(U-Net or ResNet)去估计反向过程每一步需要剔除的伪高斯噪声\epsilon_{\theta}

目录

1. Background

1.1 VAE

1.2 GAN

1.3 DDPM

2. Diffusion Model Pipeline 流程

2.1 前向扩散过程

2.2 反向生成过程

2.3 Diffusion model优缺点

3. DDPM Formulation Derivation

3.1 前向过程

3.2 反向过程

3.3 损失函数 Loss,

4. DDPM Algorithm

4.1 DDPM Training Algorithm 模型训练过程

4.2 DDPM Sampling Algorithm 图片生成过程

5. DDPM Implementation on MNIST

5.1 Why choose U-Net?

5.2 Time Positional Encoding (PE) 时序编码 

5.3 U-Net model 

 5.4 DDPM code

参考


1. Background

一般来说,图像生成模型根据随机数生成图像,被用于解决训练数据不足的问题,但生成任务缺乏有效的指导 label,那如何让神经网络生成的图像向[标准答案] or [理想答案]靠拢?

为了解决这一问题,人们设计了专门用于生成图像的NN model:VAE, GAN, DDPM。

1.1 VAE

VAE,Variational Auto-Encoder,变分自编码器,在2013年提出于paper Auto-Encoding Variational Bayes,通过学习数据的概率分布来生成新样本。因为直接学习向量生成的图像很困难,也没有label指导所以VAE先把图像变成向量,再用该向量生成图像

VAE模型 architecture:编码器、概率潜在空间、解码器。在training stage,encoder预测每个图像的均值和方差,然后从高斯分布中对这些值进行采样,并将其传递到decoder中,其中输入图像预计与输出图像相似。这个过程包括KL Divergence计算loss。

VAE 优点:能够生成各种各样的图像

缺点:可能就是准确度差点意思

reference:https://adaning.github.io/posts/9047.html 

1.2 GAN

GAN, Generative Adversarial Networks,生成式对抗网络,提出于 NeurlPS 2014 paper: Generative Adversarial Nets。通过训练两个神经网络(生成器和判别器)互相对抗来学习数据分布。

- generator,生成器接受一个随机噪声noise作为输入,输出一个图片向量。

- discriminator,接受一个真实图像作为输入,生成真实图像向量。

- 对抗损失loss,Jensen-Shannon散度,Wasserstein距离,最小二乘损失,铰链损失Hinge Loss。

GAN优点:GANs擅长生成与训练集图像非常相似的图像

缺点:GANs生成图像的目标追求与training图像高度一致,缺乏多样性

reference:简单使用PyTorch搭建GAN模型 | 机器之心

1.3 DDPM

DDPM = VAE + GAN,生成高精度且多样性强的伪图像

DDPM,在2020年提出于paper:Denoising Diffusion Probabilistic Models。

2. Diffusion Model Pipeline 流程

Diffusion model是一类生成模型,包括:前向扩散过程反向生成过程。在正向过程中,原始真实图像输入x0会不断混入高斯噪声\epsilon,经过T次加噪后,图像x_T会变成一幅符合标准正态分布的纯噪声图像,即纯纯的noise;在反向生成过程中,我们希望训练出一个去噪神经网络\theta该网络能够预估反向过程中每一步需要剔除的模拟高斯噪声\epsilon_{\theta},T步去噪后把噪声图像noise x_T还原回x0。

2.1 前向扩散过程

  • 在这个过程中,diffusion model通过逐步向图像数据添加高斯噪声,使其变得越来越模糊,最终使noise数据分布接近标准正态分布。
  • 具体来说,给定一个初始数据点x0,前向扩散过程产生一个序列x1, x2,..., xT,其中每个xt都是通过在x_{t-1}上添加高斯噪声得到的。

2.2 反向生成过程

  • 在这个阶段,diffusion model通过反向去噪过程,从噪声图像noise中逐步生成新的样本,这个过程是前向过程的逆过程,model学会每一步都剔除一些模拟高斯噪声,让图像变得更清晰。
  • 给定一个最中的噪声图像数据noise xT,反向过程生成一个序列x_{T-1}, x_{T-2},..., x_0,最终得到一个新的数据样本。
  • Diffusion model training的目的是学习一个精准的去噪网络,可在每一步准确地预估需要剔除的模拟高斯噪声\epsilon_{\theta},使纯噪声图像noise能够在反向过程中生成高质量的新样本。

2.3 Diffusion model优缺点

  • 优点是扩散模型能生成样本质量高且多样性强的新图像。
  • 缺点是计算代价较高,因为生成过程需要执行多次去噪操作。

3. DDPM Formulation Derivation

3.1 前向过程

在前向过程中,从训练集真实图像中随机采样一张图像x_0会被添加T次噪声,使最终噪声图像x_T符合标准正态分布。那么前向过程q(x_t|x_{t-1})指的是在前向的每一步通过向图像x_{t-1}中添加高斯噪声\epsilon得到x_tx_t是从一个均值与x_{t-1}相关的正态分布里采样出来的,不是无脑地直接相加,这是一个马尔可夫过程x_t状态只与上一个状态x_{t-1}相关,过程表示为:

x_t \sim \mathcal{N} (\mu_t(x_{t-1}), \sigma^2_tI) 

这个正态分布还可以写成加噪公式(1):

x_t \sim \mathcal{N}(\sqrt{1-\beta_t}x_{t-1}, \beta_tI) 

这个公式看起来很奇怪,主要是\sqrt{1-\beta_t}这个系数是从哪冒出来的?

证明:归纳法--假定这个公式是正确的,从结论出发倒推,证明假设或公式正确。假如给定x_0,也就是从训练数据集里采样出一幅图片,那么该怎么计算任意时刻t的图像x_t呢?

我们根据上式从x_t开始倒推,x_t是一个接近服从正态分布的样本,假设正向过程加入的高斯噪声为\epsilon_t,很明显\epsilon_t也服从正态分布,\epsilon_t \sim \mathcal{N}(0,I)。那么对应加入上一时刻图像x_{t-1}的高斯噪声为\epsilon_{t-1},可以推出加噪公式(1):

x_t = \sqrt{1-\beta_t}x_{t-1} + \sqrt{\beta_t} \epsilon_{t-1}                (1)

再往前推几步:

x_t = \sqrt{1-\beta_t}x_{t-1} + \sqrt{\beta_t} \epsilon_{t-1} \\ = \sqrt{1-\beta_t}(\sqrt{1-\beta_{t-1}}x_{t-2} + \sqrt{\beta_{t-1}}\epsilon_{t-2}) + \sqrt{\beta_t} \epsilon_{t-1} \\ = \sqrt{(1-\beta_t)(1-\beta_{t-1})} x_{t-2} + \sqrt{(1-\beta_t)\beta_{t-1}}\epsilon_{t-2}+ \sqrt{\beta_t} \epsilon_{t-1}

从正态分布性质可知: 均值相同的正态分布加在一起后,方差也会加到一起,也就是\mathcal{N}(0, \sigma_1^2 I)\mathcal{N}(0, \sigma_2^2 I)合起来会得到\mathcal{N}(0, (\sigma_1^2 + \sigma_1^2) I)。根据这一性质,\sqrt{(1-\beta_t)\beta_{t-1}}\epsilon_{t-2}+ \sqrt{\beta_t} \epsilon_{t-1}这一项乘开、相加、化简为,可得:

\sqrt{(1-\beta_t)(1-\beta_{t-1})} x_{t-2} + \sqrt{(1-\beta_t)\beta_{t-1}}\epsilon_{t-2}+ \sqrt{\beta_t} \epsilon_{t-1} \\ = \sqrt{(1-\beta_t)(1-\beta_{t-1})} x_{t-2} + \sqrt{1-(1-\beta_t)(1-\beta_{t-1})} \epsilon

在往前推一步到t-2时刻,结果是:

\sqrt{(1-\beta_t)(1-\beta_{t-1})(1-\beta_{t-2})} x_{t-3} + \sqrt{1-(1-\beta_t)(1-\beta_{t-1})(1-\beta_{t-2})} \epsilon

这时我们令\alpha_t=1-\beta_t\bar{\alpha_t} = \prod^{t}_{i=1}\alpha_i可以很容易的总结出加噪公式(2)

x_t = \sqrt{\bar{\alpha_t}}x_0 + \sqrt{1-\bar{\alpha_t}} \epsilon                (2)

q(x_t|x_0) = \mathcal{N}(x_t; \sqrt{\bar{\alpha}_t}x_0, (1-\bar{\alpha}_t)I)        (2)

这里,\beta_t是一个小于1的常数,并且从几乎为0开始逐渐增大,这时\alpha_t逐渐变小,\bar{\alpha_t}趋近于0的速度也越来越快。最后\bar{\alpha_T}几乎为0,带入公式(2):x_T = \sqrt{\bar{\alpha_T}}x_0 + \sqrt{1 - \bar{\alpha_T}}\epsilon就满足标准正态分布里,符合我们对扩散模型的需求,自然证明x_t \sim \mathcal{N}(\sqrt{1-\beta_t}x_{t-1}, \beta_tI)满足正态分布。

上述推断可以简单描述为:加噪公式能够从慢到快地改变原始图像x_0,让图像x_t最终均值为0,方差为I

3.2 反向过程

在正向过程中,我们人为设置了T步加噪过程。所以,在反向过程中,我们希望再取消掉之前每一步的加噪声操作,让一幅纯噪声图像x_t变回原始数据集里的图像x_0,这样一个加噪声逆操作的过程叫做去噪。这样,我们就可以把任意一个从标准正态分布里采样出来的噪声图像变成一幅和训练数据长得差不多的图像,从而达到图像生成的目的。

但是,在实际情况中,加噪声的逆操作很难具体计算和表达所以我们用一个去噪网络去近似模拟这个过程=去噪过程,这其中的关键在于构造一个优质的去噪模型去估计每一步需要剔除的反向高斯噪声\epsilon_{\theta}

  • 加噪声逆操作 \approx 用去噪网络近似模拟这个过程=去噪过程p_{\theta}(x_{t-1}|x_{t})
  • 去噪过程关键:构造一个优质的去噪模型(U-Net or ResNet)去估计反向过程每一步需要剔除的伪高斯噪声\epsilon_{\theta}。 

现在问题来了:正向过程噪声\epsilon是从一个正态分布中随机random采样出,那去噪操作的数学形式是怎样的?如何让噪网络如何学习伪高斯噪声\epsilon_{\theta}

数学原理表明,当\beta_t足够小时,每一步加噪声的逆操作也满足正态分布

p_{\theta}(x_{t-1}|x_t) = \mathcal{N}(x_{t-1};\mu_{\theta}(x_t,t), \sum_{\theta}(x_t,t)) \\ \Rightarrow x_{t-1} \sim \mathcal{N}(\tilde{\mu_t}, \tilde{\beta_t}I)

其中,当前时刻加噪声逆操作的均值\tilde{\mu}_t和方差\tilde{\beta}_t由当前时刻t、当前图像x_t决定。因此,为了描述所有去噪操作,神经网络应该输入t、x_t,拟合当前的均值\tilde{\mu}_t和方差\tilde{\beta}_t

辨析概念:上面加噪声是固定的,加噪声的逆操作也是固定的,去噪过程是模拟的。加噪声的逆操作不太可能从理论上求得所以理想情况下,我们希望去噪操作=加噪声逆操作,这就是神经网络预测值和真实值之间的关系

那去噪操作的均值和方差是多少呢?

假设现实情况中所有结果都是可计算的!如果给定了某个训练输入x_0,多个这一个限制条件后,去噪分布就可以用贝叶斯公式计算(其中,q表示概率分布):

q(x_{t-1}|x_t,x_0) = q(x_t|x_{t-1}, x_0) \frac{q(x_{t-1}|x_0)}{q(x_t|x_0)}

这个公式左侧q(x_{t-1}|x_t,x_0) = \mathcal{N}(x_{t-1};\tilde{\mu}_t,\tilde{\beta}_tI)表示加噪声的逆操作,它的均值和方差都是待求的!右边的q(x_t|x_{t-1},x_0)=\mathcal{N}(x_t; \sqrt{1-\beta_t}x_{t-1},\beta_tI)是根据加噪公式(1)x_t = \sqrt{1-\beta_t}x_{t-1} + \sqrt{\beta_t} \epsilon_{t-1}计算出来的。由于x_0已知,q(x_{t-1}|x_0)q(x_t|x_0)两项都是可以根据加噪公式(2)x_t = \sqrt{\bar{\alpha_t}}x_0 + \sqrt{1-\bar{\alpha_t}} \epsilon计算出来的。

q(x_t|x_0) = \mathcal{N}(x_t; \sqrt{\bar{\alpha}_t}x_0, (1-\bar{\alpha}_t)I) \\ q(x_{t-1}|x_0) = \mathcal{N}(x_{t-1}; \sqrt{\bar{\alpha}_{t-1}}x_0, (1-\bar{\alpha}_{t-1})I)

经过计算化简得到去噪均值公式(1-1):

\tilde{\mu}_t = \frac{1}{\sqrt{\alpha_t}}(x_t - \frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}_t}}\epsilon_t)        (1-1)

去噪方差公式(2-1):

\tilde{\beta}_t = \frac{1-\bar{\alpha}_{t-1}}{1-\bar{\alpha}_t} \cdot \beta_t                (2-1)

Notice: \beta_t是加噪声方差,是一个常量。那么理想情况下,加噪声逆操作\tilde{\beta}_t也是一个常量,不与x_0相关。因为理论上x_0x_t分别是给定加噪和去噪输入,\beta_t推出的->\alpha_t\bar{\alpha}_t -> \tilde{\beta}_t也是是固定。 

扩展:公式(1-1)和(2-1)证明

-> 标准正态分布公式:f(x|\mu,\sigma^2)=\frac{1}{\sqrt{2\pi\sigma^2}}exp(-\frac{(x-\mu)^2}{2\sigma^2})

-> 加噪公式(2): q(x_t|x_0) = \mathcal{N}(x_t; \sqrt{\bar{\alpha}_t}x_0, (1-\bar{\alpha}_t)I)

-> 加噪公式(1): q(x_t|x_{t-1},x_0) = \mathcal{N}(x_t; \sqrt{1-\beta_t}x_{t-1}, \beta_tI)

那么q(x_{t-1}|x_t,x_0)右边贝叶斯公式展开得到:

q(x_{t-1}|x_t,x_0) = \frac{1}{\sqrt{2\pi\beta_t}}exp(-\frac{(x_t-\sqrt{1-\beta_t}x_{t-1})^2}{2\beta_t}) \cdot \\ \frac{1}{\sqrt{2\pi(1-\bar{\alpha}_{t-1})}}exp(-\frac{(x_{t-1}-\sqrt{\bar{\alpha}_{t-1}}x_0)^2}{2(1-\bar{\alpha}_{t-1})}) \cdot \\ \frac{1}{\sqrt{2\pi(1-\bar{\alpha}_t)}}exp(-\frac{(x_{t}-\sqrt{\bar{\alpha}_{t}}x_0)^2}{2(1-\bar{\alpha}_{t})})^{-1}

由于多个正态分布的乘积还是一个正态分布,我们知道q(x_{t-1}|x_t,x_0)也可以用一个正态分布\mathcal{N}(x_{t-1}; \tilde{\mu}_t, \tilde{\beta}_tI)表达,它最后一定能写成这样形式:

q(x_{t-1}|x_t, x_0)=\frac{1}{\sqrt{2\pi\tilde{\beta}_t}}exp(-\frac{(x_{t-1}-\tilde{\mu}_t)^2}{2\tilde{\beta}_t})

问题变成了如何把开始很长的式子化简,算出\tilde{\mu}_t\tilde{\beta}_t

方差\tilde{\beta}_t可以从指数函数的系数来求得,比较好计算。系数为:

\frac{1}{\sqrt{2\pi\beta_t}} \cdot \frac{1}{\sqrt{2\pi(1-\bar{\alpha}_{t-1})}} \cdot \sqrt{2\pi(1-\bar{\alpha}_{t})} \\ = \frac{1}{\sqrt{2\pi\tilde{\beta}_t}}

所以,化简后得到去噪方差公式(2-1)为:

\tilde{\beta}_t = \frac{1-\bar{\alpha}_{t-1}}{1-\bar{\alpha}_t} \cdot \beta_t        (2-1)

同理,\tilde{\mu}_t只需要关注指数函数的指数部分。指数部分一定是一个关于x_{t-1}的二次函数,只要化简成(x_{t-1}-C)^2的形式,再除以-2倍的方差,就可以得到均值了。

指数部分为:

-\frac{1}{2}(\frac{(x_t-\sqrt{1-\beta_t}x_{t-1})^2}{\beta_t} + \frac{(x_{t-1}-\sqrt{\bar{\alpha}_{t-1}}x_0)^2}{(1-\bar{\alpha}_{t-1})} + \frac{(x_{t}-\sqrt{\bar{\alpha}_{t}}x_0)^2}{(1-\bar{\alpha}_{t})})

x_{t-1}只在前两项里有,并把和x_{t-1}有关的项化简成(x_{t-1}-C)^2的形式,可以计算出均值:

\tilde{\mu}_t = \frac{\sqrt{\alpha_t}(1-\bar{\alpha}_{t-1})}{1-\bar{\alpha}_t}x_t + \frac{\sqrt{\bar{\alpha}_{t-1}}\beta_t}{1-\bar{\alpha}_t}x_0

在反向去噪过程中,神经网络输入是x_t和t。也就是说,上式中只有x_0是未知的,我们用加噪公式(2)可以反推出x_tx_0的关系。

x_t = \sqrt{\bar{\alpha_t}}x_0 + \sqrt{1-\bar{\alpha_t}} \epsilon_t \\ \Rightarrow x_0 = \frac{x_t-\sqrt{1-\bar{\alpha}_t}\epsilon_t}{\sqrt{\bar{\alpha}_t}}

把这个x_0带入均值公式,化简后就得到去噪均值公式(1-1):

\tilde{\mu}_t = \frac{1}{\sqrt{\alpha_t}}(x_t - \frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}_t}}\epsilon_t)        (1-1)

3.3 损失函数 Loss,

直接计算所有数据加噪声逆操作的数据分布是不太现实的。 

=》NN学习的目标是让去噪网络输出的噪声分布和理论计算的加噪声逆分布一致

为了让去噪生成的图像更加接近于x_0,我们要让加噪声正态分布和加噪声逆操作正态分布保持一致。那么,最直观的想法就是让去噪网络输出分布无限接近于加噪分布,即两个正态分布的均值和方差尽可能接近,根据上文分析,去噪方差是常量,那么只需让去噪均值尽可能接近就可以了。

=》training去噪网络,只需要拟合T个均值就行了,不用再逆和方差。

那如何让去噪均值更接近于加噪均值呢?因为加噪均值公式(1-1)中唯一不确定的量只有\epsilon_t

=》那么,神经网络学习拟合均值的问题就转化为了用模拟高斯噪声\epsilon_{\theta}拟合加噪高斯噪声\epsilon_t,如公式(3)所示。

L = ||\epsilon_t - \epsilon_{\theta}(x_t, t)||^2                 (3)

=》optimiz的最终结果是让噪声图像noise(Algorithm Sampling)更接近高斯分布,拟合的逆噪声\epsilon_{\theta}也接近于高斯分布。

此时,我们反思一下反向过程,神经网络应该让T个去噪操作拟合对应的T个加噪声逆操作。每步加噪声逆操作符合正态分布,且在给定某个输入时,该正态分布的均值和方差是可以用解析式表达出来的。因此,神经网络学习的目标就是让其输出的去噪声和理论计算的加噪声逆操作分布一致。经过数学上的一些化简,问题被转化为了拟合生成x_t时用到的随机噪声\epsilon_t。 

4. DDPM Algorithm

4.1 DDPM Training Algorithm 模型训练过程

这是DDPM model训练过程,计算每一步去噪高斯噪声\epsilon_{\theta}和加噪高斯噪声\epsilon_{t}的loss。

4.2 DDPM Sampling Algorithm 图片生成过程

这是用训练好的DDPM model生成图片的过程

z是图片生成过程中多样性存在的关键!

  • additional noise z is added at each step to maintain the stochasticity of the sampling process, 增加每一步图片生成过程中的概率多样性, which helps ensure the diversity of the generated samples

5. DDPM Implementation on MNIST

5.1 Why choose U-Net?

在DDPM中,理论上我们可以用任意一种神经网络架构作为噪声预测模型,但只有带了残差块和时序编码的U-Net才能较好地完成去噪,因此绝大多数DDPM都会用U-Net网络作为反向噪声\epsilon_{\theta}预测模型,ResNet结构差一点效果不太行

U-Net background:U-Net刚提出来时是用于医学图像分割任务,通过encoder和decoder结构控制分辨率将原始医学图像的主体部分突显出来,即U-Net input是原始图像,label是只留下重要区域的医学图像,专业术语叫作分割掩码,就是让U-Net编码解码后做一个特征提取的作用让恢复尺寸的图像尽可能与label图像相似。

U-Net Application:而U-Net在DDPM中有所不同,DDPM正向过程生成的xt说是一个噪声图像,其实就是一个啥也看不出来的纯高斯噪声noise,U-Net其实就是对一个噪声解码后再去恢复这个输入的噪声那我们一定要用encoder-decoder结构吗?不用可以吗?我们只用decoder直接从xt模拟生成noise图像不行吗?答案肯定是可以的,比如残差网络ResNet,它就没用编码器,直接从噪声图像xt模拟生成反向高斯噪声\epsilon_{\theta}就像上面说的,结构简单的ResNet预测效果不如U-Net好,原因可能是U-Net的encoder-decoder结构和DDPM更像,或者是U-Net网络结构更复杂,所以U-Net和encoder不是必须的,只是它们的效果最好!

5.2 Time Positional Encoding (PE) 时序编码 

用Transformer positional encoder编码时间t信息。

本质:positional encoding = position * frequency encoding

PE(pos, 2i) = sin(\frac{pos}{10000^{\frac{2i}{d_{model}}}})

PE(pos, 2i+1) = cos(\frac{pos}{10000^{\frac{2i}{d_{model}}}})

  • pos表示position index;2i和2i+1分别表示偶数和奇数维度;d_{model}表示embedding dimension。
  •  10000^{\frac{2i}{d_{model}}}是缩放因子scaling factor,即频率frequency,range approximately at (1/10000, 1] as dimension increasing ->这使得不同维度具有不同的频率虽然每个维度i的频率是固定的,但不同位置pos index在每一维度i上的频率都是不同的!所以说positional encoding在序列的每个位置都是唯一的!

为什么要用到不同频率/周期的正弦和余弦函数进行位置编码?在PE中用到频率序列? 

  • 在频率范围内,正弦和余弦函数保持连续性和单调性!我也不理解这句话 ,这种方法保证了相邻位置之间差异较小,而较远位置之间差异较大。
  • 捕捉不同尺度的信息。低频部分(高维)可以捕捉到序列中的全局信息,而高频部分(低维)可以捕捉到序列中的局部信息
  • 平滑变化。正弦和余弦函数提供了一种smoothed周期性变化,这对model来说更易学习和泛化。

底数10000是不是越大越好?

当然不是越大越好!因为底数越大,虽然能表示的维度越长,但这也意味着在[-1, +1]范围内向量每个维度i的取值越拥挤,造成两个位置向量距离越近,着对后续self-attention计算是不利的。 

5.3 U-Net model 

U-Net model在DDPM中的作用主要是预测反向生成过程中的噪声\epsilon_{\theta},是DDPM中的核心组件,帮助DDPM在反向生成过程中逐步恢复干净的图像。U-Net是一种典型的encoder-decoder CNN结构,主要由三部分组成:encoders with down-sampling、skip-connection、decoders with up-sampling

  • U-Net计算每一层的高[H]和宽[W]为了正确构建上采样up-sampling和拼接操作,这些计算确保在解码路径中,经过上采样后的特征图与编码路径中相应层的特征图具有兼容的大小,从而可以顺利的进行拼接操作。 
  • 编码器 encoder:类似于传统GNN网络,用于捕捉图像的上下文信息。它包括一系列的卷基层和池化层,逐步减少特征图的空间尺寸,并增加特征图的channels num。
    • Convolution with activation -> max pooling -> down-sampling -> repeat several times.
  • 中间层 mid,特征图尺寸最小的时候,连接encoder和decoder的中间层模块。
  • 跳跃连接skip connection,用于将encoder的输出特征 + decoder 输出特征拼接是出现在decoder 代码中的。拼接出现在decoder模块中的以便在上采样过程中保留高分辨率特征。它的实现方式主要有两种:
    • 相加:残差网络ResNet方式。skip connection将输入直接加到输出上,y=f(x) + x。 
    • 拼接:U-Net方式。skip connection用于将编码器中的特征图与解码器中的特征图进行拼接,y = Concat(x_{encoder}, x_{decoder})
  • 解码器decoder:用于逐步恢复输入图像的空间尺寸,同时结合encoder提取的特征信息,生成与输入图像相同尺寸的输出图像。2x2反卷积公式
    • H_out = (H_in -1) x stride - 2 x padding + kernel_size + output_padding
    • W_out = (W_in -1) x stride - 2 x padding + kernel_size + output_padding
    • transposed convolution -> up-sampling -> concat拼接-> convolution with activation.
  • attention,是可选项,可以不加。

 5.4 DDPM code

my Github: Diffusion_Models_Learning/DDPM_model_2 at master · yuyongsheng1990/Diffusion_Models_Learning · GitHub

参考

挺好:扩散模型(Diffusion Model)详解:直观理解、数学原理、PyTorch 实现 | 周弈帆的博客

DDPM模型——pytorch实现_条件ddpm模型序训练python代码实例-CSDN博客

扩散模型的原理及实现(Pytorch)-CSDN博客

京东团队的DDPM讲解也很好:https://www.cnblogs.com/jingdongkeji/p/17267671.html 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天狼啸月1990

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

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

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

打赏作者

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

抵扣说明:

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

余额充值