Path: blob/main/diffusers_doc/zh/basic_training.ipynb
20236 views
训练扩散模型
无条件图像生成是扩散模型最常见的应用之一,它会生成与训练数据集风格相似的图像。通常来说,在某个特定数据集上微调预训练模型能得到最好的结果。你可以在 Hub 上找到很多现成检查点;如果找不到满意的,也完全可以自己训练一个!
这篇教程会教你如何在 Smithsonian Butterflies 数据集的一个子集上,从零开始训练一个 UNet2DModel,生成属于你自己的 🦋 蝴蝶图像 🦋。
[!TIP] 💡 这篇训练教程基于 Training with 🧨 Diffusers notebook 编写。如果你想了解更多背景,例如扩散模型的工作原理,也推荐一起看看这个 notebook。
开始之前,请确认已经安装了 🤗 Datasets,用来加载和预处理图像数据集;以及 🤗 Accelerate,用来简化任意数量 GPU 上的训练。下面这条命令也会安装 TensorBoard 来可视化训练指标(你也可以使用 Weights & Biases 跟踪训练)。
我们也很鼓励你把模型分享给社区。为此,你需要登录自己的 Hugging Face 账号(如果还没有,可以在 这里 创建)。你可以在 notebook 中登录,系统会提示你输入 token。请确保这个 token 具有写入权限。
训练配置
为了方便起见,我们先创建一个 TrainingConfig 类,把训练超参数放在一起(你可以按需调整):
加载数据集
你可以很轻松地通过 🤗 Datasets 加载 Smithsonian Butterflies 数据集:
[!TIP] 💡 你也可以从 HugGan Community Event 找到更多数据集,或者通过本地
ImageFolder使用自己的数据集。如果你使用 HugGan Community Event 里的数据集,把config.dataset_name设为对应数据集的 repository id;如果你使用自己的图像,就设为imagefolder。
🤗 Datasets 使用 Image 特性自动解码图像数据,并将其加载为 PIL.Image,所以我们可以直接可视化:
不过这些图像的尺寸各不相同,所以你需要先做预处理:
Resize把图像缩放到config.image_size中定义的大小。RandomHorizontalFlip通过随机水平翻转图像来做数据增强。Normalize很重要,它会把像素值缩放到[-1, 1]区间,这是模型期望的输入范围。
使用 🤗 Datasets 的 set_transform 方法,在训练过程中按需应用 preprocess 函数:
你也可以再次可视化图像,确认它们已经被调整到目标尺寸。接下来,就可以把数据集封装成一个 DataLoader 来训练了!
创建 UNet2DModel
在 🧨 Diffusers 中,可以很方便地通过模型类和参数创建预训练模型。例如,下面创建一个 UNet2DModel:
通常最好先快速检查一下,样本图像的形状和模型输出形状是否一致:
很好!接下来,你还需要一个调度器为图像添加噪声。
创建调度器
调度器在训练和推理中的行为不同。推理时,调度器会从噪声中生成图像;训练时,调度器会取扩散过程某一步的模型输出或样本,并根据噪声日程与更新规则对图像加噪。
我们先看看 DDPMScheduler,并使用 add_noise 方法给前面的 sample_image 添加一些随机噪声:
模型训练的目标,就是预测添加到图像中的噪声。当前步骤的损失可以这样计算:
训练模型
到这里,启动训练所需的大部分组件都准备好了,剩下的就是把它们拼起来。
首先,你需要一个优化器和一个学习率调度器:
接着,你还需要一种评估模型的方法。评估时,我们可以使用 DDPMPipeline 生成一批示例图像,并把它们保存成一个网格图:
现在,你可以用 🤗 Accelerate 把这些组件包装进一个训练循环中,轻松实现 TensorBoard 日志记录、梯度累积和混合精度训练。为了把模型上传到 Hub,还需要写一个函数来创建仓库并将训练结果推送到 Hub。
[!TIP] 💡 下面的训练循环看起来可能有点长,也有点吓人,但等你真正只用一行代码启动训练时,就会觉得很值得!如果你现在只想快点开始生成图像,也可以先直接复制运行下面的代码,之后再回头仔细研究训练循环,比如等模型训练完成的时候。🤗
呼,这段代码确实不少!不过现在你终于可以用 🤗 Accelerate 的 notebook_launcher 函数启动训练了。把训练循环函数、所有训练参数以及进程数(你可以改成自己可用 GPU 的数量)传进去即可:
训练完成后,来看看你的扩散模型最终生成的 🦋 蝴蝶图像 🦋 吧!
下一步
无条件图像生成只是可训练任务中的一个例子。你可以继续访问 🧨 Diffusers 训练示例 页面,探索更多任务和训练技术。比如:
Textual Inversion:教会模型一个特定的视觉概念,并把它融入生成结果中。
DreamBooth:给定某个主体的若干输入图像,生成该主体的个性化图像。
引导:在你自己的数据集上微调 Stable Diffusion 模型。
引导:使用 LoRA 这种更省内存的方法,更快地微调超大模型。