跳到主要内容

卷积 — 图像怎么进网络

这一章讲三件事: 卷积这个操作本身(一条 9 个数的信号走一遍); 深度学习版卷积与信号处理版唯一的区别(滤波器学出来的)。

积木箱的第三块是池化(窗口内取最大,压分辨率);把卷积、ReLU、池化拼成标准积木箱,配四个项目验收。

这套积木拼出的成品叫 CNN(卷积神经网络的缩写)。 dense 网络到本章为止够了,图像会把它撑爆——这是本章存在的理由。

1. 顶层全景

原始图像(像素的排列) 特征的排列
┌─────────────┐ 卷积+ReLU+池化 ┌──────────────┐
│ 12 × 16 像素 │ ──×2 ───────────▶ │ 32 个 1×2 特征图│──▶ 拍平+密集层 ──▶ 分类
└─────────────┘ └──────────────┘
「这张图长什么样」 「这张图有什么」

图说:空间分辨率一路降,通道(特征)数一路升。
原书实测:12×16 的输入穿过两轮「卷积+ReLU+池化」后,
变成 32 张 1×2 的小图——"图像缩小了,特征变富了"[^1]。

2. 核心原理

2.1 主走查:9 个数、一个滤波器,滑一遍

卷积的定义只有一句话:拿一小撮数(滤波器)在主数据上一步步滑动, 每停一步,把滤波器里的数和它盖住的数据对应相乘、再全部加起来,得出输出的一位1

拿原书的信号走一遍。输入是 9 个数,滤波器是 [0.5, 0.5] (滑动平均):

信号: 0 2 0 2 0 2 0 2 0
滤波器:[0.5, 0.5]

第 1 步:盖住前两个数 (0, 2) → 0×0.5 + 2×0.5 = 1
第 2 步:右移一格盖住 (2, 0) → 2×0.5 + 0×0.5 = 1
第 3 步:盖住 (0, 2) → 1
……重复,直到滤波器贴到信号末尾

输出:[1, 1, 1, 1, 1, 1, 1, 1] —— 八个数

两个细节都有讲究。输出长度 = 信号长 − 滤波器长 + 1(9−2+1=8): 滤波器只允许「完整贴进」信号内部的位置,压线的步数不算2输出比输入平滑:0/2 交替的方波被磨成了恒定的 1——这就是滑动平均, 一个百年历史的信号处理操作3

换个滤波器,同一个操作就换一种用途:换成 [−1, 0, 1] (Sobel 滤波器)是做差分, 信号平的地方输出 0、有跳变的地方出一个尖峰——检测阶跃;换成高斯形状是加权平滑4。 一个操作,滤波器定用途,这是卷积在信号处理里用了几十年的原因。

2.2 到二维与彩色:特征图与通道

图像的卷积一模一样,只是滤波器从一排数变成一小块(比如 2×2),滑动方向变成两个。 输出仍然是一张图,术语叫特征图(feature map)——「滤波器响应强度」的地图5。 彩色图(RGB 三通道)的滤波器是一块立方体:厚度贯穿所有颜色通道, 在滑动的同时把颜色信息一并混合6

2.3 深度学习改的那一处:滤波器是学出来的

信号处理里滤波器靠工程师手工设计;深度学习里,滤波器就是权重,训练学出来的7。 这是全章最重要的一句话,它把卷积从「预处理的工具」变成了「网络的可学习零件」: 设计者不再说「这里需要一个边缘检测器」,只说「第一层请自己学出一些有用的局部模式」—— 实验发现学出来的常是边缘、斑点、渐变,恰好和手工设计的那些长得像。

2.4 积木箱:PyTorch 的五种层

原书在棋盘图(12×16 像素、黑白格)上演示五种积木。先记一个背景词: 张量(tensor:多维数组)是 PyTorch 存数据的统一容器——多维数组,并自带在 GPU 上加速计算的能力8; 卷积层里「核(kernel)」和「滤波器(filter)」两个词混用,指同一个东西9

干什么输入→输出(原书演示)
Conv2d 卷积学出来的滤波器滑窗1 通道 12×16 → 2 通道 12×14(核 1×3)
ReLU 激活负数归零数值形状不变,负值清零
MaxPool2d 池化窗口内取最大,降低分辨率高度减半(核 2、步幅 2)
Upsample 上采样复制像素放大回去高度翻倍
Flatten + Linear拍平成向量,接密集层特征图 → 分类输出

池化(又称下采样)的意义有两层:省计算量;更重要的是把「特征在不在附近」从「特征在哪一格」里解放出来—— 窗口取最大后,特征挪一格,响应不变10。取最大的叫最大池化,还有平均池化、L2 范数池化等变体, 各有侧重(平均更平滑、L2 保幅度、取最小适合压背景)11

上采样是池化的逆操作,最朴素的实现就是复制像素。

