扩散模型的源码学习diffusion_model

 1.diffusion_model有几个主要的部分,

(1)Unet,主干网络。

(2)GaussianDiffusion,也就是主要的训练策略。

 2.

生成一个测试用的tensor来进行实验。 

3.进入到高斯模型的内部,发现他的forward并不是特别复杂,

他会先生成一个随机数t,然后再对img做一定的处理,然后再利用p_loss做一个loss。

可以看到,难点应该就是p_loss和对图片的这个处理上。

4.可以看到,生成了一个t,是随机的0,1不知道在干啥。 

5.然后把img输入到了这个normalize这里面,注意这个img是(8,3,128,128)的尺寸的。 

 他这个normalize_neg_one_to_one,只有一行,就返回了img,我们接下来试一下,这个操作会产生什么样的变化,因为他变化一下就输入到了p_losses里面,可以看到在p_losses之前的操作都是特别简单的,这说明整个需要操作的大部分应该都在p_losses里面。

 乘2,减1,就是做了简单的变化。

 6.然后就开始输入进p_losses了,这个输入的img是(8,3,128,128)维度的。

然后t是一个8的tensor,有8个随机的0,1数。

7.进入到p_losses里面,

发现,这个loss所需要的东西,一个是x_start,一个是t,也就是随机生成的一个tensor,和一个随机数的列表。

注意这个x_start是(8,3,128,128)这个维度的。

t是8个随机数tensor。

 8.然后会利用default这个生成噪声。

 也就是说这个default所使用的是提供的这个rand。

 9.利用这个生成噪声noise,这个维度是(8,3,128,128)的。

 10.x_start也是(8,3,128,128)维度的。

 11.然后到了q_sample这里,

 12.看一下这个extract 是干什么的,他需要传入三个值,这些都是一些基本的属性,并没有传入x_start本身,所以,他们是和x本身的值无关的,而是一个随着时间变化的东西。

 

 它里面的tensor是这样的。

 

 

 13.

 14.

进行两个extract后就到了Unet里面。 

15.正常的做loss,然后到了下面这个reduce这里,看看这个reduce是干啥的。

 

猜你喜欢

转载自blog.csdn.net/weixin_45193103/article/details/128284722