神经网络与深度学习第5周课程总结:视觉大模型基础、ViT与CLIP实践

课程名称:神经网络与深度学习
授课教师:屈桢深老师
周次:第5周
主题:视觉大模型基础、Vision Transformer、CLIP与DINO
材料来源:第5周/7_视觉大模型基础.pdf第5周/7-3 ViT.pdf第5周/源代码(神经网络与深度学习课程)/VIT第5周/源代码(神经网络与深度学习课程)/CLIP第5周/源代码(神经网络与深度学习课程)/image_segmentation

在这里插入图片描述

图注:本周课程围绕视觉大模型展开,从大语言模型和多模态大模型的基本训练范式出发,重点学习 Vision Transformer 的图像序列化方法、CLIP 的图文对齐机制,以及 DINO 中自监督学习与知识蒸馏思想。

摘要

第5周课程主题是“视觉大模型基础”。与前几周主要关注卷积神经网络、视觉任务和 Transformer 基本结构不同,本周开始把视角扩展到“大模型”和“多模态”层面:模型不再只处理单一图像分类任务,而是通过大规模预训练学习通用表示,再通过微调、提示词、图文对齐或自监督方式迁移到不同任务。

本周内容可以分为四条主线。

第一条是大模型技术概述。课程从大语言模型讲起,介绍无监督预训练、有监督微调、奖励模型和基于 PPO 的强化学习训练思路。这部分帮助我们理解 ChatGPT 类模型为什么需要“预训练 + 微调 + 人类反馈强化学习”这一组合流程。

第二条是多模态大模型。视觉、语言、音频等模态可以通过统一表示空间进行融合。多模态模型的关键不是简单把不同输入拼起来,而是让模型学会跨模态对齐和迁移。

第三条是 Vision Transformer。ViT 把图像切成 patch,把每个 patch 当成类似 NLP 中 token 的序列元素,再送入 Transformer Encoder。它说明 Transformer 不只适用于文本,也可以成为视觉模型的基础结构。

第四条是 CLIP、DINO 和课程源码实践。CLIP 使用图像编码器与文本编码器完成对比学习,能够做零样本图像分类;DINO 通过教师网络和学生网络实现无标签自监督学习;源码部分则提供了 ViT 花分类训练、CLIP 图像分类示例和 DeepLab 语义分割演示。

目录

  1. 大模型技术概述
  2. 多模态大模型:从单模态识别到图文对齐
  3. Vision Transformer整体思想
  4. ViT嵌入层:图像如何变成Token序列
  5. ViT编码器:LayerNorm、MSA、MLP与GELU
  6. MLP Head、模型结果与微调
  7. CLIP:通用视觉语言预训练
  8. 知识蒸馏与DINO自监督学习
  9. 第5周源码实践:ViT、CLIP与DeepLab
  10. 本周知识点表格总结
  11. 本周学习收获
  12. 总结
  13. CSDN发布建议

1. 大模型技术概述

大模型的核心特点是规模大、数据多、迁移能力强。课程首先以大语言模型为入口,介绍了大模型从预训练到任务适配的基本路线。

大语言模型通常是基于大量文本数据训练出来的语言生成模型。它不是只记忆某个固定答案,而是学习词、句子和上下文之间的统计关系,从而对下一个词、被遮蔽词或整段文本生成结果进行建模。

课程中提到,大语言模型训练可以概括为几个阶段:

  • 无监督预训练:使用大规模无标注语料学习基础语言表示。
  • 有监督微调:使用人工标注的问题回答数据,让模型适应对话和任务指令。
  • 奖励模型训练:让人类比较不同回答的好坏,训练一个能够给回答打分的模型。
  • 强化学习优化:使用奖励模型提供的分数,通过 PPO 等算法继续优化策略模型。

1.1 语言模型预训练与掩码语言模型预训练

无监督预训练常见目标包括语言模型预训练和掩码语言模型预训练。

语言模型预训练关注“预测下一个词”。给定前文,模型学习下一个 token 的概率分布。这类目标适合自回归生成模型。

掩码语言模型预训练关注“根据上下文预测被遮蔽词”。输入句子中部分 token 被 mask 掉,模型需要根据左右上下文恢复这些位置。这类目标常用于双向编码模型。

两种目标都说明一个问题:大模型的基础能力来自海量数据上的通用模式学习,而不是只针对某个小任务训练分类器。

