扩散模型课程文档
单元 2:微调、引导和条件化
并获得增强的文档体验
开始使用
单元 2:微调、引导和条件化
欢迎来到 Hugging Face 扩散模型课程的第二单元!在本单元中,你将学习如何以新的方式使用和调整预训练的扩散模型。你还将了解我们如何创建能够接受额外输入作为 条件 来控制生成过程的扩散模型。
开始本单元 :rocket:
以下是本单元的步骤:
- 请确保你已注册本课程,以便在新材料发布时收到通知。
- 通读以下材料,了解本单元的关键思想。
- 查看 微调与引导 笔记本来学习如何使用 🤗 Diffusers 库在新数据集上微调现有的扩散模型,以及如何使用引导来修改采样过程。
- 按照笔记本中的示例,为你的自定义模型分享一个 Gradio 演示。
- (可选) 查看 类别条件化扩散模型示例 笔记本来了解我们如何为生成过程添加额外的控制。
- (可选) 查看 此视频,以非正式的方式了解本单元的材料。
:loudspeaker: 别忘了加入 Discord,你可以在 #diffusion-models-class
频道中讨论材料并分享你的作品。
微调
正如你在第一单元中所见,从零开始训练扩散模型可能非常耗时!特别是当我们将分辨率提高时,从零开始训练模型所需的时间和数据可能会变得不切实际。幸运的是,有一个解决方案:从一个已经训练好的模型开始!这样,我们从一个已经学会对某种图像进行去噪的模型出发,希望这能提供一个比从随机初始化的模型开始更好的起点。
如果新数据与基础模型的原始训练数据有些相似,微调通常效果最好(例如,如果你想生成卡通人脸,从一个在人脸上训练过的模型开始可能是个好主意),但令人惊讶的是,即使领域变化很大,这种好处仍然存在。上图是由一个在 LSUN 卧室数据集上训练的模型,在 WikiArt 数据集上微调了 500 步生成的。 训练脚本 与本单元的笔记本一起提供以供参考。
引导
无条件模型对生成的内容没有太多控制。我们可以训练一个条件模型(下一节会详细介绍),它接受额外的输入来帮助引导生成过程,但如果我们已经有一个训练好的无条件模型想要使用怎么办?这时就需要引导,这是一个在生成过程的每一步,根据某个引导函数评估模型预测并进行修改的过程,从而使最终生成的图像更符合我们的喜好。
这个引导函数几乎可以是任何东西,这使它成为一个强大的技术!在笔记本中,我们从一个简单的例子(控制颜色,如上图示例输出所示)开始,逐步构建到一个利用名为 CLIP 的强大预训练模型的例子,它让我们能够根据文本描述来引导生成。
条件化
引导是从无条件扩散模型中获得额外功能的好方法,但如果在训练期间我们有额外的信息(如类别标签或图像标题),我们也可以将这些信息提供给模型,供其在进行预测时使用。通过这样做,我们创建了一个 条件化 模型,在推理时,我们可以通过控制输入作为条件的内容来控制模型。笔记本展示了一个类别条件化模型的例子,该模型学习根据类别标签生成图像。
有多种方法可以传入这些条件化信息,例如:
- 将其作为额外通道输入到 UNet 中。当条件化信息与图像形状相同时,通常使用这种方法,例如分割掩码、深度图或图像的模糊版本(在修复/超分辨率模型的情况下)。它也适用于其他类型的条件化。例如,在笔记本中,类别标签被映射到一个嵌入,然后扩展到与输入图像相同的宽度和高度,以便可以作为额外通道输入。
- 创建一个嵌入,然后将其投影到一个大小,该大小与 UNet 一个或多个内部层输出的通道数相匹配,然后将其添加到这些输出中。例如,时间步条件化就是这样处理的。每个 Resnet 块的输出都会添加一个投影的时间步嵌入。当你的条件化信息是一个向量,例如 CLIP 图像嵌入时,这种方法很有用。一个著名的例子是 Stable Diffusion 的“图像变体”版本,它正是这样做的。
- 添加交叉注意力层,这些层可以“关注”作为条件传入的序列。当条件化是以文本形式存在时,这种方法最有用——文本通过 Transformer 模型映射到嵌入序列,然后 UNet 中的交叉注意力层用于将这些信息整合到去噪路径中。我们将在第三单元中看到这一点,届时我们将研究 Stable Diffusion 如何处理文本条件化。
动手实践笔记本
章节 | Colab | Kaggle | Gradient | Studio Lab |
---|---|---|---|---|
微调与引导 | ||||
类别条件化扩散模型示例 |
至此,你已经具备了开始使用附带笔记本的足够知识!使用上面的链接在你选择的平台上打开它们。微调的计算量相当大,所以如果你使用 Kaggle 或 Google Colab,请确保将运行时类型设置为“GPU”以获得最佳效果。
大部分材料都在 微调与引导 中,我们通过实例探讨这两个主题。该笔记本展示了如何在新数据上微调现有模型、添加引导,并将结果分享为 Gradio 演示。有一个附带的脚本(finetune_model.py),可以方便地尝试不同的微调设置,还有一个示例 Space,你可以用作在 🤗 Spaces 上分享自己演示的模板。
在 类别条件化扩散模型示例 中,我们展示了一个简短的实例,说明如何使用 MNIST 数据集创建一个以类别标签为条件的扩散模型。重点是尽可能简单地演示核心思想:通过向模型提供关于它应该去噪的内容的额外信息,我们可以在推理时控制生成何种类型的图像。
项目时间
按照 微调与引导 笔记本中的示例,微调你自己的模型或选择一个现有模型,并创建一个 Gradio 演示来展示你的新引导技能。别忘了在 Discord、Twitter 等社交媒体上分享你的演示,以便我们欣赏你的作品!
一些额外资源
去噪扩散隐式模型 (Denoising Diffusion Implicit Models) - 介绍了 DDIM 采样方法(DDIMScheduler 使用的方法)
GLIDE: 用文本引导的扩散模型实现逼真的图像生成与编辑 (GLIDE: Towards Photorealistic Image Generation and Editing with Text-Guided Diffusion Models) - 介绍了在文本上对扩散模型进行条件化的方法
eDiffi:具有专家去噪器集成的文本到图像扩散模型 (eDiffi: Text-to-Image Diffusion Models with an Ensemble of Expert Denoisers) - 展示了如何将多种不同类型的条件化结合使用,以对生成的样本种类进行更精细的控制
发现了更多优质资源?告诉我们,我们会将它们添加到此列表中。
< > 在 GitHub 上更新