MiniCLIP:简化CLIP实现

项目地址:github.com/QianQing26/MiniCLIP

项目简介

本项目是对论文 "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
    3
    loss_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 实时展示训练进度;
    • 每轮记录 lossaccuracy 到 CSV;
    • 保存每轮 checkpoint;
  • 支持自定义训练超参与保存路径(不依赖 argparse);

实验说明

  • 数据:Flickr8k 数据集(约 8k 图像,提供英文描述)
  • 模型配置:
    • 嵌入维度:256
    • 图像输入:224 × 224
    • Transformer 层数可调
  • 训练观察:
    • 即便在小数据集上训练有限轮数,模型也能学习到图文对齐;
    • logit_scale 收敛表现正常,模型鲁棒性良好。

使用方式

1
2
3
4
5
6
# 安装依赖(PyTorch + torchvision 等)

# 训练模型
python train_and_val.py

# 模型、日志将自动保存在 ./checkpoints 与 train_log.csv

你也可以在自己的数据集或网络结构上进一步拓展,例如:

  • 替换为 ResNet 作为图像编码器;
  • 加入 prompt tuningtemplate ensemble
  • 实现 few-shot finetune 支持。

总结

  • 自然语言作为监督源是高效且灵活的;
  • 图文对比学习能构建通用多模态表示空间;
  • 即使资源有限,合理裁剪也能实践大型模型思想。