1.2 有监督微调

预训练模型虽然掌握了大量语言模式,但不一定天然会按照人的指令回答问题。因此需要有监督微调。

有监督微调使用人工构造的 prompt-answer 数据,让模型学习“用户问题 -> 合理回答”的映射。微调仍然是梯度下降训练,只是训练数据更贴近目标交互场景。

对于 ChatGPT 类模型来说,微调的作用是让模型从单纯续写文本,转向遵循指令、保持对话风格、回答用户问题。

1.3 奖励模型与PPO

奖励模型的输入通常是 [prompt, model output],输出是一个标量分数,用来表示这个回答在人类看来是否更好。

训练奖励模型时,通常不是直接要求人给每个回答打绝对分,而是让人比较多个模型回答哪个更好。模型学习这种偏好后,就可以对新回答给出质量分数。

有了奖励模型,就可以用强化学习继续训练语言模型。课程中提到 PPO 思路:从 prompt 数据中采样输入,让模型生成回答,再用奖励模型打分,最后用奖励信号更新策略模型。

这个流程体现了大模型训练的重要思想:预训练提供基础能力,微调提供任务格式,奖励模型和强化学习进一步对齐人类偏好。

2. 多模态大模型:从单模态识别到图文对齐

多模态大模型处理的不只是文本,也包括图像、视频、音频等不同数据形态。相比单模态模型,多模态模型需要解决两个问题:

  • 不同模态的输入结构不同。文本是 token 序列,图像是二维像素阵列,音频是时间信号。
  • 不同模态需要对齐。模型需要知道“这张图片”和“这段文字”表达的是同一个语义。

在这里插入图片描述

图注:视觉大模型通常使用统一基础模型或统一表示空间,把图像分类、目标检测、语义分割、图文检索等任务连接起来。核心是从固定任务模型转向可迁移的视觉表示。

课程中列举了常见多模态模型,例如 ChatGPT、Gemini、Claude、LLaMA、Grok、DeepSeek、Qwen 等。虽然不同模型的侧重点不同,但共同方向都是让模型具备跨任务、跨模态的泛化能力。

从视觉方向看,多模态大模型的发展可以理解为三步:

  1. 先用 CNN、ViT 等视觉骨干网络学习图像特征。
  2. 再通过文本编码器、对比学习或跨注意力机制,把图像和文本对齐。
  3. 最后通过指令数据、微调和推理模块,让模型完成开放式视觉问答、图文检索、图像描述等任务。

这也解释了为什么本周重点学习 ViT 和 CLIP。ViT 提供视觉 Transformer 骨干,CLIP 提供图文语义对齐方式,两者都是理解视觉大模型的重要基础。

3. Vision Transformer整体思想

Vision Transformer,简称 ViT,是把 Transformer 用于图像识别任务的代表模型。它的核心论文是 2020 年 Google 提出的 An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale

ViT 的关键思想是:图像可以被切分为固定大小的 patch,每个 patch 可以看作视觉版的 token。这样,图像就能像一句话一样变成序列,送入 Transformer Encoder。

在这里插入图片描述

图注:ViT 先把图像切分为 patch,再通过线性映射变成 patch embedding,加入分类 token 和位置编码后输入 Transformer Encoder,最后使用 MLP Head 输出分类结果。

3.1 ViT与传统CNN的差异

CNN 使用卷积核在图像上滑动,天然带有局部感受野、平移等变性和层级特征提取能力。ViT 不使用卷积作为主要结构,而是直接把 patch 序列输入 Transformer。

这带来两个特点:

  • ViT 更依赖大规模数据预训练。因为它不像 CNN 那样内置强局部归纳偏置。
  • ViT 能更直接地建模全局关系。任意两个 patch 之间可以通过自注意力建立联系。

课程中展示的结果表明,在足够大的数据集上预训练后,ViT 可以达到甚至超过 CNN 或 BiT 等模型效果。这说明 Transformer 架构在视觉领域同样具备很强扩展能力。

3.2 ViT三部分结构

ViT 整体可以分为三部分:

部分 作用 对应理解
Embedding层 把图片转换为 token 序列 图像序列化
Transformer Encoder 建模 patch 之间的关系 全局上下文建模
MLP Head 输出分类结果 任务预测头

这三个部分对应了从图像输入到分类输出的完整流程。

