Stable Diffusion 多模态大模型 LoRA 微调实战
LoRA (Low-Rank Adaptation) 是一种高效的参数微调技术。在训练 Stable Diffusion 时,首先冻结模型的权重,然后在 U-Net 结构中注入 LoRA 矩阵,将其与交叉注意力模块结合。微调时仅更新这部分低秩参数,从而大幅降低显存占用并加速收敛。
数据收集与准备
本次微调将使用数码宝贝数据集作为下游细分任务。Stable Diffusion 的训练数据格式直观,即一张图片对应一段文本描述。我们需要通过爬虫整理数据,包括名称、介绍和对应的图片链接,并按指定格式保存。
数据格式要求
{
"file_name": "0001.png",
"text": "image 1 description"
}
文件夹结构示例:
folder/train/metadata.jsonl # 存储 caption 描述
folder/train/0001.png
folder/train/0002.png
...
爬虫实现逻辑
为了实现数据收集,我们使用 Python 的 requests 库获取网页内容,并使用 BeautifulSoup 解析 HTML。分析发现,所有数码兽信息存在于 id 为 digimon_list 的 ul 列表中,每一行是一个 li 标签,包含详情链接。
具体步骤如下:
- 遍历页面中的 li 标签,提取数码兽名称和详情页面链接。
- 进入详情页面,获取数码兽的介绍和图片链接。
- 下载图片并保存到本地文件夹。
- 将文件名和描述文本整理成 JSONL 格式保存。
以下是核心代码示例:
import os
import json
import requests
from bs4 import BeautifulSoup
# 创建文件夹
data_dir = "./train"
if not os.path.exists(data_dir):
os.makedirs(data_dir)
# 请求数码兽图鉴页面
url = "http://digimons.net/digimon/chn.html"
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")
# 遍历所有的 li 标签
digimon_list = soup.find("ul", id="digimon_list")
for digimon digimon_list.find_all():
:
name = digimon.find()[].split()[]
detail_url = + digimon.find()[]
response = requests.get(detail_url)
soup = BeautifulSoup(response.content, )
caption = soup.find(, class_=).find().text.strip()
img_url =
img_data = requests.get(img_url).content
file_name =
(os.path.join(data_dir, file_name), ) f:
f.write(img_data)
metadata = {: file_name, : }
(os.path.join(data_dir, ), ) f:
f.write(json.dumps(metadata, ensure_ascii=) + )
Exception e:
()