书里还列了更讲究的做法:最近邻(抄最近的一格)、双线性等。

这类做法统称插值——在相邻格之间取折中12

2.5 走查:标准组装(卷积基 + 密集顶层)

把积木按固定套路叠起来,就是图像网络的标准形态: 卷积基(若干轮「卷积+ReLU+池化」)负责从像素中提取特征, 密集顶层(拍平+全连接+softmax)负责拿特征做决定13。 原书在棋盘图上把尺寸算给你看:1×12×16 进去,两轮卷积(核 3)+ReLU+池化(减半)后, 出来的是 32 通道的 1×2——空间信息压到极限,特征信息涨到 32 维14。 出口的 softmax 依旧把打分归一成「加起来等于 1」的一组数, 原书照例提醒:它们常被当概率读,「但不是传统统计意义的概率」15

3. 四个项目:同一个积木箱的四种用法

原书第 3 章后半是四个自足项目,每个都是「卷积基+某个头」的变体,这里各留一个抓手:

项目任务走查抓手
3A 疟疾血涂片判断血细胞是否被感染dense 基线 0.68 → CNN 0.95:同一数据,换架构涨 27 个百分点;数据 27,558 张细胞图,感染/正常各半16
3B 显微粒子定位从图输出粒子 (x, y)出口不是分类而是两个连续坐标;真值靠人手标,原书点破:没有真值时只能评标注的「一致性」(重复标注差多少),评不了「准确度」17;另一条路是仿真生成带真值的训练图18
3C DeepDream把图变得「更像网络看到的」把训练反过来:权重全冻结,对输入图像做梯度上升,放大目标层学到的模式——云有点像鸟,就把它改得更像鸟19;这需要用 hook 挂在层上偷看中间激活(hook=挂在某层的自定义函数,前向或反向经过时自动执行)20
3D 风格迁移照片的内容 + 油画的笔触内容取自深层(大结构)、风格取自浅层(纹理);风格的数学载体是 Gram 矩阵——某层各特征图两两相关性的矩阵21;优化的对象不是权重而是图像本身,用 L-BFGS 优化器反复微调图片像素22

4. 作者的判断与证据

  • 有证据的:疟疾项目 dense 与 CNN 的对比(0.68 vs 0.95)是同数据换架构的对照实验; DeepDream 和风格迁移的可视化本身就是「网络学到了什么」的证据。
  • 作者的取舍:四个项目全用预训练或自建的卷积网络,没有从头训 ImageNet 级别的模型—— 这是「crash course」定位的直接体现:普通硬件跑得动优先。
  • 历史脉络(原书 seminal 一节):LeNet-5(1998)证明卷积网络可以反向传播训练; AlexNet(2012)引爆革命;VGG(2014)证明小滤波器堆深更划算;Inception(2015)一城多策; ResNet(2016)用残差连接让百层网络可训——梯度消失在架构层的最终解法23

5. 边界与局限

边界说明
卷积只认「平移不变」的结构它假设「左上角的边缘和右下角的边缘是同一种东西」;旋转、缩放不在此列(第 08 章的自监督会用对称性重新处理)
密集顶层仍是参数大户拍平后的向量接全连接,参数量(可调数的总数)在整网里常占大头
输出不是真概率softmax 归一值「不是传统统计意义的概率」(原书原话)15
定位任务的真值瓶颈人标注又贵又不稳(3B);解法是仿真或自监督(第 06、08 章)
DeepDream/风格迁移不产生新信息它们只放大或重组已有激活,是「解释工具」兼「滤镜」,不是生成模型——真正的生成在第 09–12 章

6. 可带走的

  1. 卷积 = 滑窗乘加:滤波器定用途;输出长度 = 输入长 − 滤波器长 + 1;
  2. 深度学习版卷积唯一的改动:滤波器是学出来的权重;
  3. 特征图是滤波器响应的地图;多通道图的滤波器贯穿所有颜色通道;
  4. 标准组装口诀:卷积基提特征,密集顶层做决定;分辨率换特征,一路降一路升;
  5. 池化给平移上的鲁棒(挪一格照样认得),上采样把分辨率还回来(第 07 章的 U 型结构全靠这对搭档);
  6. DeepDream 把训练反过来用:冻权重、对输入做梯度上升——「网络看重什么」的可视化手段;
  7. 风格迁移的配方:深层管内容、浅层管纹理、Gram 矩阵量风格、优化的是图不是网;
  8. 同一数据换架构:dense 0.68 → CNN 0.95,先问「数据的空间结构用上了没有」再谈调参

7. 原文地图