4. ViT嵌入层:图像如何变成Token序列

Transformer 原本处理的是文本序列。ViT 要把图像送入 Transformer,就必须先把图像转换成类似文本 token 的序列。

4.1 Patch切分

假设输入图片为:

x∈RH×W×C x \in R^{H \times W \times C} xRH×W×C

patch 大小为 P x P,那么可以得到:

N=HWP2 N = \frac{HW}{P^2} N=P2HW

个图像 patch。每个 patch 展平后维度为:

P2⋅C P^2 \cdot C P2C

如果使用 ImageNet 常见输入尺寸 224 x 224 x 3,patch 大小为 16 x 16,则每个 patch 包含:

16×16×3=768 16 \times 16 \times 3 = 768 16×16×3=768

个数值。patch 数量为:

22416×22416=14×14=196 \frac{224}{16} \times \frac{224}{16} = 14 \times 14 = 196 16224×16224=14×14=196

因此,原始图像会被转换为 196 个 patch token。

4.2 Linear Projection

每个 patch 展平后,还需要通过线性映射转换到 Transformer 使用的隐藏维度。课程中将这一步称为 patch transformation 或 embedding。

这一步类似 NLP 中的词嵌入。区别是 NLP 的 token 通常是离散词表 id,而 ViT 的 token 来自连续像素块。

可以理解为:

Image -> Patches -> Flatten -> Linear Projection -> Patch Embeddings

4.3 Class Token

ViT 会额外加入一个可学习的 class token,记作 x_class。这个 token 不对应图像中的某个 patch,而是用于汇总整张图的信息。

经过 Transformer Encoder 后,模型取最后一层 class token 对应的表示,送入 MLP Head 做分类。

如果一张图切成 196 个 patch,再加入 1 个 class token,那么输入序列长度就是 197。

4.4 Position Embedding

Transformer 本身不具备二维空间顺序感。如果只给模型 196 个 patch embedding,模型不知道这些 patch 原来在图片中的位置。因此 ViT 需要加入位置编码。

课程中仍然联系了 Transformer 中的一维位置编码公式:

PE(pos,2i)=sin⁡(pos100002i/dmodel) PE(pos, 2i) = \sin\left(\frac{pos}{10000^{2i/d_{model}}}\right) PE(pos,2i)=sin(100002i/dmodelpos)

PE(pos,2i+1)=cos⁡(pos100002i/dmodel) PE(pos, 2i+1) = \cos\left(\frac{pos}{10000^{2i/d_{model}}}\right) PE(pos,2i+1)=cos(100002i/dmodelpos)

ViT 中的位置编码通常是可学习的位置向量,形状与输入序列一致。例如 197 个 token、隐藏维度 768,则位置编码形状为:

197 x 768

完整输入可以写作:

z0=[xclass;xp1E;xp2E;⋯ ;xpNE]+Epos z_0 = [x_{class}; x_p^1E; x_p^2E; \cdots; x_p^NE] + E_{pos} z0=[xclass;xp1E;xp2E;;xpNE]+Epos

其中:

  • x_class 是分类 token。
  • x_p^i 是第 i 个 patch。
  • E 是 patch 线性映射矩阵。
  • E_pos 是位置编码。

5. ViT编码器:LayerNorm、MSA、MLP与GELU

ViT 的主体是 Transformer Encoder。它与前面学习过的 Transformer Encoder 很接近,只是输入从文本 token 变成了图像 patch token。

课程中给出的 Encoder 递推形式可以概括为:

zl′=MSA(LN(zl−1))+zl−1,l=1…L z'_l = MSA(LN(z_{l-1})) + z_{l-1}, \quad l = 1 \ldots L zl=MSA(LN(zl1))+zl1,l=1L

