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