主题原书章原文位置
卷积定义(滑窗乘加)Understanding Convolutionstext/26-fm-understanding-convolutions.txt:3(搜「blending process」)
1D 走查与输出长度Understanding Convolutionstext/26-fm-understanding-convolutions.txt:27(搜「valid complete placements」) · text/26-fm-understanding-convolutions.txt:32(搜「smoothed version of the original signal」)
Sobel 检测阶跃Understanding Convolutionstext/26-fm-understanding-convolutions.txt:38(搜「Sobel filter」)
特征图Understanding Convolutionstext/26-fm-understanding-convolutions.txt:86(搜「feature map」)
多通道滤波器Understanding Convolutionstext/26-fm-understanding-convolutions.txt:100(搜「color channels」)
滤波器是学出来的Understanding Convolutionstext/26-fm-understanding-convolutions.txt:108(搜「learned during training」)
张量定义Implementing Neural Networks in PyTorchtext/27-fm-implementing-neural-networks-in-pytorch.txt:16(搜「multidimensional array used by PyTorch」)
kernel=filterImplementing Neural Networks in PyTorchtext/27-fm-implementing-neural-networks-in-pytorch.txt:61(搜「interchangeably」)
池化与下采样Implementing Neural Networks in PyTorchtext/27-fm-implementing-neural-networks-in-pytorch.txt:126(搜「downsampling」)
池化变体Implementing Neural Networks in PyTorchtext/27-fm-implementing-neural-networks-in-pytorch.txt:140(搜「average pooling」)
上采样复制像素Implementing Neural Networks in PyTorchtext/27-fm-implementing-neural-networks-in-pytorch.txt:156(搜「replaces each pixel by two」)
空间换特征Implementing Neural Networks in PyTorchtext/27-fm-implementing-neural-networks-in-pytorch.txt:201(搜「richness of its feature representation」)
卷积基+密集顶层Implementing Neural Networks in PyTorchtext/27-fm-implementing-neural-networks-in-pytorch.txt:213(搜「convolutional base」)
softmax 非真概率Implementing Neural Networks in PyTorchtext/27-fm-implementing-neural-networks-in-pytorch.txt:225(搜「aren't probabilities」)
疟疾数据 27,558 张Project 3A: Classifying Malaria-Infected Blood Smearstext/28-fm-project-3a-classifying-malaria-infected-blood-sm.txt:7(搜「27,558」)
dense 0.68Project 3A: Classifying Malaria-Infected Blood Smearstext/28-fm-project-3a-classifying-malaria-infected-blood-sm.txt:176(搜「around 0.68」)
CNN 0.95Project 3A: Classifying Malaria-Infected Blood Smearstext/28-fm-project-3a-classifying-malaria-infected-blood-sm.txt:263(搜「around 0.95」)
hook 定义Project 3A: Classifying Malaria-Infected Blood Smearstext/28-fm-project-3a-classifying-malaria-infected-blood-sm.txt:314(搜「Hooks are functions」)
定位与真值精度Project 3B: Localizing Microscopic Particlestext/29-fm-project-3b-localizing-microscopic-particles.txt:254(搜「consistency or repeatability」)
仿真生成训练数据Project 3B: Localizing Microscopic Particlestext/29-fm-project-3b-localizing-microscopic-particles.txt:300(搜「DeepTrack2」)
DeepDream 反转训练Project 3C: Creating DeepDreamstext/30-fm-project-3c-creating-deepdreams.txt:5(搜「flips the neural network training process」)
梯度上升Project 3C: Creating DeepDreamstext/30-fm-project-3c-creating-deepdreams.txt:126(搜「gradient ascent in the input space」)
Gram 矩阵Project 3D: Transferring the Style of Imagestext/31-fm-project-3d-transferring-the-style-of-images.txt:67(搜「Gram matrix represents」)
L-BFGS 优化图像Project 3D: Transferring the Style of Imagestext/31-fm-project-3d-transferring-the-style-of-images.txt:107(搜「Limited-memory」)
卷积网络谱系Seminal Works and Further Readingtext/33-fm-seminal-works-and-further-reading.txt:3(搜「LeNet-5」) · text/33-fm-seminal-works-and-further-reading.txt:11(搜「ResNet」)
定位项目论文依据Seminal Works and Further Readingtext/33-fm-seminal-works-and-further-reading.txt:13(搜「Digital Video Microscopy」)
风格迁移论文依据Seminal Works and Further Readingtext/33-fm-seminal-works-and-further-reading.txt:15(搜「Image Style Transfer」)

Footnotes

  1. 出处:「Understanding Convolutions」第 3-5 段(text/26-fm-understanding-convolutions.txt:3,搜「blending process」)。

  2. 出处:「Understanding Convolutions」第 27 段(text/26-fm-understanding-convolutions.txt:27,搜「valid complete placements」)。

  3. 出处:「Understanding Convolutions」第 32 段(text/26-fm-understanding-convolutions.txt:32,搜「smoothed version of the original signal」)。

  4. 出处:「Understanding Convolutions」第 38 段(text/26-fm-understanding-convolutions.txt:38,搜「Sobel filter」)、第 42-48 段(text/26-fm-understanding-convolutions.txt:42,搜「Prewitt」)。

  5. 出处:「Understanding Convolutions」第 86 段(text/26-fm-understanding-convolutions.txt:86,搜「feature map」)。

  6. 出处:「Understanding Convolutions」第 100 段(text/26-fm-understanding-convolutions.txt:100,搜「color channels」)。

  7. 出处:「Understanding Convolutions」第 108 段(text/26-fm-understanding-convolutions.txt:108,搜「learned during training」)。

  8. 出处:「Implementing Neural Networks in PyTorch」第 16 段(text/27-fm-implementing-neural-networks-in-pytorch.txt:16,搜「multidimensional array used by PyTorch」)。

  9. 出处:「Implementing Neural Networks in PyTorch」第 61 段(text/27-fm-implementing-neural-networks-in-pytorch.txt:61,搜「interchangeably」)。

  10. 出处:「Implementing Neural Networks in PyTorch」第 126 段(text/27-fm-implementing-neural-networks-in-pytorch.txt:126,搜「downsampling」)、第 138 段(text/27-fm-implementing-neural-networks-in-pytorch.txt:138,搜「computational burden」)。

  11. 出处:「Implementing Neural Networks in PyTorch」第 140 段(text/27-fm-implementing-neural-networks-in-pytorch.txt:140,搜「average pooling」)。

  12. 出处:「Implementing Neural Networks in PyTorch」第 156 段(text/27-fm-implementing-neural-networks-in-pytorch.txt:156,搜「replaces each pixel by two」)、第 162 段(text/27-fm-implementing-neural-networks-in-pytorch.txt:162,搜「nearest neighbor upsampling」)。

  13. 出处:「Implementing Neural Networks in PyTorch」第 213 段(text/27-fm-implementing-neural-networks-in-pytorch.txt:213,搜「convolutional base」)。

  14. 出处:「Implementing Neural Networks in PyTorch」第 199-201 段(text/27-fm-implementing-neural-networks-in-pytorch.txt:199,搜「torch.Size」)。

  15. 出处:「Implementing Neural Networks in PyTorch」第 225 段(text/27-fm-implementing-neural-networks-in-pytorch.txt:225,搜「aren't probabilities」)。 2

  16. 出处:「Project 3A: Classifying Malaria-Infected Blood Smears」第 7 段(text/28-fm-project-3a-classifying-malaria-infected-blood-sm.txt:7,搜「27,558」)、第 176 段(text/28-fm-project-3a-classifying-malaria-infected-blood-sm.txt:176,搜「around 0.68」)、第 263 段(text/28-fm-project-3a-classifying-malaria-infected-blood-sm.txt:263,搜「around 0.95」)。

  17. 出处:「Project 3B: Localizing Microscopic Particles」第 254 段(text/29-fm-project-3b-localizing-microscopic-particles.txt:254,搜「consistency or repeatability」)。

  18. 出处:「Project 3B: Localizing Microscopic Particles」第 300 段(text/29-fm-project-3b-localizing-microscopic-particles.txt:300,搜「DeepTrack2」)。

  19. 出处:「Project 3C: Creating DeepDreams」第 5 段(text/30-fm-project-3c-creating-deepdreams.txt:5,搜「flips the neural network training process」)、第 126 段(text/30-fm-project-3c-creating-deepdreams.txt:126,搜「gradient ascent in the input space」)。

  20. 出处:「Project 3A: Classifying Malaria-Infected Blood Smears」第 314 段(text/28-fm-project-3a-classifying-malaria-infected-blood-sm.txt:314,搜「Hooks are functions」)。

  21. 出处:「Project 3D: Transferring the Style of Images」第 67 段(text/31-fm-project-3d-transferring-the-style-of-images.txt:67,搜「Gram matrix represents」)。

  22. 出处:「Project 3D: Transferring the Style of Images」第 107 段(text/31-fm-project-3d-transferring-the-style-of-images.txt:107,搜「Limited-memory」)、第 107 段(text/31-fm-project-3d-transferring-the-style-of-images.txt:107,搜「iteratively tweaking the image tensor」)。

  23. 出处:「Seminal Works and Further Reading」第 3 段(text/33-fm-seminal-works-and-further-reading.txt:3,搜「LeNet-5」)、第 5 段(text/33-fm-seminal-works-and-further-reading.txt:5,搜「AlexNet」)、第 7 段(text/33-fm-seminal-works-and-further-reading.txt:7,搜「VGG」)、第 9 段(text/33-fm-seminal-works-and-further-reading.txt:9,搜「Inception」)、第 11 段(text/33-fm-seminal-works-and-further-reading.txt:11,搜「ResNet」)。