MiniCLIP:简化CLIP实现
项目简介
本项目是对论文 "Learning Transferable Visual Models From Natural Language Supervision"(CLIP) 的一次轻量实现,适用于资源受限环境(如单卡 8GB 显存)。该实现完整复现了 CLIP 的核心思想与训练流程,并使用 Flickr8k 数据集进行实验验证。
模块划分
1. 模型结构:models/clip_model.py
- 双编码器结构:
VisionTransformer
:图像编码器(可替换为 ResNet)TextTransformer
:文本编码器(支持简单Transformer)
- 模态对齐:输出图像和文本嵌入后,进行 L2 正则化;
- 相似度计算:用内积乘以可学习的温度参数;
- 返回双向 logits(图像→文本,文本→图像)用于训练。
2. 损失函数:utils/loss.py
使用对比损失(cross entropy):
1
2
3loss_i2t = CE(logits_per_image, labels)
loss_t2i = CE(logits_per_text, labels)
return (loss_i2t + loss_t2i) / 2
3. 简易分词器:utils/tokenizer.py
- 构建词表
build_vocab()
,从训练语料中统计词频; - 简单分词器
simple_tokenizer()
支持[UNK]
和[PAD]
; - 固定最大长度,适配 transformer 输入。
4. 数据集类:data/flickr8k.py
- 加载
Flickr8k
数据集(图像路径 + captions.json); - 每张图像可选取一条或多条描述;
- 支持
transform
与自定义collate_fn
。
5. 训练脚本:train_and_val.py
- 包含完整训练流程:
- 使用
tqdm
实时展示训练进度; - 每轮记录
loss
和accuracy
到 CSV; - 保存每轮 checkpoint;
- 使用
- 支持自定义训练超参与保存路径(不依赖 argparse);
实验说明
- 数据:
Flickr8k
数据集(约 8k 图像,提供英文描述) - 模型配置:
- 嵌入维度:256
- 图像输入:224 × 224
- Transformer 层数可调
- 训练观察:
- 即便在小数据集上训练有限轮数,模型也能学习到图文对齐;
logit_scale
收敛表现正常,模型鲁棒性良好。
使用方式
1 | # 安装依赖(PyTorch + torchvision 等) |
你也可以在自己的数据集或网络结构上进一步拓展,例如:
- 替换为
ResNet
作为图像编码器; - 加入
prompt tuning
或template ensemble
; - 实现
few-shot finetune
支持。
总结
- 自然语言作为监督源是高效且灵活的;
- 图文对比学习能构建通用多模态表示空间;
- 即使资源有限,合理裁剪也能实践大型模型思想。