扩散模型的入门易解1

1.扩散模型Diffusion

 a.前向扩散过程(Forward Diffusion Process)

如上图所示,是向图片x0添加噪声的过程.

大概来说,这里前向扩散过程是不断往输入图片中添加高斯噪声

正向扩散过程(Forward Diffusion Process)是指从初始状态开始,根据模型规则进行扩散和传播的过程。正向扩散过程是模型中最基本的操作,它描述了信息、颜料或其他物质从一个区域到另一个区域的传播方式。

a.1知识点补充:

前向扩散是一种用于计算神经网络中每个神经元的输出的方法。

在神经网络中,前向扩散是指通过将输入数据传递逐层地从网络的输入层到输出层的过程。每个神经元都会根据它们的权重激活函数对输入数据进行处理,并将结果传递给下一层的神经元。这样一层一层地传递和处理数据,直到到达输出层,最终得到网络的输出结果。

前向扩散过程是神经网络中一种基本的计算过程,用于产生预测结果或生成特征表示。在训练阶段,前向扩散的输出可以与目标输出进行比较,从而计算损失并进行反向传播来更新网络的权重,以优化网络的性能。

b.反向扩散过程(Reverse Diffusion Process)

 大概来说,这里反向扩散过程是 去除图片中的噪声

反向扩散过程(Reverse Diffusion Process)是指从最终结果开始,逆向追溯回初始状态的过程。正向扩散过程是从初始状态向前推进,根据模型规则进行颜料的扩散和蔓延,而反向扩散过程则是逆转这个过程。

c.训练过程公式

系数at可视为权重,随着迭代步数的增加慢慢减小。z符合高斯分布的噪声。
每一次套用xt-1就有:

2.代码解读

import torch
import torchvision
from torch import nn
from torch.nn import functional as F
from torch.utils.data import DataLoader
from diffusers import DDPMScheduler, UNet2DModel
from matplotlib import pyplot as plt
'''
导入必要的库
这些库包括PyTorch、PyTorch的相关模块、
数据加载工具DataLoader、diffusers库中的DDPMScheduler和UNet2DModel模型,
以及用于绘图的matplotlib库
'''

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f'Using device: {device}')
'''该代码段检查是否有可用的CUDA设备(GPU),如果有则使用CUDA,否则使用CPU。
然后打印出当前使用的设备

torch.device() 函数用于返回一个指定设备类型的设备对象
'''

dataset = torchvision.datasets.MNIST(root="./data/mnist/", train=True, download=True,
                                    transform=torchvision.transforms.ToTensor())
'''这行代码使用torchvision库中的MNIST类来加载MNIST数据集。
数据集将被下载到"./data/mnist/"目录下,并且进行了一个简单的转换,将图像转换为张量

root 参数指定数据集下载的根目录路径
train 参数指定下载训练集还是测试集,这里选择训练集
download 参数指定是否需要下载数据集,如果数据集已经存在,则不会重复下载
transform 参数指定对数据集进行的转换操作
这里使用 torchvision.transforms.ToTensor() 将数据集中的图像转换成张量
'''

train_dataloader = DataLoader(dataset, batch_size=8, shuffle=True)
'''
这行代码创建了一个数据加载器train_dataloader,用于将数据集加载到模型中进行训练。
它指定了批量大小为8,并且打开了数据的随机洗牌

dataset 参数指定要加载的数据集
batch_size 参数指定每个 batch 的大小,这里设置为 8
shuffle 参数指定是否需要打乱数据集,这里设置为 True,即打乱数据集顺序
'''

x, y = next(iter(train_dataloader))
print('Input shape:', x.shape)
print('Labels:', y)
'''
使用 next(iter(train_dataloader)) 函数从训练数据加载器中获取一个 batch 的数据
其中 iter(train_dataloader) 函数将数据加载器转换为可迭代对象
next() 函数返回可迭代对象中的下一个元素

打印该 batch 数据中输入图像的形状和对应的标签。
'''

plt.imshow(torchvision.utils.make_grid(x)[0], cmap='Greys')
'''
使用 torchvision.utils.make_grid() 函数创建一个图像网格,并使用 plt.imshow() 函数将网格图像展示出来
make_grid() 函数可以将一批图像组成一个网格,其中第一个参数是输入的图像张量
imshow() 函数用于展示图像,其中 cmap 参数指定了图像的颜色映射,这里设置为 "Greys",表示将图像展示为灰度图。
'''

from diffusers import DDPMPipeline
'''导入了 DiffusionPipeline 类所需的模块。'''

# Load the butterfly pipeline
butterfly_pipeline = DDPMPipeline.from_pretrained(
    "johnowhitaker/ddpm-butterflies-32px"
).to(device)
'''
使用 DDPMPipeline.from_pretrained() 方法加载了预训练的模型,该模型可以生成蝴蝶图片。
预训练模型的 ID 是 "johnowhitaker/ddpm-butterflies-32px"。
将加载的模型转移到之前定义的设备(即 GPU 或 CPU)上。
'''

# Create 8 images
images = butterfly_pipeline(batch_size=8).images
'''
调用 butterfly_pipeline() 方法生成一批蝴蝶图片,参数 batch_size 设置为 8。
'''

# View the result
make_grid(images)
'''
获取生成的图像张量,并将其传递给 make_grid() 函数创建图像网格。
'''

(1中图片引自知乎:绝密伏击)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值