
本课核心解决的两大问题为什么不能把图像拉直因为猫在左上角和右下角拉直后像素位置完全变了全连接网络FC学不到“平移不变性”。卷积干了件什么事用一个小模板滤波器在图像上滑动每滑到一个位置就计算模板和下方图像块的点积匹配程度。这就像用“猫鼻子模板”在全图找鼻子不管鼻子在哪都能找到第一部分范式革命人类设计特征 vs. 机器自学特征在你进入卷积公式之前先理解这堂课的历史背景能帮你建立“降维打击”的认知。范式第一阶段手工特征传统CV第二阶段端到端学习深度学习 / CNN做法① 人类写代码提取特征如颜色直方图、HOG边缘梯度② 把提取出的特征向量塞进线性分类器SVM。① 输入原始像素像素矩阵② 整个系统从第一层到最后一层全部通过梯度下降自动学习③ 人类只设计网络结构不设计特征提取规则。代表技术颜色直方图把颜色空间切成桶统计每个桶有多少像素抛弃空间位置。方向梯度直方图HOG统计图像局部区域的边缘朝向抛弃颜色。卷积神经网络ConvNet让网络自己学会第一层提取边缘、第二层提取纹理、深层提取猫脸。人类工作量极大调C/Matlab代码调到手抽筋相对较小只要数据够多GPU够强让梯度下降替你打工金句“在传统特征工程中人类是‘设计师’在深度学习中人类是‘建筑师’——我们只搭建积木框架让数据自己填充积木里的内容。”第二部分卷积层Convolution Layer—— 滑动窗口点积机幻灯片里给出了卷积层的输入输出维度。我们先来拆解这些字母到底代表什么。1. 输入与输出的“形状大变身”形状检查法假设我们有一张彩色图片进入卷积层输入[N, C_in, H, W]NBatch Size一次性送几张图比如32张。C_in输入通道数如果是彩色RGB图就是3红绿蓝。如果是灰度图就是1。H图片高度比如32像素。W图片宽度比如32像素。卷积核权重参数[C_out, C_in, K_h, K_w]C_out输出通道数你想用多少个不同的模板去搜比如6个模板。C_in输入通道数必须和输入通道数匹配这里是3。K_h卷积核高度比如5像素。K_w卷积核宽度比如5像素。输出[N, C_out, H, W]H输出高度计算公式H (H - K_h 2P) / S 1W输出宽度计算公式W (W - K_w 2P) / S 1 手算示例把数字带进去输入图片大小7 x 7为了方便计算忽略通道数只算单通道灰度图。卷积核大小3 x 3K3。步幅StrideS1每次滑动1个像素。填充PaddingP0不填充就在原图里面滑。计算输出尺寸输出 (7 - 3 0) / 1 1 5 一张7x7的图经过3x3卷积变成了5x5。2. 卷积到底在算什么数学手把手点积计算场景你有一个3x3的滤波器模板和图像左上角的3x3小块。滤波器模板text[ 1, 0, 1] [ 0, 1, 0] [ 1, 0, 1]图像左上角小块text[ 2, 5, 3] [ 8, 1, 6] [ 4, 7, 9]计算过程点积 对应位置相乘后求和(1*2) (0*5) (1*3) (0*8) (1*1) (0*6) (1*4) (0*7) (1*9) 2 0 3 0 1 0 4 0 9 19这个19代表什么代表这个3x3模板匹配图像左上角区域的程度。数字越大说明该区域和模板长得越像。然后我们把滤波器向右滑动1格再算下一个位置的点积……直到滑遍全图得到一个5x5的响应图Activation Map。灵魂画图卷积滑动过程text输入图像 7x7 滤波器 3x3 输出响应图 5x5 [ 2 5 3 | 4 1 2 3 ] [ 1 0 1 ] [19 ... ...] [ 8 1 6 | 0 5 7 4 ] [ 0 1 0 ] → [.. .. ..] [ 4 7 9 | 2 8 3 1 ] [ 1 0 1 ] [.. .. ..] ────────── [ 6 2 1 | 5 9 4 8 ] [ 3 0 4 | 7 2 6 5 ] [ 9 1 5 | 3 8 2 7 ] [ 8 4 2 | 1 6 9 3 ]第三部分填充Padding与步幅Stride—— 控制输出大小的“遥控器”1. 通用公式死记硬背也要记住输出尺寸输入尺寸−卷积核尺寸2×填充/步幅 12. 为什么需要填充Padding问题7x7经过3x3卷积变成5x5图片变小了。经过多层卷积后图片会缩成1x1边缘信息角落的像素只用了一次中间的像素用了很多次边缘信息被浪费了。解法在输入图像外围补一圈0通常补0不影响点积结果。“Same”填充最常见我们希望输出尺寸和输入尺寸一样大H H。公式变形P (K - 1) / 2举例卷积核K3则P (3-1)/2 1。在图像外围补1圈0。7x7经过3x3卷积输出仍是7x7。举例卷积核K5则P (5-1)/2 2。补2圈0。3. 步幅Stride—— 快进键步幅S1滤波器每次向右/向下移动1格很慢但保留细节。步幅S2滤波器每次向右/向下移动2格输出尺寸直接减半计算量变小且快速增大感受野。计算示例输入7x7卷积核3x3填充0步幅S2。输出 (7 - 3 0) / 2 1 4 / 2 1 3。变成了3x3图片直接缩了一大圈。第四部分多通道卷积彩色图怎么算—— 三维点积场景输入是RGB彩色图形状[C_in3, H5, W5]。滤波器必须和输入有相同的通道数所以滤波器形状是[C_in3, K3, K3]也就是3x3x3的一个立体方块。计算过程滤波器盖在图像上覆盖了R通道的3x3、G通道的3x3、B通道的3x3。计算三维点积把这3 * 3 * 3 27个数字分别对应相乘然后全部加起来得到一个标量一个数字。滑动这个立体方块得到一张输出通道数1的二维响应图。如果我们想要输出6个通道怎么办那就准备6个不同的3x3x3立体滤波器。每个滤波器滑一遍得到1张二维响应图。把6张响应图堆叠Stack起来就得到了输出形状[C_out6, H, W]。左边是输入N x C_in x H x W中间是滤波器组C_out x C_in x K_w x K_h右边输出N x C_out x H x W。你现在能看懂这张图的逻辑了吗第五部分超参数 vs 参数概念包含什么由谁决定能学习吗超参数Hyperparameters卷积核大小K3x3还是5x5输出通道数C_out6个还是64个步幅S1还是2填充P0还是1人类设计师你拍脑袋定的❌不能学需要在训练前定好。参数Parameters滤波器里的具体数值比如上面例子里的[1,0,1; 0,1,0; 1,0,1]偏置b每个输出通道一个偏置标量梯度下降 反向传播✅能学训练过程中不断调整。⚠️关于偏置的说明每个滤波器输出通道有且仅有1个偏置值。当你算出整张5x5响应图后直接把这一层的偏置b加到5x5的每一个格子上这叫广播 Broadcast。所以卷积层的偏置向量维度是[C_out]。第六部分感受野Receptive Field—— 为什么越深“看”得越广第一层卷积3x3输出层的每个像素只看输入图像的3x3区域视野极小只能看到边缘和角落。第二层卷积3x3第二层的输出看的是第一层输出的3x3区域。但因为第一层输出已经包含了原始输入的3x3视野所以第二层实际上看到的是原始输入的5x5区域。堆叠N层 3x3 卷积有效感受野 2N 1。为什么我们要堆叠层因为单层大卷积核比如7x7计算量大参数多而堆叠两层3x3能达到5x5的感受野但参数数量少得多这就是为什么现代CNN全用3x3小卷积核堆叠而不用7x7大卷积核。第七部分池化层Pooling Layer—— 浓缩精华降维打击池化层没有需要学习的权重参数不像卷积层有W和b。它纯粹是做下采样缩小图片尺寸目的是快速增大感受野减轻计算负担。最常见最大池化Max Pooling窗口大小2x2步幅2不重叠窗口滑动2格操作在每个2x2区域内只取最大的那个数字扔掉其他3个。手算示例text输入 4x4 区域 [ 1, 3, 2, 4 ] [ 5, 6, 8, 7 ] [ 9, 2, 1, 3 ] [ 4, 7, 5, 6 ] Max Pooling2x2步幅2输出 2x2 左上角 2x2 [1,3; 5,6] 取最大值 6 右上角 2x2 [2,4; 8,7] 取最大值 8 左下角 2x2 [9,2; 4,7] 取最大值 9 右下角 2x2 [1,3; 5,6] 取最大值 6 输出矩阵 [ 6, 8 ] [ 9, 6 ]为什么用最大值因为卷积层提取的特征比如边缘在图像某个局部区域只要出现了我们就保留最强的响应。这增强了平移不变性——物体稍微偏移一点最大值大概率还是那个数。第八部分平移等变性Translation Equivariance—— CNN的“特权”你笔记里提到了这个概念这是CNN相较于全连接FC的绝对优势。公式定义先对图像做卷积再把结果平移等于先把图像平移再做卷积。白话解释你用同一个边缘检测滤波器去扫图像。无论猫在图片的左上角还是右下角只要它存在滤波器就能在对应的位置激发出高响应。而在全连接网络里像素被拉直了左上角的猫和右下角的猫在向量空间里是完全不同的两组数字网络根本认不出来 第五课终极认知闭环一张图总结网络结构text输入图像 [N, 3, 224, 224] ↓ 【卷积层】 ← 一堆 3x3 滤波器参数可学 ReLU激活非线性 ↓ 输出 [N, 64, 224, 224]假设Same填充 【池化层】 ← 2x2 最大池化步幅2无参数 ↓ 输出 [N, 64, 112, 112]尺寸减半 【卷积层】 ← 一堆 3x3 滤波器参数可学 ReLU ↓ 输出 [N, 128, 112, 112] 【池化层】 ← 2x2 最大池化 ↓ 输出 [N, 128, 56, 56]尺寸再减半 ... 重复几轮 ... 【全局平均池化 或 展平Flatten】 ↓ 输出变成一维特征向量 [N, 特征数] 【全连接层FC】 ← 传统线性分类器参数可学 ↓ 输出 [N, 10]10类得分 【Softmax】 → 输出概率关键点卷积层负责提取特征空间结构池化层负责缩小尺寸增大感受野全连接层在最后负责分类决策。但最重要的是整个链条从头到尾所有带参数的层卷积核权重、全连接权重都用梯度下降同步更新避坑指南血泪经验输入维度顺序PyTorch里永远是(Batch, Channel, Height, Width)千万别传成(Batch, Height, Width, Channel)否则会报Expected 4D input错误。卷积核通道数必须对齐如果输入是3通道你的卷积核shape[1]必须是3。默认首选卷积核大小用3x3填充用1Same填充步幅用1。下采样的工作交给2x2最大池化步幅2或者步幅为2的卷积stride2。