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是干啥的。