zl=MLP(LN(zl′))+zl′,l=1…L z_l = MLP(LN(z'_l)) + z'_l, \quad l = 1 \ldots L zl=MLP(LN(zl))+zl,l=1L

y=LN(zL0) y = LN(z_L^0) y=LN(zL0)

这里 MSA 是多头自注意力,LN 是 LayerNorm,MLP 是前馈网络,残差连接用于稳定深层模型训练。

5.1 LayerNorm

LayerNorm 是一种标准化技术。它对每个样本内部的特征维度计算均值和方差,再进行归一化。

课程中强调,标准化可以缓解特征维度数值差异,让后续注意力计算和 MLP 训练更稳定。

ViT 通常采用 Pre-LN 结构,即在进入 MSA 和 MLP 前先做 LayerNorm。这与一些 Transformer 实现中的 Post-LN 不完全相同。

5.2 Multi-Head Self-Attention

多头自注意力仍然使用 Query、Key、Value。

对输入序列 X,模型通过线性层得到:

Q=XWQ,K=XWK,V=XWV Q = XW_Q,\quad K = XW_K,\quad V = XW_V Q=XWQ,K=XWK,V=XWV

再计算注意力:

Attention(Q,K,V)=softmax(QKTdk)V Attention(Q,K,V)=softmax\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(dk QKT)V

在 ViT 中,这里的序列元素是图像 patch。某个 patch 可以通过注意力关注其他任意 patch,从而建立长距离空间关系。

例如,图片左上角和右下角的区域在 CNN 中可能需要多层卷积才能充分交互,而在 ViT 中可以在一次自注意力中直接计算相关性。

5.3 MLP层

每个 Transformer Block 中,MSA 后面还有 MLP 层。它通常由两层全连接网络构成,中间使用激活函数。

课程中讲到了 GELU 激活函数。GELU 全称 Gaussian Error Linear Unit,可以写作:

GELU(x)=xΦ(x) GELU(x) = x\Phi(x) GELU(x)=xΦ(x)

其中 Phi(x) 是标准正态分布的累积分布函数。

相比 ReLU 的硬截断,GELU 更平滑。BERT、ViT 等 Transformer 系列模型中经常使用 GELU。

6. MLP Head、模型结果与微调

6.1 MLP Head

ViT Encoder 输出的是一组 token 表示。分类任务通常只取 class token 的最终表示,送入 MLP Head。

可以理解为:

Patch tokens + CLS token
        ↓
Transformer Encoder
        ↓
CLS hidden state
        ↓
MLP Head
        ↓
Class probabilities

MLP Head 的输出维度等于类别数。例如花分类任务中有 5 类,输出维度就是 5。

6.2 ViT模型规格

课程中提到 ViT 有 Base、Large、Huge 等规模。源码 vit_model.py 中也提供了多个模型构造函数:

函数名 说明
vit_base_patch16_224 Base模型,patch大小16,输入224
vit_base_patch16_224_in21k 在 ImageNet-21K 上预训练的 Base/16 模型
vit_base_patch32_224 Base模型,patch大小32
vit_large_patch16_224 Large模型,patch大小16
vit_large_patch32_224_in21k Large模型,patch大小32,ImageNet-21K预训练
vit_huge_patch14_224_in21k Huge模型,patch大小14,ImageNet-21K预训练

模型越大,参数量和计算量越高,对数据规模和硬件资源要求也越高。

6.3 Fine-tuning

微调是把预训练模型迁移到下游任务的重要方法。

课程中强调,预测任务的类别数可能与预训练任务不同。例如预训练可能面向 ImageNet-21K,而当前花分类只有 5 类。因此微调时通常需要替换最后分类头。

源码 train.py 中也体现了这一点:

del_keys = ['head.weight', 'head.bias'] if model.has_logits \
    else ['pre_logits.fc.weight', 'pre_logits.fc.bias', 'head.weight', 'head.bias']
for k in del_keys:
    del weights_dict[k]

这段代码删除了不匹配的分类头权重,只加载主干网络的预训练参数。

如果设置 --freeze-layers=True,代码会冻结除 headpre_logits 之外的大部分参数:

if "head" not in name and "pre_logits" not in name:
    para.requires_grad_(False)

这样可以减少训练成本,也能降低小数据集上过拟合风险。

7. CLIP:通用视觉语言预训练

CLIP 全称 Contrastive Language-Image Pretraining,核心目标是把图像和文本映射到同一个语义空间中。

传统图像分类模型通常只能在固定类别上预测。例如训练集有猫、狗、车,模型输出也只能是这些类别。CLIP 不同,它可以把图片和文本描述进行匹配,因此具备更强的开放类别识别能力。

在这里插入图片描述

图注:CLIP 使用图像编码器和文本编码器分别提取特征,再通过相似度矩阵进行对比学习,使匹配的图文对靠近,不匹配的图文对远离。

7.1 CLIP基本流程

CLIP 包含两个编码器:

  • Image Encoder:把图片编码为向量。
  • Text Encoder:把文本描述编码为向量。

训练时,模型输入一批图像和对应文本。正确匹配的图文对应该在向量空间中相似度高,不匹配的图文对相似度低。

推理时,可以把类别名称写成文本提示,例如:

a photo of a car
a photo of a not_car

再计算图片特征与每个文本特征的相似度,选择得分最高的类别。

7.2 课程CLIP代码

本周 CLIP/CLIP.py 演示了用 CLIP 做简单图像分类。

关键流程如下:

device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load('ViT-B/32', device, download_root = './')

这里加载的是 ViT-B/32 版本 CLIP 模型。图像经过 preprocess 处理,文本经过 clip.tokenize 编码:

image_input = preprocess(image).unsqueeze(0).to(device)
text_inputs = torch.cat([clip.tokenize(f"a photo of a {c}") for c in classes]).to(device)

随后分别提取图像特征和文本特征:

image_features = model.encode_image(image_input)
text_features = model.encode_text(text_inputs)

最后进行归一化并计算相似度:

image_features /= image_features.norm(dim=-1, keepdim=True)
text_features /= text_features.norm(dim=-1, keepdim=True)
similarity = (100.0 * image_features @ text_features.T).softmax(dim=-1)

这段代码体现了 CLIP 的核心:分类不再依赖固定分类头,而是依赖图片向量和文本向量之间的语义相似度。

8. 知识蒸馏与DINO自监督学习

课程还介绍了知识蒸馏和 DINO。

知识蒸馏的基本思想是用一个较强的教师模型指导学生模型。教师模型输出 soft target,学生模型学习教师输出的分布,而不仅仅学习硬标签。

DINO 是一种自监督学习方法,全称 Self-Distillation with No Labels。它不依赖人工标签,而是通过不同增强视图之间的一致性训练模型。

在这里插入图片描述

图注:DINO 使用教师网络和学生网络处理同一图像的不同增强视图。教师输出作为目标信号,学生网络学习对齐该表示,从而在无标签数据上学习视觉特征。

8.1 DINO核心思路

DINO 的典型流程可以概括为:

  1. 对同一张图片生成多个增强视图。
  2. 教师网络处理部分视图,学生网络处理其他视图。
  3. 学生网络学习匹配教师网络输出。
  4. 教师网络通常由学生网络参数的移动平均更新。

这种方法不需要类别标签,但可以学习到具有语义结构的视觉表示。对于大规模无标注图像数据,DINO 提供了一种重要训练方式。

8.2 与CLIP的区别

CLIP 依赖图文对,通过图像和文本之间的对比学习获得跨模态能力。

DINO 依赖图像自身的不同增强视图,通过自蒸馏获得视觉表征能力。

两者都体现了大模型时代的重要趋势:减少对传统人工分类标签的依赖,更多利用大规模数据结构本身提供监督信号。

9. 第5周源码实践:ViT、CLIP与DeepLab

第5周源码目录包含三个实践部分:

  • VIT:ViT 花分类训练和预测工程。
  • CLIP:用 CLIP 做简单图像分类。
  • image_segmentation:DeepLab 语义分割演示。

在这里插入图片描述

图注:ViT 实践代码包含数据集划分、数据增强、加载预训练权重、冻结主干、训练分类头、验证、保存模型和预测图片等步骤。

9.1 VIT代码结构

VIT 文件夹主要文件如下:

文件 作用
README.md 说明数据集、权重、训练和预测配置方法
train.py 训练入口,负责数据加载、模型构建、权重加载、冻结层、训练与验证
predict.py 预测入口,加载图片、模型和类别索引,输出预测概率
vit_model.py ViT模型结构定义,包括PatchEmbed、Attention、Mlp、Block、VisionTransformer等
my_dataset.py 自定义数据集类
utils.py 数据划分、训练、验证等工具函数
weights/ 预训练权重与训练权重
data/flower_photos.tgz 花分类数据集压缩包

vit_model.py 中的主要结构包括:

模块 作用
PatchEmbed 将图像切成patch并转为embedding
Attention 实现多头自注意力
Mlp Transformer block中的前馈网络
Block 一个完整Encoder Block
VisionTransformer ViT完整模型
DropPath 随机深度,用于正则化

9.2 ViT训练流程

train.py 的训练流程比较完整:

  1. 判断设备:优先使用 CUDA。
  2. 创建 weights 文件夹。
  3. 使用 read_split_data(args.data_path) 划分训练集和验证集。
  4. 定义训练和验证数据增强。
  5. 构造 MyDataSetDataLoader
  6. 创建 vit_base_patch16_224_in21k 模型。
  7. 加载预训练权重,并删除不匹配的分类头参数。
  8. 根据 --freeze-layers 冻结主干网络。
  9. 使用 SGD 优化器。
  10. 使用 cosine 学习率调度。
  11. 每个 epoch 训练、验证并写入 TensorBoard。
  12. 保存模型权重。

其中数据增强部分如下:

data_transform = {
    "train": transforms.Compose([
        transforms.RandomResizedCrop(224),
        transforms.RandomHorizontalFlip(),
        transforms.ToTensor(),
        transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
    ]),
    "val": transforms.Compose([
        transforms.Resize(256),
        transforms.CenterCrop(224),
        transforms.ToTensor(),
        transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
    ])
}

训练集使用随机裁剪和水平翻转,增强模型泛化能力;验证集使用固定缩放和中心裁剪,保证评估稳定。

9.3 ViT预测流程

predict.py 中的预测流程如下:

  1. 加载图片。
  2. Resize(256)CenterCrop(224)
  3. 转为张量并归一化。
  4. 使用 unsqueeze(0) 增加 batch 维度。
  5. 读取 class_indices.json
  6. 创建与训练一致的 ViT 模型。
  7. 加载训练好的权重。
  8. model.eval() 切换推理模式。
  9. 使用 torch.no_grad() 前向传播。
  10. 对输出做 softmax,得到类别概率。

关键代码:

with torch.no_grad():
    output = torch.squeeze(model(img.to(device))).cpu()
    predict = torch.softmax(output, dim=0)
    predict_cla = torch.argmax(predict).numpy()

这与前几周 DeepLab 推理流程类似,都体现了实际模型使用时的基本规范:预处理、增加 batch 维、加载权重、切换 eval、关闭梯度、得到预测结果。

9.4 CLIP代码实践

CLIP 文件夹包含:

文件 作用
CLIP.py CLIP图像分类示例
traffic.jpeg 测试图片
cup1.jpg 测试图片
ViT-B-32.pt CLIP模型权重

代码默认使用 traffic.jpeg,类别为:

classes = ['car', 'not_car']

这说明 CLIP 示例不是训练一个新分类器,而是把类别写成文本描述,然后用图文相似度完成分类。

9.5 DeepLab语义分割实践

image_segmentation 文件夹延续第3周语义分割实践,包含:

文件 作用
deeplab.ipynb DeepLab语义分割程序文件
runner.jpgdog.jpgathletes.jpg 测试图片
deeplabv3_resnet101_coco-586e9e4e.pth DeepLabV3-ResNet101预训练权重
readme.txt 权重路径说明

readme.txt 提到,权重需要拷贝到:

C:\Users\<username>\.cache\torch\hub\checkpoints

这样 PyTorch 加载预训练模型时可以直接使用本地缓存。

10. 本周知识点表格总结

10.1 本周核心知识点表

知识点 核心问题 关键结论
大语言模型 模型如何获得通用语言能力 通过大规模无监督预训练学习基础表示
有监督微调 模型如何适应对话和任务 使用人工问答数据调整模型行为
奖励模型 如何衡量回答好坏 学习人类偏好,输出质量分数
PPO强化学习 如何根据奖励优化模型 用奖励信号更新策略模型
多模态大模型 图像和文本如何融合 不同模态映射到统一语义空间
ViT Transformer如何处理图像 把图片切成patch序列
CLIP 如何做图文对齐 图像编码器和文本编码器进行对比学习
DINO 无标签图像如何训练 教师-学生自蒸馏学习视觉表示

10.2 ViT输入输出张量表

阶段 形状示例 说明
原始图像 224 x 224 x 3 RGB输入图像
Patch切分 196 x 768 16x16 patch,共196个,每个展平为768维
加入CLS 197 x 768 增加分类token
加位置编码 197 x 768 加入空间位置信息
Encoder输出 197 x 768 每个token得到上下文表示
CLS输出 1 x 768 用于整图分类
MLP Head输出 num_classes 类别预测分数

10.3 ViT模块功能表

模块 功能 学习重点
PatchEmbed 切分图片并映射到隐藏维度 图像序列化
Position Embedding 加入位置信息 弥补Transformer无空间顺序感
Class Token 汇总整图信息 分类任务输出入口
LayerNorm 标准化特征 稳定训练
Multi-Head Attention 建模patch间关系 全局上下文
MLP 非线性特征变换 提升表达能力
GELU 平滑激活函数 Transformer常用激活
MLP Head 分类输出 下游任务预测

10.4 CLIP与DINO对比表

对比项 CLIP DINO
训练信号 图像-文本配对 同图像不同增强视图
是否需要文本 需要 不需要
是否需要人工类别标签 不需要传统类别标签,但需要图文数据 不需要
核心机制 对比学习 自蒸馏
输出能力 图文检索、零样本分类、开放类别识别 通用视觉表示、无监督特征学习
代表模块 Image Encoder + Text Encoder Teacher + Student

10.5 源码实践流程表

实践 输入 核心步骤 输出
ViT训练 花分类数据集、预训练权重 数据增强、加载权重、冻结主干、训练分类头 weights/model-*.pth
ViT预测 测试图片、类别索引、训练权重 预处理、前向传播、softmax 类别与概率
CLIP分类 图片、文本类别描述 图像编码、文本编码、相似度计算 最相似类别
DeepLab分割 测试图片、DeepLab权重 预处理、模型推理、argmax、可视化 像素级分割图

10.6 常见注意事项表

问题 原因 处理方法
ViT权重加载失败 分类头维度不匹配 删除 headpre_logits 相关权重
训练过慢 ViT模型和权重较大 冻结主干,只训练分类头
预测脚本找不到类别 缺少 class_indices.json 先运行训练流程生成类别映射
CLIP库无法导入 未安装CLIP依赖 按代码注释安装 git+https://github.com/openai/CLIP.git
DeepLab权重无法加载 权重未放入PyTorch缓存路径 readme.txt 拷贝到 checkpoints 目录

11. 本周学习收获

本周最重要的收获,是理解视觉模型已经从“为固定任务设计网络”逐步走向“先学习通用视觉表示,再迁移到多种任务”。

传统 CNN 视觉模型通常围绕分类、检测、分割分别设计结构。ViT 则把图像转成 patch token,让 Transformer 成为视觉骨干。这说明 Transformer 的序列建模能力可以迁移到二维视觉数据,只要我们合理设计图像到序列的转换方式。

CLIP 进一步说明,视觉模型不一定只能输出固定类别。通过图像和文本对齐,模型可以把“类别名称”“自然语言描述”和“图片内容”放到同一语义空间中比较。因此,图像分类可以从固定分类头变为图文相似度匹配。

DINO 则说明,视觉表示也可以从无标签数据中学习。教师-学生结构、自监督增强视图和蒸馏损失,使模型不依赖人工类别标签也能学习到有用特征。

源码实践方面,ViT 训练代码帮助我们把理论结构落到工程流程。训练一个 ViT 下游任务,不只是调用模型,还要处理数据集划分、数据增强、权重加载、分类头替换、冻结层、学习率调度、验证和模型保存。CLIP 示例则展示了图文模型如何用几行代码完成开放式分类。

12. 总结

第5周课程以视觉大模型为核心,系统梳理了大模型训练思想、多模态模型发展、Vision Transformer、CLIP、DINO 和相关代码实践。

从理论上看,本周建立了三层认识:

第一,大模型的能力来自大规模预训练、微调和对齐。无监督预训练学习基础表示,有监督微调适配任务格式,奖励模型和强化学习进一步贴近人类偏好。

第二,视觉大模型的关键是表示学习和迁移。ViT 把图像变成 patch 序列,CLIP 把图像和文本放进同一空间,DINO 从无标签图像中学习视觉特征。

第三,代码实践必须关注完整链路。ViT 训练涉及数据、权重、模型结构、优化器、学习率、冻结策略和预测流程;CLIP 分类体现了图文相似度推理;DeepLab 分割继续帮助我们理解视觉模型在像素级任务中的使用方式。

总体来看,本周内容把前面学习的 Transformer、视觉任务和 PyTorch 实践连接到了当前大模型发展方向,为后续继续学习视觉语言模型、图像生成模型和多模态智能系统打下基础。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