stable diffusion 1.x 模型训练概述

本文主要介绍sd发展的第一阶段版本的模型架构和一些微调训练方法,后续版本SDXL,LCM 版本再写文章继续介绍

SD 1.x 版本模型结构

autoencoder(VAE):encoder将图像压缩到latent空间,而decoder将latent解码为图像;

CLIP text encoder:提取输入text的text embeddings,通过cross attention方式送入扩散模型的UNet中作为condition;

UNet:扩散模型的主体,用来实现文本引导下的latent生成。

VAE

autoencoder是一个基于encoder-decoder架构的图像压缩模型,对于一个大小为H×W×3的输入图像,encoder模块将其编码为一个大小为h× w × c的latent,其中f = H/h = W/h为下采样

率(downsampling factor)。

使用diffusers库来加载autoencoder模型,并使用autoencoder来实现图像的压缩和重建,代码如下所示:

使用两张图片在256x256和512x512下的重建效果对比

如下所示,第一列为原始图片,第二列为512x512尺寸下的重建图,第三列为256x256尺寸下的重建图。对比可以看出,autoencoder将图片压缩到latent后再重建其实是有损的,比如会出现文字和人脸的畸变,在256x256分辨率下是比较明显的,512x512下效果会好很多。

CLIP

CLIP的英文全称是Contrastive Language-Image Pre-training,即一种基于对比文本-图像对的预训练方法或者模型。CLIP是一种基于对比学习的多模态模型

与CV中的一些对比学习方法如moco和simclr不同的是,CLIP的训练数据是文本-图像对:一张图像和它对应的文本描述,这里希望通过对比学习,模型能够学习到文本-图像对的匹配关系。

如下图所示,CLIP包括两个模型:Text Encoder和Image Encoder,其中Text Encoder用来提取文本的特征,可以采用NLP中常用的text transformer模型;而Image Encoder用来提取图像的特征,可以采用常用CNN模型或者vision transformer。

CLIP text encoder

SD采用CLIP text encoder来对输入text提取text embeddings,具体的是SD 1.X 采用目前OpenAI所开源的最大CLIP模型:clip-vit-large-patch14,这个CLIP的text encoder是一个transformer模型(只有encoder模块):层数为12,特征维度为768,模型参数大小是123M。

对于输入text,送入CLIP text encoder后得到最后的hidden states(即最后一个transformer block得到的特征),其特征维度大小为77x768(77是token的数量),这个细粒度的text embeddings将以cross attention的方式送入UNet中。在transofmers库中,可以如下使用CLIP text encoder:

Unet

SD的扩散模型是一个860M的UNet,其主要结构如下图所示(这里以输入的latent为64x64x4维度为例),其中encoder部分包括3个CrossAttnDownBlock2D模块和1个DownBlock2D模块,而decoder部分包括1个UpBlock2D模块和3个CrossAttnUpBlock2D模块,中间还有一个UNetMidBlock2DCrossAttn模

Stable Diffusion LoRA是一种用于微调稳定扩散模型的技术,它允许用户通过较少的数据量对预训练的图像生成模型进行个性化定制。LoRA全称为Low-Rank Adaptation,即低秩适应技术,其核心思想是在大规模预训练模型的基础上,仅调整或添加少量参数来进行特定任务的学习。 ### 训练步骤概述 1. **准备数据集** 收集并整理好你要用于微调的主题图片集合。理想情况下,应该包括足够多样化的样本,并且每张图都应附带适当的描述文本作为条件输入。 2. **安装依赖环境** - 确保已经安装了Python以及PyTorch等必要的库文件。 - 根据官方文档指导完成`diffusers`、`transformers`等相关软件包的安装配置工作。 3. **加载基础模型及Tokenizer** 利用HuggingFace提供的API轻松获取指定版本的基础权重文件与分词工具。 4. **设置LoRA模块** 对于想要优化的部分网络层引入额外的小规模矩阵(Rank),这部分新增加的内容就构成了所谓的“adapter”。需要注意的是,在实际操作过程中只需更新这些新加入部分对应的梯度信息即可。 5. **定义损失函数和优化算法** 选择合适的Loss Function如交叉熵误差,并搭配AdamW之类的现代优化器来加速收敛过程。 6. **启动训练循环** 开始迭代整个流程直至满足预定停止准则为止;期间可以定期保存checkpoint以便后续恢复继续学习或者直接部署应用。 7. **评估性能指标** 使用测试集中未见过的真实样本来衡量改进效果如何。如果结果满意,则可以直接导出finetuned model供生产环境中使用啦! 8. **发布共享成果** 最终可以把精心打磨过的自定义风格转换器分享给更多人体验哦~比如上传至Model Hub平台让全球开发者都能受益于此创新之作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值