论文【链接】
源码【链接】
一、DDIM eta
ddim_step
表示执行几轮去噪迭代,eta
表示DDPM和DDIM的插值系数。当eta=0
时,为DDPM;当eta≠0
时,为DDIM。
参考
DDIM 简明讲解与 PyTorch 实现:加速扩散模型采样的通用方法
【stable diffusion】两个与采样器有关的参数效果:eta大小与ddim插值方式
二、torch.permute()函数
作用:
用于对torch进行维度变换。
transpose与permute的异同:
同:都是对tensor维度进行转置
异:permute函数可以对任意高维矩阵进行转置,但没有torch.permute()这个调用方式
对比:permute,也可以多次使用transpose
# 例子
torch.randn(2,3,4,5).permute(3,2,0,1).shape
参考
Pytorch之permute函数
三、parser.add_argument(action=‘store_true’)
action=‘store_true’
表示:只要运行时该变量有传参就将该变量设为True。
参考
python之parser.add_argument()用法——命令行选项、参数和子命令解析器
四、seed everything()
这是一个用于设置随机数种子的函数,它可以确保在每次运行程序时生成的随机数序列都是相同的。这对于需要重现实验结果或调试代码非常有用。该函数的参数是一个整数值,它可以是任何值,但通常使用当前时间戳或其他唯一的标识符作为种子值。
什么是随机种子
随机数,分为真随机数和伪随机数,真随机数需要自然界中真实的随机物理现象才能产生,而对于计算机来说生成这种随机数是很难办到的。而伪随机数是通过一个初始化的值,来计算来产生一个随机序列,如果初始值是不变的,那么多次从该种子产生的随机序列也是相同的。这个初始值一般就称为种子。
程序中的随机数:
np.random.seed
只影响 NumPy 的随机过程,torch.manual_seed
也只影响 PyTorch 的随机过程。
import torch
torch.manual_seed(777)print(torch.rand(1)) # 始终输出:tensor([0.0819])
print(torch.rand(1)) # 始终输出:tensor([0.4911])
CUDA 的随机数:
PyTorch 中,还有另一个设置随机种子的方法:torch.cuda.manual_seed_all
,从名字可知这是设置显卡的随机种子。
import torch
torch.cuda.manual_seed_all(777)print(torch.rand(1)) # 多次调用都产生不同输出
print(torch.rand(1, device="cuda:0")) # 始终输出 tensor([0.3530], device='cuda:0')
print(torch.rand(1, device="cuda:1")) # 始终输出 tensor([0.3530], device='cuda:0')
不同设备之间的随机数:
在 CPU 上创建 Tensor,再切换到 GPU 上。只要不直接在 GPU 上创建随机变量,就可以在 CPU 和 GPU 上产出相同的结果。
import torchtorch.manual_seed(777)
print(torch.rand(1).to("cuda:0")) # 输出 tensor([0.0819], device='cuda:0')
参数
Seed Everything - 可复现的 PyTorch(一)
五、Python getattr() 函数
getattr() 函数用于返回一个对象属性值。
参考
Python getattr() 函数
六、tensor.detach()
返回一个新的tensor,从当前计算图中分离下来的,但是仍指向原变量的存放位置,不同之处只是requires_grad为false,得到的这个tensor永远不需要计算其梯度,不具有grad。即使之后重新将它的requires_grad置为true,它也不会具有梯度grad。
这样我们就会继续使用这个新的tensor进行计算,后面当我们进行反向传播时,到该调用detach()的tensor就会停止,不能再继续向前进行传播。
注意:使用detach返回的tensor和原始的tensor共同一个内存,即一个修改另一个也会跟着改变。
参考
pytorch的两个函数 .detach() .detach_() 的作用和区别
七、torch.full()
用于创建全相同的张量。
## 例子
t = torch.full((3,3),10)
print("torch.full((3,3),10)的输出结果\n",t)
## 输出结果
torch.full((3,3),10)的输出结果
tensor([[10., 10., 10.],[10., 10., 10.],[10., 10., 10.]])
参考
PyTorch | torch.full()使用方法 | torch.full()如何使用? torch.full()例子说明 | 通过torch.full创建全相同的张量