「CS231n:计算机视觉与深度学习」学习笔记(Assignments)
本篇为《CS231n: Deep Learning for Computer Vision》课程的学习笔记,课程版本为 Spring 2025。该篇笔记涵盖了 Assignments。
主要参考了 CS231n 官网 和 B 站课程视频,相关代码和作业实现可以参考 个人完成记录。
前置说明:基础知识可参考 《PyTorch深度学习实践》。本文默认读者已掌握该课程的基础常识,故不再进行赘述。
这一系列笔记为个人随手记录,且是直接从 Obsidian
强行复制过来的,不保证排版和可读性()。
导航链接:
- Lec 02 - Lec 04:线性分类器进行图像分类,正则化与优化,神经网络与反向传播
- Lec 05 - Lec 11:基于 CNN 的图像分类,CNN 架构,循环神经网络,注意力机制与 Transformer,目标检测、图像分割与可视化,视频理解,大规模分布式训练
- Lec 12 - Lec 17:自监督学习,生成模型(一),生成模型(二),三维视觉,视觉与语言,机器人学习
- Assignments:作业合集
Assignment 1
Q4: Higher Level Representations: Image Features
对图像进行处理,使用图像特征(例如使用方向梯度直方图(HOG)捕捉图像纹理 / 轮廓而忽略颜色,在 HSV 颜色空间中使用色相通道捕捉图像的颜色信息(如颜色比例等))这些图像特征可量化成向量,代替原始像素,可有效地提升识别准确度。
不过使用图像特征也会导致另外的问题,例如对于 CIFAR-10 使用线性分类器,并用 HOG 和 Color Histogram 优化时,两者可能独立地提取出了轮廓特征和颜色特征,并与分类进行对比,但实际上轮廓和颜色并不相互独立,故可能在轮廓和颜色均独立地符合某一分类时,该分类不一定是正确的分类,此时则会出现分类错误。
Q5: Training a fully connected network
对于 loss 和梯度的合理性检验,可采用小批量数据进行过拟合,观察是否可调参达到 100% training accuracy。
一般来说,更复杂的网络对权重初始化尺度(initialization scale)更敏感(即梯度消失 / 爆炸)。
且一般来说,若 loss 长时间不动,则说明梯度消失了,增大
weight_scale
可防止信号传回时过度衰减,从而避免梯度消失;但此时可能由于
weight_scale
增大导致原本的梯度传回时更大,导致梯度爆炸,此时则需减小
learing_rate。
Assignment 2
Q1: Batch Normalization
Batch Norm 在 batch 较大时表现较好,但这也导致了当网络较为复杂时,由于硬件限制,batch 大小有限,其应用效果较差。此时可用 Layer Norm 等其他归一化方法替代。
与 Batch Norm 同理,Layer Norm 在特征维数很小时表现较差。
Q3: Convolutional Neural Networks
搭建一个新网络后,首要做的事情之一为对 loss 进行合理性检查。例如使用 softmax 时,若未加入正则化,由于初始化权重的随机性,\(C\) 分类的 loss 应为 \(\log C\) 左右;加入正则化后,loss 应略有上升。
在 CNN
中,若特征图是通过卷积得到的,由于每个通道由同一个卷积核生成,所以可以认为每个特征通道的统计量(例如均值、标准差)在不同图像之间、以及同一图像的不同位置上均是相对一致的,所以在此,Batch
Norm 可修改为 空间批量归一化(Spatial Batch
Normalization),即对输入 (N, C, H, W),对
C 个通道分别计算均值和标准差(即遍历
N、H、W)(相较于 Batch Norm
在全连接网络中则对输入 (N, D),在批次维度 N
上进行归一化)。
由文献 [1] 可知,当与卷积层一起使用时,Layer Norm 的表现不如 Batch Norm: > 对于全连接层,同一层中的所有隐藏单元往往对最终预测做出相似的贡献,因此对该层的输入总和进行重新中心化和重新缩放效果很好。然而,这种相似贡献的假设在卷积神经网络中不再成立。大量感受野位于图像边界附近的隐藏单元很少被激活,因此它们与同一层内的其余隐藏单元具有截然不同的统计特性。
然而 Batch Norm 也有自身的依赖于 batch 大小的劣势,于是来自于文献 [2],可采用折中的方案:将每个样本的特征固定分为 \(G\) 组,然后对每个样本的每个组内的特征进行归一化。其被称为 组归一化(Group Normalization)。
该文献指出,即使每个组内假设特征的贡献是均等的,也不会带来太大的问题(在视觉分类任务中,特征本身天然地有分组结构(例如在传统机器学习中,方向梯度直方图(HOG)在每个局部空间块上计算出直方图后,每个块的直方图会先进行归一化,再拼接成最终的特征向量))。
[1] Ba, Jimmy Lei, Jamie Ryan Kiros, and Geoffrey E. Hinton. "Layer Normalization." stat 1050 (2016): 21. [2] Wu, Yuxin, and Kaiming He. "Group Normalization." arXiv preprint arXiv:1803.08494 (2018).
Q4: PyTorch on CIFAR-10
可使用 nn.init
对层的权重进行初始化,例如下列代码实现了线性层的 Kaiming 初始化:
1
2self.fc1 = nn.Linear(input_size, hidden_size)
nn.init.kaiming_normal_(self.fc1.weight)
可使用 nn.Sequential
进行更为方便地进行模型的定义,其尤其适合简单模型,但灵活性不如
nn.Module(nn.Sequential
只可定义线性堆叠的前馈结构),例如如下为一个两层 MLP 的实现:
1
2
3
4
5
6
7
8
9
10class Flatten(nn.Module):
def forward(self, x):
return flatten(x)
model = nn.Sequential(
Flatten(),
nn.Linear(3 * 32 * 32, hidden_layer_size),
nn.ReLU(),
nn.Linear(hidden_layer_size, 10),
)
Q5: Image Captioning with Vanilla RNNs
在 RNN 中,对于每个隐藏状态通过时序仿射层(Temporal Affine
Layer)而得到的对词汇表的每个单词的预测分数,可通过 softmax 计算
loss,并取平均。
而由于每次输入的序列长度可能不一,且我们不希望让序列末尾填充的
<NULL>(在序列末尾添加 <NULL>
以使每个序列长度相等)影响 loss 和梯度,故可对 softmax
上加入掩码(mask)(使末尾的 <NULL>
不参与计算),形成时序 Softmax 损失(Temporal Softmax Loss)。
对于图像描述的模型:
- 训练:已有真实描述的文本,所以每个时间步都会把真实的单词传入 RNN;
- 测试:对于每个时间步,会在模型输出的词汇表概率分布中采样一个词,再将该词作为下一个时间步的输入。
Assignment 3
Q4: CLIP and Dino
DINO
DINO 也是一种自监督学习方法,其通过引用了师生框架,避免了对大量负样本的需求,从而降低了类似于 SimCLR 和 CLIP 对批次大小的高度依赖。
其与 SimCLR 类似,需最大化从同一图像变换出的两张图像的相似度,但其采用了两个不同的编码器,这两个编码器会以不同的方式进行训练。 其中,学生网络(student network)通过反向传播进行更新,以匹配 教师网络(teacher network)的输出;而教师网络不会采用反向传播,而采用学生权重的 指数移动平均(EMA)进行更新。 这意味着教师网络更新更慢,为学生提供了稳定的学习目标。