文章目录[隐藏]
文章转载自公众号:Coggle数据科学,版权归原作者所有!
最近Stable Diffusion - Image to Prompts在火热进行中,在论坛中Little Boat也分享了现在的金牌思路,非常值得学习。
高分思路步骤
https://www.kaggle.com/competitions/stable-diffusion-image-to-prompts/discussion/398529
步骤1:数据清洗
从Stable Diffusion 2M数据集开始,根据提示语句嵌入相似性进行过滤,删除嵌入相关性大于0.95的图像/提示对,结果少于500K张图像。
此步骤是为了删除根据prompt删除重复的样本,这样也防止模型过拟合,加快模型训练速度。
步骤2:构建验证集
还要下载30K和80K图像数据集。将一些图像作为验证集(但删除了其中25K张不高度相关的图像)。
30K数据集链接:https://www.kaggle.com/competitions/stable-diffusion-image-to-prompts/discussion/391500
80K数据集链接:https://www.kaggle.com/competitions/stable-diffusion-image-to-prompts/discussion/390674
为什么使用Stable Diffusion 2M之外的数据作为验证集呢?这里主要是因为数据分布的问题,Stable Diffusion 2M的文本很多都比较相似,因此使用其他数据集作为验证集比较合适。
步骤3:训练CLIP模型
加载预训练的OpenAI CLIP模型(或选择其他的模型),解冻几个transformer层,训练一个模型。
CLIP(Contrastive Language-Image Pre-Training)是由OpenAI提出的一种预训练模型,可以学习如何理解自然语言和图像之间的关系。
class Net(nn.Module): def __init__(self): super(Net, self).__init__()
clip = AutoModel.from_pretrained("openai/clip-vit-large-patch14")
self.vision = clip.vision_model
self.fc = nn.Linear(1024, 384)
def forward(self, x): out = self.vision(x)['pooler_output'] return self.fc(out)
训练代码:https://www.kaggle.com/code/xiaozhouwang/model-training-script/notebook?scriptVersionId=123954941
步骤4:选择prompt关键词
使用在测试数据上训练的句子嵌入的模型生成自己的样本,预测预测和实际数据的余弦相似性,以帮助您决定生成哪些图像来关注您的主要模型的弱点。
这一步部分是方案的关键,识别出CLIP效果比较差的prompt,然后进行特定的训练。
步骤5:prompt生成器
编写一个prompt生成器,并使用它来生成prompt候选。
生成代码:https://www.kaggle.com/code/xiaozhouwang/hard-coded-prompt-generator/
也可以用prompt微调GPT2模型,并将其用作prompt生成器。
步骤6:筛选样本
将步骤5与已有的训练数据进行计算文本相似度,按照相似度过滤其他样本。
步骤7:数据集划分
将生成的图像分为训练集和测试集,扩展两个数据集。再次训练主模型,必要时解冻更多层。
步骤8:迭代训练
反复执行步骤4、5、6和7,以获得更多的样本并提高模型预测。
思路关键点
-
这个思路可以产生无限的训练样本,因此计算机的能力是唯一的限制因素。
-
通过对比CLIP模型的预测结果,最终可以获取得到效果比较差的prompt。
-
训练了一个GPT2用于生成prompt的过程,这个可以保证prompt的真实性和有效性。