扩散模型课程文档

单元 2:微调、引导和条件化

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

单元 2:微调、引导和条件化

欢迎来到 Hugging Face 扩散模型课程的第二单元!在本单元中,你将学习如何以新的方式使用和调整预训练的扩散模型。你还将了解我们如何创建能够接受额外输入作为 条件 来控制生成过程的扩散模型。

开始本单元 :rocket:

以下是本单元的步骤:

  • 请确保你已注册本课程,以便在新材料发布时收到通知。
  • 通读以下材料,了解本单元的关键思想。
  • 查看 微调与引导 笔记本来学习如何使用 🤗 Diffusers 库在新数据集上微调现有的扩散模型,以及如何使用引导来修改采样过程。
  • 按照笔记本中的示例,为你的自定义模型分享一个 Gradio 演示。
  • (可选) 查看 类别条件化扩散模型示例 笔记本来了解我们如何为生成过程添加额外的控制。
  • (可选) 查看 此视频,以非正式的方式了解本单元的材料。

:loudspeaker: 别忘了加入 Discord,你可以在 #diffusion-models-class 频道中讨论材料并分享你的作品。

微调

正如你在第一单元中所见,从零开始训练扩散模型可能非常耗时!特别是当我们将分辨率提高时,从零开始训练模型所需的时间和数据可能会变得不切实际。幸运的是,有一个解决方案:从一个已经训练好的模型开始!这样,我们从一个已经学会对某种图像进行去噪的模型出发,希望这能提供一个比从随机初始化的模型开始更好的起点。

Example images generated with a model trained on LSUN Bedrooms and fine-tuned for 500 steps on WikiArt

如果新数据与基础模型的原始训练数据有些相似,微调通常效果最好(例如,如果你想生成卡通人脸,从一个在人脸上训练过的模型开始可能是个好主意),但令人惊讶的是,即使领域变化很大,这种好处仍然存在。上图是由一个在 LSUN 卧室数据集上训练的模型,在 WikiArt 数据集上微调了 500 步生成的。 训练脚本 与本单元的笔记本一起提供以供参考。

引导

无条件模型对生成的内容没有太多控制。我们可以训练一个条件模型(下一节会详细介绍),它接受额外的输入来帮助引导生成过程,但如果我们已经有一个训练好的无条件模型想要使用怎么办?这时就需要引导,这是一个在生成过程的每一步,根据某个引导函数评估模型预测并进行修改的过程,从而使最终生成的图像更符合我们的喜好。

guidance example image

这个引导函数几乎可以是任何东西,这使它成为一个强大的技术!在笔记本中,我们从一个简单的例子(控制颜色,如上图示例输出所示)开始,逐步构建到一个利用名为 CLIP 的强大预训练模型的例子,它让我们能够根据文本描述来引导生成。

条件化

引导是从无条件扩散模型中获得额外功能的好方法,但如果在训练期间我们有额外的信息(如类别标签或图像标题),我们也可以将这些信息提供给模型,供其在进行预测时使用。通过这样做,我们创建了一个 条件化 模型,在推理时,我们可以通过控制输入作为条件的内容来控制模型。笔记本展示了一个类别条件化模型的例子,该模型学习根据类别标签生成图像。

conditioning example

有多种方法可以传入这些条件化信息,例如:

  • 将其作为额外通道输入到 UNet 中。当条件化信息与图像形状相同时,通常使用这种方法,例如分割掩码、深度图或图像的模糊版本(在修复/超分辨率模型的情况下)。它也适用于其他类型的条件化。例如,在笔记本中,类别标签被映射到一个嵌入,然后扩展到与输入图像相同的宽度和高度,以便可以作为额外通道输入。
  • 创建一个嵌入,然后将其投影到一个大小,该大小与 UNet 一个或多个内部层输出的通道数相匹配,然后将其添加到这些输出中。例如,时间步条件化就是这样处理的。每个 Resnet 块的输出都会添加一个投影的时间步嵌入。当你的条件化信息是一个向量,例如 CLIP 图像嵌入时,这种方法很有用。一个著名的例子是 Stable Diffusion 的“图像变体”版本,它正是这样做的。
  • 添加交叉注意力层,这些层可以“关注”作为条件传入的序列。当条件化是以文本形式存在时,这种方法最有用——文本通过 Transformer 模型映射到嵌入序列,然后 UNet 中的交叉注意力层用于将这些信息整合到去噪路径中。我们将在第三单元中看到这一点,届时我们将研究 Stable Diffusion 如何处理文本条件化。

动手实践笔记本

章节 Colab Kaggle Gradient Studio Lab
微调与引导 Open In Colab Kaggle Gradient Open In SageMaker Studio Lab
类别条件化扩散模型示例 Open In Colab Kaggle Gradient Open In SageMaker 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 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.