mirror of
https://github.com/kohya-ss/sd-scripts.git
synced 2026-04-08 14:34:23 +00:00
@@ -1,10 +1,10 @@
|
||||
__由于文档正在更新中,描述可能有错误。__
|
||||
|
||||
# 关于学习
|
||||
# 关于本学习文档,通用描述
|
||||
本库支持模型微调(fine tuning)、DreamBooth、训练LoRA和文本反转(Textual Inversion)(包括[XTI:P+](https://github.com/kohya-ss/sd-scripts/pull/327)
|
||||
)
|
||||
本文档将说明它们通用的学习数据准备方法和选项等。
|
||||
|
||||
当在存储库中模型的fine tuning、DreamBooth、LoRA 和
|
||||
文本反转 Textual Inversion([XTI:P+](https://github.com/kohya-ss/sd-scripts/pull/327)
|
||||
包括 )。本文档解释了如何准备培训数据和他们常用的选项。
|
||||
# 概要
|
||||
|
||||
请提前参考本仓库的README,准备好环境。
|
||||
@@ -12,95 +12,103 @@ __由于文档正在更新中,描述可能有错误。__
|
||||
|
||||
以下本节说明。
|
||||
|
||||
1. 准备训练数据(使用配置文件的新格式)
|
||||
1. 对研究中使用的术语的非常简短的解释
|
||||
1. 以前的规范格式(不使用配置文件从命令行指定)
|
||||
1. 学习过程中样本图像的生成
|
||||
1. 各脚本通用的常用选项
|
||||
1. 微调元数据准备:字幕等
|
||||
|
||||
如果只执行
|
||||
1. 暂时可以学习(学习可以参考各个脚本的文档)。
|
||||
2. 请根据需要参考以下内容。
|
||||
1. 关于准备学习数据的新形式(使用设置文件)
|
||||
1. 对于在学习中使用的术语的简要解释
|
||||
1. 先前的指定格式(不使用设置文件,而是从命令行指定)
|
||||
1. 生成学习过程中的示例图像
|
||||
1. 各脚本中常用的共同选项
|
||||
1. 准备 fine tuning 方法的元数据:如说明文字(打标签)等
|
||||
|
||||
|
||||
# 准备训练数据
|
||||
1. 如果只执行一次,学习就可以进行(相关内容,请参阅各个脚本的文档)。如果需要,以后可以随时参考。
|
||||
|
||||
在任意文件夹(或多个文件夹)中准备训练数据图像文件。支持`.png`、`.jpg`、`.jpeg`、`.webp`、`.bmp`。基本不需要调整大小等预处理。
|
||||
|
||||
但是,建议不要使用比学习分辨率(稍后描述)小得多的图像,或者使用超分辨率 AI 提前放大它们。另外,比起超大图像(大约3000x3000像素?),似乎有可能会出错,所以请提前缩小。
|
||||
|
||||
训练时,您需要组织您希望模型学习的图像数据,并将其提供给您的脚本。指定训练数据的方式有多种,具体取决于训练数据的数量、学习目标、是否有字幕(图像描述)等。有以下几种方法(每个名字都不是通用的,而是本仓库独有的定义)。正则化图像将在后面讨论。
|
||||
1. DreamBooth、class+identifier方式(正則化画像使用可)
|
||||
# 关于准备训练数据
|
||||
|
||||
学会将学习目标与特定的词(标识符)联系起来。无需提供字幕。例如,如果你用它来学习一个特定的角色,你不需要准备字幕,所以很容易,但是学习数据的所有元素,如发型、衣服和背景,都是通过链接到标识符来学习的。可能是不能按提示换衣服的情况。
|
||||
1. DreamBooth、标题方式(正則化画像使用可)
|
||||
在任意文件夹(也可以是多个文件夹)中准备好训练数据的图像文件。支持 `.png`, `.jpg`, `.jpeg`, `.webp`, `.bmp` 格式的文件。通常不需要进行任何预处理,如调整大小等。
|
||||
|
||||
准备并研究一个文本文件,其中为每个图像记录了说明文字。比如在学习一个特定的人物时,通过在caption中描述图像的细节(白衣服的人物A,红衣服的人物A等),将人物与其他元素分离,使其更精确 可以期望模型当时只学习角色。
|
||||
1. fine tuning方式(正則化画像使用不可)
|
||||
但是请勿使用极小的图像,其尺寸比训练分辨率(稍后将提到)还小,建议事先使用超分辨率AI等进行放大。另外,请注意不要使用过大的图像(约为3000 x 3000像素以上),因为这可能会导致错误,建议事先缩小。
|
||||
|
||||
提前在元数据文件中收集字幕。它支持诸如单独管理标签和标题以及预缓存潜伏以加快学习速度等功能(均在单独的文档中进行了描述)。 (虽然称为微调法,但也可用于微调以外的方法。)
|
||||
你想学的东西和你可以使用的规范方法的组合如下。
|
||||
在训练时,需要整理要用于训练模型的图像数据,并将其指定给脚本。根据训练数据的数量、训练目标和说明(图像描述)是否可用等因素,可以使用几种方法指定训练数据。以下是其中的一些方法(每个名称都不是通用的,而是该存储库自定义的定义)。有关正则化图像的信息将在稍后提供。
|
||||
|
||||
| 学习对象或方法 | 脚本 | DB/class+identifier | DB/caption | fine tuning |
|
||||
| ----- | ----- | ----- | ----- | ----- |
|
||||
| 微调模型 | `fine_tune.py`| x | x | o |
|
||||
| 模型到 DreamBooth | `train_db.py`| o | o | x |
|
||||
| LoRA | `train_network.py`| o | o | o |
|
||||
1. DreamBooth、class + identifier方式(可使用正则化图像)
|
||||
|
||||
将训练目标与特定单词(identifier)相关联进行训练。无需准备说明。例如,当要学习特定角色时,由于无需准备说明,因此比较方便,但由于学习数据的所有元素都与identifier相关联,例如发型、服装、背景等,因此在生成时可能会出现无法更换服装的情况。
|
||||
|
||||
2. DreamBooth、说明方式(可使用正则化图像)
|
||||
|
||||
准备记录每个图像说明的文本文件进行训练。例如,通过将图像详细信息(如穿着白色衣服的角色A、穿着红色衣服的角色A等)记录在说明中,可以将角色和其他元素分离,并期望模型更准确地学习角色。
|
||||
|
||||
3. 微调方式(不可使用正则化图像)
|
||||
|
||||
先将说明收集到元数据文件中。支持分离标签和说明以及预先缓存latents等功能,以加速训练(这些将在另一篇文档中介绍)。(虽然名为fine tuning方式,但不仅限于fine tuning。)
|
||||
你要学的东西和你可以使用的规范方法的组合如下。
|
||||
|
||||
| 学习对象或方法 | 脚本 | DB/class+identifier | DB/caption | fine tuning |
|
||||
|----------------| ----- | ----- | ----- | ----- |
|
||||
| fine tuning微调模型 | `fine_tune.py`| x | x | o |
|
||||
| DreamBooth训练模型 | `train_db.py`| o | o | x |
|
||||
| LoRA | `train_network.py`| o | o | o |
|
||||
| Textual Invesion | `train_textual_inversion.py`| o | o | o |
|
||||
|
||||
## 选择哪一个
|
||||
|
||||
对于LoRA和Textual Inversion,如果不准备caption文件也想轻松学习,DreamBooth class + identifier,能准备的话DreamBooth caption方法不错。如果训练数据的数量很大并且没有使用正则化图像,可以考虑微调方法。
|
||||
如果您想要学习LoRA、Textual Inversion而不需要准备简介文件,则建议使用DreamBooth class+identifier。如果您能够准备好,则DreamBooth Captions方法更好。如果您有大量的训练数据并且不使用规则化图像,则请考虑使用fine-tuning方法。
|
||||
|
||||
DreamBooth也是一样,但是不能用微调的方法。对于微调,仅使用微调方法。
|
||||
# 如何指定每个方法
|
||||
对于DreamBooth也是一样的,但不能使用fine-tuning方法。对于fine-tuning方法,只能使用fine-tuning方式。
|
||||
|
||||
此处仅说明每种规范方法的典型模式。更详细的指定方法请参考[数据集设置](./config_README-zh.md)。
|
||||
# DreamBooth、class+identifier方式(正則化画像使用可)
|
||||
# 每种方法的指定方式
|
||||
|
||||
在这里,我们只介绍每种指定方法的典型模式。有关更详细的指定方法,请参见[数据集设置](./config_README-ja.md)。
|
||||
|
||||
这样一来,每张图片都相当于使用标题“类标识符”(例如“shs dog”)进行训练。
|
||||
# DreamBooth,class+identifier方法(可使用规则化图像)
|
||||
|
||||
## step 1. identifier和class(确定标识符和类)
|
||||
在该方法中,每个图像将被视为使用与 `class identifier` 相同的标题进行训练(例如 `shs dog`)。
|
||||
|
||||
确定连接您要学习的目标和目标所属类别的单词标识符。
|
||||
这样一来,每张图片都相当于使用标题“分类标识”(例如“shs dog”)进行训练。
|
||||
|
||||
(有各种名称,例如instance,但暂时我会坚持使用原始论文。)
|
||||
## step 1.确定identifier和class
|
||||
|
||||
这是一个非常简短的解释(查看更多详细信息)。
|
||||
要将学习的目标与identifier和属于该目标的class相关联。
|
||||
|
||||
class 类是学习的一般类型。例如,如果你想学习特定品种的狗,类就是狗。动漫角色将是男孩、女孩、1 个男孩或 1 个女孩,具体取决于型号。
|
||||
(虽然有很多称呼,但暂时按照原始论文的说法。)
|
||||
|
||||
identifier 标识符用于识别和学习学习目标。任何单词都可以,但根据原始论文,“一个不超过 3 个字母的稀有单词可以成为 tokinizer 的一个标记”是好的。
|
||||
以下是简要说明(请查阅详细信息)。
|
||||
|
||||
通过使用标识符和类来训练模型,例如“shs dog”,您可以通过识别类中要学习的对象来进行学习。
|
||||
class是学习目标的一般类别。例如,如果要学习特定品种的狗,则class将是“dog”。对于动漫角色,根据模型不同,可能是“boy”或“girl”,也可能是“1boy”或“1girl”。
|
||||
|
||||
生成图像时,如果你说“shs dog”,就会生成学习过的狗品种的图像。
|
||||
identifier是用于识别学习目标并进行学习的单词。可以使用任何单词,但是根据原始论文,“Tokenizer生成的3个或更少字符的罕见单词”是最好的选择。
|
||||
|
||||
(作为参考,我最近使用的标识符是``shs sts scs cpc coc cic msm usu ici lvl cic dii muk ori hru rik koo yos wny``。实际上,它不包含在Danbooru Tag中。一个是更多可取的。)
|
||||
## step 2. 决定是否使用正则化图像,如果使用则生成正则化图像
|
||||
正则化图像是防止整个班级被学习目标拉动(语言漂移)的图像。如果你不使用正则化图像,例如 `shs 1girl` 来学习一个特定的字符,即使您只是提示 `1girl`,它看起来也像那个字符。这是因为 `1girl` 包含在学习说明中。
|
||||
使用identifier和class,例如,“shs dog”可以将模型训练为从class中识别并学习所需的目标。
|
||||
|
||||
通过同时学习目标图像和正则化图像,类仍然是类,只有在提示中添加标识符时才会生成目标。
|
||||
在图像生成时,使用“shs dog”将生成所学习狗种的图像。
|
||||
|
||||
如果你只想在 LoRA 或 DreamBooth 中出现特定的字符,则不需要使用正则化图像。
|
||||
(作为identifier,我最近使用的一些参考是“shs sts scs cpc coc cic msm usu ici lvl cic dii muk ori hru rik koo yos wny”等。最好是不包含在Danbooru标签中的单词。)
|
||||
|
||||
不应使用文本反转(因为如果要学习的标记字符串不包含在标题中,则什么也学不到)。
|
||||
## step 2. 决定是否使用正则化图像,并生成正则化图像
|
||||
|
||||
作为正则化图像,通常仅在要训练的模型中使用类名生成的图像(例如 `1girl`)。但是,如果生成的图像质量较差,您可以设计提示或使用从 Internet 单独下载的图像。
|
||||
正则化图像是为防止前面提到的语言漂移,即整个类别被拉扯成为学习目标而生成的图像。如果不使用正则化图像,例如在 `shs 1girl` 中学习特定角色时,即使在简单的 `1girl` 提示下生成,也会越来越像该角色。这是因为 `1girl` 在训练时的标题中包含了该角色的信息。
|
||||
|
||||
(还学习了正则化图像,因此它们的质量会影响模型。)
|
||||
通过同时学习目标图像和正则化图像,类别仍然保持不变,仅在将标识符附加到提示中时才生成目标图像。
|
||||
|
||||
一般来说,准备几百张图像似乎是可取的(如果数量少,类图像将不会被泛化,它们的特征将被学习)。
|
||||
如果您只想在LoRA或DreamBooth中使用特定的角色,则可以不使用正则化图像。
|
||||
|
||||
使用生成图像时,生成图像的大小一般应与训练分辨率(更准确地说是桶的分辨率,稍后描述)相匹配。
|
||||
在Textual Inversion中也不需要使用(如果要学习的token string不包含在标题中,则不会学习任何内容)。
|
||||
|
||||
## step 2. 编写配置文件
|
||||
一般情况下,使用在训练目标模型时只使用类别名称生成的图像作为正则化图像是常见的做法(例如 `1girl`)。但是,如果生成的图像质量不佳,可以尝试修改提示或使用从网络上另外下载的图像。
|
||||
|
||||
创建一个文本文件并给它一个 .toml 扩展名。例如:
|
||||
(由于正则化图像也被训练,因此其质量会影响模型。)
|
||||
|
||||
(#开头的部分是注释,可以原样复制粘贴,也可以删除。)
|
||||
通常,准备数百张图像是理想的(图像数量太少会导致类别图像无法推广并学习它们的特征)。
|
||||
|
||||
如果要使用生成的图像,请将其大小通常与训练分辨率(更准确地说是bucket的分辨率)相适应。
|
||||
|
||||
## step 2. 设置文件的描述
|
||||
|
||||
创建一个文本文件,并将其扩展名更改为`.toml`。例如,您可以按以下方式进行描述:
|
||||
|
||||
(以`#`开头的部分是注释,因此您可以直接复制粘贴,或者将其删除,都没有问题。)
|
||||
|
||||
```toml
|
||||
[general]
|
||||
@@ -123,53 +131,55 @@ batch_size = 4 # 批量大小
|
||||
num_repeats = 1 # 正则化图像的迭代次数,基本上1就可以了
|
||||
```
|
||||
|
||||
基本上,你可以通过重写以下地方来学习。
|
||||
基本上只需更改以下位置即可进行学习。
|
||||
|
||||
1. 学习分辨率
|
||||
如果您指定一个数字,它将是正方形(512x512 对应 512),如果您指定两个数字,用逗号分隔,它将是水平 x 垂直(512x768 对于 `[512,768]`)。在SD1.x系列中,原始学习分辨率为512。如果您指定更大的分辨率,例如 `[512,768]`,您可以减少生成纵向和横向图像时的失败。对于 SD2.x 768 系列,它是“768”。
|
||||
|
||||
指定一个数字表示正方形(如果是 `512`,则为 512x512),如果使用方括号和逗号分隔的两个数字,则表示横向×纵向(如果是`[512,768]`,则为 512x768)。在SD1.x系列中,原始学习分辨率为512。指定较大的分辨率,如 `[512,768]` 可能会减少纵向和横向图像生成时的错误。在SD2.x 768系列中,分辨率为 `768`。
|
||||
|
||||
1. 批量大小
|
||||
|
||||
指定同时学习多少数据。这取决于 GPU 的 VRAM 大小和训练分辨率。稍后会详细介绍。此外,它会根据微调/DreamBooth/LoRA 等而变化。请参阅每个脚本的说明。
|
||||
指定同时学习多少个数据。这取决于GPU的VRAM大小和学习分辨率。详细信息将在后面说明。此外,fine tuning/DreamBooth/LoRA等也会影响批量大小,请查看各个脚本的说明。
|
||||
|
||||
1. 文件夹指定
|
||||
|
||||
为训练图像和正则化图像(如果使用)指定文件夹。指定包含图像数据的文件夹本身。
|
||||
指定用于学习的图像和正则化图像(仅在使用时)的文件夹。指定包含图像数据的文件夹。
|
||||
|
||||
1. 指定标识符和类
|
||||
1. identifier 和 class 的指定
|
||||
|
||||
就像前面的例子一样。
|
||||
如前所述,与示例相同。
|
||||
|
||||
1. 重复计数
|
||||
1. 迭代次数
|
||||
|
||||
我稍后会解释。
|
||||
将在后面说明。
|
||||
|
||||
### 关于重复次数
|
||||
|
||||
迭代次数用于调整正则化图像的数量和训练图像的数量。由于正则化图像的数量多于训练图像的数量,因此重复训练图像以匹配图像的数量,从而可以按 1:1 的比例进行训练。
|
||||
重复次数用于调整正则化图像和训练用图像的数量。由于正则化图像的数量多于训练用图像,因此需要重复使用训练用图像来达到一对一的比例,从而实现训练。
|
||||
|
||||
指定迭代次数,以便“__ 训练图像的迭代次数 x 训练图像的数量 ≥ 正则化图像的迭代次数 x 正则化图像的数量 __”。
|
||||
请将重复次数指定为“ __训练用图像的重复次数×训练用图像的数量≥正则化图像的重复次数×正则化图像的数量__ ”。
|
||||
|
||||
一个epoch(数据绕一圈时为一个epoch)的数据数量为“训练图像的重复次数x训练图像的数量”。如果正则化图像的数量大于此,则不使用剩余的正则化图像.)
|
||||
(1个epoch(数据一周一次)的数据量为“训练用图像的重复次数×训练用图像的数量”。如果正则化图像的数量多于这个值,则剩余的正则化图像将不会被使用。)
|
||||
|
||||
## step 3. 学習
|
||||
## 步骤 3. 学习
|
||||
|
||||
请参考每个文档和研究。
|
||||
请根据每个文档的参考进行学习。
|
||||
|
||||
# DreamBooth、Caption方法(可以使用正则化图片)
|
||||
# DreamBooth,标题方式(可使用规范化图像)
|
||||
|
||||
在这种方法中,每张图片都用字幕进行训练。
|
||||
在此方式中,每个图像都将通过标题进行学习。
|
||||
|
||||
## step 1. 准备字幕文件
|
||||
## 步骤 1. 准备标题文件
|
||||
|
||||
在训练图像文件夹中放置一个与图像同名且扩展名为“.caption”(可在设置中更改)的文件。每个文件应该只有一行。编码是“UTF-8”。
|
||||
请将与图像具有相同文件名且扩展名为 `.caption`(可以在设置中更改)的文件放置在用于训练图像的文件夹中。每个文件应该只有一行。编码为 `UTF-8`。
|
||||
|
||||
## step 2. 决定是否使用正则化图像,如果使用则生成正则化图像
|
||||
## 步骤 2. 决定是否使用规范化图像,并在使用时生成规范化图像
|
||||
|
||||
类似于类+标识符格式。正规化图像也可以有说明文字,但通常是不必要的。
|
||||
与class+identifier格式相同。可以在规范化图像上附加标题,但通常不需要。
|
||||
|
||||
## 第二步,编写配置文件
|
||||
## 步骤 2. 编写设置文件
|
||||
|
||||
创建一个文本文件并给它一个 .toml 扩展名。例如:
|
||||
创建一个文本文件并将扩展名更改为 `.toml`。例如,可以按以下方式进行记录。
|
||||
|
||||
```toml
|
||||
[general]
|
||||
@@ -195,28 +205,27 @@ batch_size = 4 # 批量大小
|
||||
|
||||
基本上,您可以通过仅重写以下位置来学习。除非另有说明,否则与类+标识符方法相同。
|
||||
|
||||
1. 学习率
|
||||
1. 批量大小
|
||||
1. 文件夹指定
|
||||
1. 字幕文件扩展名
|
||||
1. 学习分辨率
|
||||
2. 批量大小
|
||||
3. 文件夹指定
|
||||
4. 标题文件的扩展名
|
||||
|
||||
您可以指定任何扩展名。
|
||||
1. 重复计数
|
||||
可以指定任意的扩展名。
|
||||
5. 重复次数
|
||||
|
||||
## step 3. 学習
|
||||
## 步骤 3. 学习
|
||||
|
||||
请参考每个文档和研究。
|
||||
请参考每个文档进行学习。
|
||||
|
||||
# fine tuning 方式
|
||||
# 微调方法
|
||||
|
||||
## step 1. 准备元数据
|
||||
## 步骤 1. 准备元数据
|
||||
|
||||
汇总标题和标签的管理文件称为元数据。 json 格式,扩展名为 .json
|
||||
是。创建方法比较长,所以写在了这篇文档的末尾。
|
||||
将标题和标签整合到管理文件中称为元数据。它的扩展名为 `.json`,格式为json。由于创建方法较长,因此在本文档的末尾进行了描述。
|
||||
|
||||
## step 2. 配置文件说明
|
||||
## 步骤 2. 编写设置文件
|
||||
|
||||
创建一个文本文件并给它一个 .toml 扩展名。例如:
|
||||
创建一个文本文件,将扩展名设置为 `.toml`。例如,可以按以下方式编写:
|
||||
```toml
|
||||
[general]
|
||||
shuffle_caption = true
|
||||
@@ -233,88 +242,100 @@ batch_size = 4 # 批量大小
|
||||
|
||||
基本上,您可以通过仅重写以下位置来学习。如无特别说明,与DreamBooth相同,类+标识符方式。
|
||||
|
||||
1. 学习率
|
||||
1. 批量大小
|
||||
1. 文件夹指定
|
||||
1. 元数据文件名
|
||||
1. 学习解像度
|
||||
2. 批次大小
|
||||
3. 指定文件夹
|
||||
4. 元数据文件名
|
||||
|
||||
指定通过后述方法创建的元数据文件。
|
||||
指定使用后面所述方法创建的元数据文件。
|
||||
|
||||
|
||||
## step 3. 学習
|
||||
## 第三步:学习
|
||||
|
||||
请参考每个文档和研究。
|
||||
请参考各个文档进行学习。
|
||||
|
||||
# 对研究中使用的术语的非常简短的解释
|
||||
# 学习中使用的术语简单解释
|
||||
|
||||
细节略去,本人也不是很了解,请各位自行研究。
|
||||
## fine tuning(微调)
|
||||
由于省略了细节并且我自己也没有完全理解,因此请自行查阅详细信息。
|
||||
|
||||
它指的是学习和微调模型。含义因使用方式而异,但狭义上的fine tuning是在Stable Diffusion的情况下学习带有图像和字幕的模型。 DreamBooth可以说是一种狭义微调的特殊方法。广义上的fine tuning包括LoRA、Textual Inversion、Hypernetworks等,包括所有的学习模型。
|
||||
## 步
|
||||
## 微调(fine tuning)
|
||||
|
||||
粗略地说,一步就是对训练数据进行一次计算。第一步是通过当前模型运行训练数据说明,将生成的图像与训练数据图像进行比较,并稍微修改模型以更接近训练数据。
|
||||
## 批量大小
|
||||
指训练模型并微调其性能。具体含义因用法而异,但在 Stable Diffusion 中,狭义的微调是指使用图像和标题进行训练模型。DreamBooth 可视为狭义微调的一种特殊方法。广义的微调包括 LoRA、Textual Inversion、Hypernetworks 等,包括训练模型的所有内容。
|
||||
|
||||
批量大小是一个值,它指定在一个步骤中计算多少数据。因为是集体计算,所以速度相对提高了。也有人说准确率普遍较高。
|
||||
`Batch size x number of steps` 是用于学习的数据数量。因此,根据增加的批量大小减少步骤数是个好主意。
|
||||
## 步骤(step)
|
||||
|
||||
(但是,例如,“1600 steps with a batch size”和“400 steps with batch size of 4”给出的结果不一样。对于相同的学习率,后者通常会学习不足。尝试增加稍微降低速率(例如“2e-6”)或将步数设置为例如 500 步。)
|
||||
粗略地说,每次在训练数据上进行一次计算即为一步。具体来说,“将训练数据的标题传递给当前模型,将生成的图像与训练数据的图像进行比较,稍微更改模型,以使其更接近训练数据”即为一步。
|
||||
|
||||
更大的批量大小消耗更多的 GPU 内存。如果内存用完就会出错,学习速度会降低到不出错的限度。最好使用任务管理器或“nvidia-smi”命令检查内存使用量并进行相应调整。
|
||||
## 批次大小(batch size)
|
||||
|
||||
批处理的意思是“一个数据块”。
|
||||
批次大小指定每个步骤要计算多少数据。批量计算可以提高速度。一般来说,批次大小越大,精度也越高。
|
||||
|
||||
“批次大小×步数”是用于训练的数据数量。因此,建议减少步数以增加批次大小。
|
||||
|
||||
(但是,例如,“批次大小为 1,步数为 1600”和“批次大小为 4,步数为 400”将不会产生相同的结果。如果使用相同的学习速率,通常后者会导致模型欠拟合。请尝试增加学习率(例如 `2e-6`),将步数设置为 500 等。)
|
||||
|
||||
批次大小越大,GPU 内存消耗就越大。如果内存不足,将导致错误,或者在边缘时将导致训练速度降低。建议在任务管理器或 `nvidia-smi` 命令中检查使用的内存量进行调整。
|
||||
|
||||
另外,批次是指“一块数据”的意思。
|
||||
|
||||
## 学习率
|
||||
|
||||
粗略地说,它表示每一步要改变多少。更高的值会训练得更快,但它可能会改变太多而破坏模型,或者达到次优状态。较小的值会减慢学习速度,并且可能仍会导致次优条件。
|
||||
学习率指的是每个步骤中改变的程度。如果指定一个大的值,学习速度就会加快,但是可能会出现变化太大导致模型崩溃或无法达到最佳状态的情况。如果指定一个小的值,学习速度会变慢,也可能无法达到最佳状态。
|
||||
|
||||
fine tuning、DreamBooth 和 LoRA 之间差异很大,还取决于训练数据、你要训练的模型、batch size 和步数。从一般值开始,在观察学习状态的同时增加或减少。
|
||||
在fine tuning、DreamBooth、LoRA等过程中,学习率会有很大的差异,并且也会受到训练数据、所需训练的模型、批量大小和步骤数等因素的影响。建议从一般的值开始,观察训练状态并逐渐调整。
|
||||
|
||||
默认情况下,整个训练过程中学习率是固定的。但是可以通过调度程序指定学习率如何变化,因此结果也会有所不同。
|
||||
|
||||
默认情况下,学习率在整个训练过程中是固定的。您可以通过指定调度程序来决定如何更改学习率,因此结果也会根据它们而变化。
|
||||
## 时代(epoch)
|
||||
|
||||
Epoch指的是训练数据被完整训练一遍(即数据一周)的情况。如果指定了重复次数,则在重复后的数据一周后,就是1个epoch。
|
||||
|
||||
训练数据学习一次(数据绕一圈)就是1个epoch。如果指定重复次数,则重复完成后数据的一个epoch。
|
||||
1个epoch的步骤数通常为“数据量÷批量大小”,但如果使用Aspect Ratio Bucketing,则略微增加(由于不同bucket的数据不能在同一个批次中,因此步骤数会增加)。
|
||||
|
||||
一个epoch的步数基本上是`数据个数除以batch size`,但是如果使用Aspect Ratio Bucketing,会稍微增加(因为不同bucket的数据不能一起batch,所以步数会增加).
|
||||
## Aspect Ratio Bucketing
|
||||
Stable Diffusion v1 在 512\*512 下训练,但也在 256\*1024 和 384\*640 等分辨率下训练。预计这将减少裁剪部分并更正确地学习字幕和图像之间的关系。
|
||||
## 纵横比分桶(Aspect Ratio Bucketing)
|
||||
|
||||
此外,由于它可以在任何分辨率下学习,因此不再需要预先统一图像数据的纵横比。
|
||||
它可以在设置中在启用和禁用之间切换,但在目前的配置文件描述示例中,它是启用的(设置了`true`)。
|
||||
Stable Diffusion 的 v1 是以 512\*512 的分辨率进行训练的,但同时也可以在其他分辨率下进行训练,例如 256\*1024 和 384\*640。这样可以减少裁剪的部分,期望更准确地学习图像和标题之间的关系。
|
||||
|
||||
学习分辨率在作为参数给出的分辨率区域(=内存使用量)范围内以 64 像素(默认,可变)为单位进行垂直和水平调整。
|
||||
此外,由于可以在任意分辨率下进行训练,因此不再需要事先统一图像数据的纵横比。
|
||||
|
||||
在机器学习中,统一所有的输入大小是很常见的,但是没有特别的限制,其实只要在同一个batch内统一就可以了。 NovelAI的bucketing好像是指预先按照长宽比对每个学习分辨率的训练数据进行分类。并通过将每个桶中的图像创建一个批次,统一批次的图像大小。
|
||||
该设置在配置中有效,可以切换,但在此之前的配置文件示例中已启用(设置为 `true`)。
|
||||
|
||||
# 旧规范格式(不使用配置文件从命令行指定)
|
||||
学习分辨率将根据参数所提供的分辨率面积(即内存使用量)进行调整,以64像素为单位(默认值,可更改)在纵横方向上进行调整和创建。
|
||||
|
||||
这是一个没有指定 .toml 文件的命令行选项。有DreamBooth类+标识符方式、DreamBooth字幕方式、微调方式。
|
||||
## DreamBooth、class+identifier方式
|
||||
在机器学习中,通常需要将所有输入大小统一,但实际上只要在同一批次中统一即可。 NovelAI 所说的分桶(bucketing) 指的是,预先将训练数据按照纵横比分类到每个学习分辨率下,并通过使用每个 bucket 内的图像创建批次来统一批次图像大小。
|
||||
|
||||
用文件夹名称指定重复次数。还可以使用 `train_data_dir` 和 `reg_data_dir` 选项。
|
||||
### step 1. 为训练准备图像
|
||||
# 以前的指定格式(不使用 .toml 文件,而是使用命令行选项指定)
|
||||
|
||||
这是一种通过命令行选项而不是指定 .toml 文件的方法。有 DreamBooth 类+标识符方法、DreamBooth 标题方法、微调方法三种方式。
|
||||
|
||||
## DreamBooth、类+标识符方式
|
||||
|
||||
指定文件夹名称以指定迭代次数。还要使用 `train_data_dir` 和 `reg_data_dir` 选项。
|
||||
|
||||
### 第1步。准备用于训练的图像
|
||||
|
||||
创建一个用于存储训练图像的文件夹。__此外__,按以下名称创建目录。
|
||||
|
||||
创建一个文件夹来存储训练图像。 __另外,创建一个目录,名称如下:
|
||||
```
|
||||
<重复计数>_<identifier> <class>
|
||||
<迭代次数>_<标识符> <类别>
|
||||
```
|
||||
|
||||
不要忘记它们之间的``_``。
|
||||
不要忘记下划线``_``。
|
||||
|
||||
例如,如果在名为“sls frog”的提示下重复数据 20 次,则为“20_sls frog”。如下所示:
|
||||
|
||||
例如,在提示“sls frog”时,要重复数据 20 次,则为“20_sls frog”。它将如下所示。
|
||||

|
||||
|
||||
### 多类、多对象(标识符)学习
|
||||
### 多个类别、多个标识符的学习
|
||||
|
||||
方法很简单,training image文件夹下有多个``Repetition count_<identifier> <class>``的文件夹,regularization image文件夹下有``Repetition count_<class>``的文件夹。请准备多个
|
||||
该方法很简单,在用于训练的图像文件夹中,需要准备多个文件夹,每个文件夹都是以“重复次数_<标识符> <类别>”命名的,同样,在正则化图像文件夹中,也需要准备多个文件夹,每个文件夹都是以“重复次数_<类别>”命名的。
|
||||
|
||||
例如,同时学习“sls frog”和“cpc rabbit”会是这样的:
|
||||
例如,如果要同时训练“sls青蛙”和“cpc兔子”,则应按以下方式准备文件夹。
|
||||
|
||||

|
||||
|
||||
如果你有一个类和多个目标,你可以只有一个正则化图像文件夹。例如,如果1girl 有字符A 和字符B,则执行如下操作。
|
||||
如果一个类别包含多个对象,可以只使用一个正则化图像文件夹。例如,如果在1girl类别中有角色A和角色B,则可以按照以下方式处理:
|
||||
|
||||
- train_girls
|
||||
- 10_sls 1girl
|
||||
- 10_cpc 1girl
|
||||
@@ -331,23 +352,25 @@ Stable Diffusion v1 在 512\*512 下训练,但也在 256\*1024 和 384\*640
|
||||

|
||||
|
||||
|
||||
### step 3. 训练跑
|
||||
步骤3. 执行学习
|
||||
|
||||
运行每个训练脚本。 `--train_data_dir`选项设置训练数据文件夹(__不是包含图像的文件夹,其父文件夹__),`--reg_data_dir`选项设置正则化图像文件夹(__包含图像请指定其父文件夹__)而不是文件夹.
|
||||
## DreamBooth、标题法
|
||||
执行每个学习脚本。使用 `--train_data_dir` 选项指定包含训练数据文件夹的父文件夹(不是包含图像的文件夹),使用 `--reg_data_dir` 选项指定包含正则化图像的父文件夹(不是包含图像的文件夹)。
|
||||
|
||||
如果在训练图像和正则化图像文件夹中放置一个与图像同名且扩展名为 .caption(可在选项中更改)的文件,将从该文件中读取标题并作为提示进行学习。
|
||||
## DreamBooth,带标题方式
|
||||
|
||||
* 文件夹名称(标识符类)将不再用于训练这些图像。
|
||||
在包含训练图像和正则化图像的文件夹中,将与图像具有相同文件名的文件.caption(可以使用选项进行更改)放置在该文件夹中,然后从该文件中加载标题作为提示进行学习。
|
||||
|
||||
默认情况下,字幕文件的扩展名为 .caption。您可以使用训练脚本中的“--caption_extension”选项更改它。 `--shuffle_caption` 选项在学习时随机播放字幕的逗号分隔部分。
|
||||
## fine tuning 方式
|
||||
※文件夹名称(标识符类)不再用于这些图像的训练。
|
||||
|
||||
直到创建元数据为止,它与使用配置文件时相同。使用 `in_json` 选项指定元数据文件。
|
||||
默认的标题文件扩展名为.caption。可以使用学习脚本的 `--caption_extension` 选项进行更改。 使用 `--shuffle_caption` 选项,同时对每个逗号分隔的部分进行学习时会对学习时的标题进行混洗。
|
||||
|
||||
# 训练期间的示例输出
|
||||
## 微调方式
|
||||
|
||||
您可以通过使用正在训练的模型生成试用图像来检查学习进度。在训练脚本中指定以下选项:
|
||||
创建元数据的方式与使用配置文件相同。 使用 `in_json` 选项指定元数据文件。
|
||||
|
||||
# 学习过程中的样本输出
|
||||
|
||||
通过在训练中使用模型生成图像,可以检查学习进度。将以下选项指定为学习脚本。
|
||||
|
||||
- `--sample_every_n_steps` / `--sample_every_n_epochs`
|
||||
|
||||
@@ -649,7 +672,7 @@ python finetune\make_captions.py --batch_size 8 ..\train_data
|
||||
|
||||
默认情况下,会生成扩展名为 .caption 的字幕文件。
|
||||
|
||||

|
||||

|
||||
|
||||
例如,标题如下:
|
||||
|
||||
@@ -728,7 +751,7 @@ python tag_images_by_wd14_tagger.py --batch_size 4 ..\train_data
|
||||
```
|
||||
|
||||
模型文件将在首次启动时自动下载到 wd14_tagger_model 文件夹(文件夹可以在选项中更改)。它将如下所示。
|
||||

|
||||

|
||||
|
||||
在与教师数据图像相同的目录中创建具有相同文件名和扩展名.txt 的标记文件。
|
||||

|
||||
@@ -778,8 +801,8 @@ __* 每次重写 in_json 选项和写入目标并写入单独的元数据文件
|
||||
|
||||
同样,标签也收集在元数据中(如果标签不用于学习,则无需这样做)。
|
||||
```
|
||||
python merge_dd_tags_to_metadata.py --full_path <教師データフォルダ>
|
||||
--in_json <要读取的元数据文件名> <書き込むメタデータファイル名>
|
||||
python merge_dd_tags_to_metadata.py --full_path <教师资料夹>
|
||||
--in_json <要读取的元数据文件名> <要写入的元数据文件名>
|
||||
```
|
||||
|
||||
同样的目录结构,读取meta_cap.json和写入meta_cap_dd.json时,会是这样的。
|
||||
@@ -798,14 +821,16 @@ python merge_dd_tags_to_metadata.py --full_path --in_json meta_cap_dd1.json
|
||||
|
||||
如果省略in_json,如果有写入目标元数据文件,将从那里读取并覆盖。
|
||||
__※ 通过每次重写 in_json 选项和写入目标,写入单独的元数据文件是安全的。 __
|
||||
### 清洁标题和标签
|
||||
### 标题和标签清理
|
||||
|
||||
至此,字幕和 DeepDanbooru 标签已放在元数据文件中。但是,由于拼写变化(*),带有自动字幕的字幕很微妙,并且标签包括下划线和评级(在 DeepDanbooru 的情况下),因此编辑器的替换功能等。您应该使用它来清理您的字幕和标签。
|
||||
※ 例如,如果您正在学习动漫女孩,那么字幕会有女孩/女孩/女人/女人等变体。另外,对于“动漫女孩”之类的东西,简单地使用“女孩”可能更合适。
|
||||
到目前为止,标题和DeepDanbooru标签已经被整理到元数据文件中。然而,自动标题生成的标题存在表达差异等微妙问题(※),而标签中可能包含下划线和评级(DeepDanbooru的情况下)。因此,最好使用编辑器的替换功能清理标题和标签。
|
||||
|
||||
提供了清理脚本,请根据情况编辑脚本内容使用。
|
||||
※例如,如果要学习动漫中的女孩,标题可能会包含girl/girls/woman/women等不同的表达方式。另外,将"anime girl"简单地替换为"girl"可能更合适。
|
||||
|
||||
我们提供了用于清理的脚本,请根据情况编辑脚本并使用它。
|
||||
|
||||
(不需要指定教师数据文件夹。将清理元数据中的所有数据。)
|
||||
|
||||
(不再需要指定教师数据文件夹。元数据中的所有数据将被清除。)
|
||||
```
|
||||
python clean_captions_and_tags.py <要读取的元数据文件名> <要写入的元数据文件名>
|
||||
```
|
||||
@@ -818,14 +843,13 @@ python clean_captions_and_tags.py meta_cap_dd.json meta_clean.json
|
||||
|
||||
标题和标签的预处理现已完成。
|
||||
|
||||
## latents 提前获取潜能
|
||||
## 预先获取 latents
|
||||
|
||||
※ 此步骤不是必需的。即使你省略它,你也可以在学习过程中获得潜能的同时学习。
|
||||
此外,在学习过程中执行 `random_crop` 或 `color_aug` 时,无法提前获取 latents(因为每次学习时图像都会改变)。如果你不预取,你可以从到目前为止的元数据中学习。
|
||||
※ 这一步骤并非必须。即使省略此步骤,也可以在训练过程中获取 latents。但是,如果在训练时执行 `random_crop` 或 `color_aug` 等操作,则无法预先获取 latents(因为每次图像都会改变)。如果不进行预先获取,则可以使用到目前为止的元数据进行训练。
|
||||
|
||||
事先获取图像的潜在表示并将其保存到磁盘。这允许快速学习。同时进行bucketing(根据纵横比对训练数据进行分类)。
|
||||
提前获取图像的潜在表达并保存到磁盘上。这样可以加速训练过程。同时进行 bucketing(根据宽高比对训练数据进行分类)。
|
||||
|
||||
在您的工作文件夹中,键入:
|
||||
请在工作文件夹中输入以下内容。
|
||||
|
||||
```
|
||||
python prepare_buckets_latents.py --full_path <教师资料夹>
|
||||
@@ -836,29 +860,26 @@ python prepare_buckets_latents.py --full_path <教师资料夹>
|
||||
--mixed_precision <准确性>
|
||||
```
|
||||
|
||||
如果模型是model.ckpt,batch size 4,training resolution是512\*512,precision是no(float32),从meta_clean.json读取metadata写入meta_lat.json:
|
||||
如果要从meta_clean.json中读取元数据,并将其写入meta_lat.json,使用模型model.ckpt,批处理大小为4,训练分辨率为512*512,精度为no(float32),则应如下所示。
|
||||
```
|
||||
python prepare_buckets_latents.py --full_path
|
||||
train_data meta_clean.json meta_lat.json model.ckpt
|
||||
--batch_size 4 --max_resolution 512,512 --mixed_precision no
|
||||
```
|
||||
|
||||
潜在变量以 numpy npz 格式保存在教师数据文件夹中。
|
||||
教师数据文件夹中,latents以numpy的npz格式保存。
|
||||
|
||||
您可以使用 --min_bucket_reso 选项指定最小分辨率大小,使用 --max_bucket_reso 选项指定最大分辨率大小。默认值分别为 256 和 1024。例如,指定最小大小为 384 将不会使用 256\*1024 或 320\*768 等分辨率。
|
||||
如果将分辨率增加到 768\*768 之类的值,则应为最大尺寸指定 1280 之类的值。
|
||||
您可以使用--min_bucket_reso选项指定最小分辨率大小,--max_bucket_reso指定最大大小。默认值分别为256和1024。例如,如果指定最小大小为384,则将不再使用分辨率为256 * 1024或320 * 768等。如果将分辨率增加到768 * 768等较大的值,则最好将最大大小指定为1280等。
|
||||
|
||||
如果指定 --flip_aug 选项,它将执行水平翻转扩充(数据扩充)。你可以人为地把数据量翻倍,但是如果你在数据不是左右对称的情况下指定它(比如人物外貌、发型等),学习就不会很顺利。
|
||||
如果指定--flip_aug选项,则进行左右翻转的数据增强。虽然这可以使数据量伪造一倍,但如果数据不是左右对称的(例如角色外观、发型等),则可能会导致训练不成功。
|
||||
|
||||
对于翻转的图像,也会获取latents,并保存名为\ *_flip.npz的文件,这是一个简单的实现。在fline_tune.py中不需要特定的选项。如果有带有\_flip的文件,则会随机加载带有和不带有flip的文件。
|
||||
|
||||
(这是一个简单的实现,获取翻转图像的潜伏并保存 \*\_flip.npz 文件。fline_tune.py 不需要任何选项。如果有带 \_flip 的文件,则随机加载一个没有的文件
|
||||
即使VRAM为12GB,批量大小也可以稍微增加。分辨率以“宽度,高度”的形式指定,必须是64的倍数。分辨率直接影响fine tuning时的内存大小。在12GB VRAM中,512,512似乎是极限(*)。如果有16GB,则可以将其提高到512,704或512,768。即使分辨率为256,256等,VRAM 8GB也很难承受(因为参数、优化器等与分辨率无关,需要一定的内存)。
|
||||
|
||||
即使使用 12GB 的 VRAM,批处理大小也可能会增加一点。
|
||||
分辨率是一个能被 64 整除的数,由“width, height”指定。在微调期间,分辨率与内存大小直接相关。 512,512 似乎是 VRAM 12GB (*) 的限制。 16GB 可能会增加到 512,704 或 512,768。即使有 256、256 等,8GB 的 VRAM 似乎也很困难(因为参数和优化器需要一定数量的内存,而不管分辨率如何)。
|
||||
*有报道称,在batch size为1的训练中,使用12GB VRAM和640,640的分辨率。
|
||||
|
||||
※ 还有一份报告称,学习批量大小 1 适用于 12GB VRAM 和 640,640。
|
||||
|
||||
分桶的结果显示如下。
|
||||
以下是bucketing结果的显示方式。
|
||||
|
||||

|
||||
|
||||
@@ -874,6 +895,6 @@ python prepare_buckets_latents.py --full_path
|
||||
--batch_size 4 --max_resolution 512,512 --mixed_precision no
|
||||
|
||||
```
|
||||
可以使读源和写目标相同,但分开更安全。
|
||||
可以将读取源和写入目标设为相同,但分开设定更为安全。
|
||||
|
||||
__*每次重写参数并将其写入单独的元数据文件是安全的。 __
|
||||
__※建议每次更改参数并将其写入另一个元数据文件,以确保安全性。__
|
||||
|
||||
Reference in New Issue
Block a user