跳到主要内容

图像为什么不能用全连接

这一章讲三件事: 一张比手机图标还小的图,凭什么会要二百多万个可以拧的数; 参数多除了费显存(显卡上的内存 —— 训练时模型那些数要全部装在里面)还带来哪两个病; 以及三味药 —— 只看一小块、共用一套数、把图缩小 —— 各治什么。 它在全书链条里的位置是第 9 级台阶:前八章搭起来的那张网,一碰图像就炸,这一章换连法。 这一章的主走查是一张 16×16 的手写数字图,参数量从二百多万一路降到几十。 遇到的生词都在当场解释。

1. 顶层全景

第 07—09 章搭起来的东西:全连接网络
每一层的每个神经元,都连到上下层的**全部**神经元

│ 拿它去认一张 16×16 的小图 ——

要调的数:2 269 010 个 ← 书给的,我们核过加得上

├── 病一 参数爆炸:图再大一点、层再深一点,这个数指数级往上翻
├── 病二 结构不灵活:换个尺寸的图就得重搭一个网
└── 病三 极易过拟合:参数多到足以把训练那批数据背下来


三味药(第 3、4、7 节)
① 只看一小块 每个单元只连图上的一小片,不连整张
② 共用同一套数 所有小片用同一组权重
③ 把图缩小 隔一段就把特征图压小一圈


这三味药合起来,就是**卷积神经网络**(CNN)
—— 今天所有认图的模型都是它的后代

图说:三味药是一一对症的,不是三个并列的技巧。
① 和 ② 治参数爆炸,③ 治「看得太窄」(第 7 节会讲这个新问题从哪来)。

「CNN」这个缩写从这里开始会反复出现,现在就把它拆开: Convolutional Neural Networks,卷积神经网络 —— 一类包含卷积计算的神经网络1。 「卷积」是什么,第 5 节从头讲。在讲清楚之前,你只需要记住它是「换了一种连法的网络」。

2. 先把那笔账算出来

这是本章的主走查起点,也是这一章存在的全部理由。

现象先行:这个数大到什么程度

书拿手写数字识别举例。输入是一张 16×16 的图片 —— 比手机上一个应用图标还小, 只有 256 个像素。网络这么搭2:

输入层 256 个神经元 (16 × 16 = 256,一个像素一个)
↓ 全连接
隐藏层① 1000 个神经元
↓ 全连接
隐藏层② 1000 个神经元
↓ 全连接
隐藏层③ 1000 个神经元
↓ 全连接
输出层 10 个神经元 (0—9 十个数字)

「全连接」的意思是字面的:上一层每个神经元都连到下一层每个神经元。 所以两层之间的连线数 = 上层神经元数 × 下层神经元数,每一条连线就是一个要调的数

权重(连线):
256 × 1000 = 256 000
1000 × 1000 = 1 000 000
1000 × 1000 = 1 000 000
1000 × 10 = 10 000
─────────────
2 266 000

偏置(每个神经元一个,输入层不算):
1000 + 1000 + 1000 + 10 = 3 010

合计:2 266 000 + 3 010 = **2 269 010**

图说:这个总数是书给的,我们把加法核了一遍,对得上。
(第 05 章讲过:每条连线上的那个数叫权重,每个神经元自带的那个数叫偏置。)

这个数要有参照物才有量感

光说「二百二十七万」没有意义。给三个对照:

拿什么比
这张图本身有多少个像素256 个 —— 参数量是它的八千八百倍
车上那只摄像头出的图640×480 = 307 200 个像素,是这张 16×16 图的 1200 倍
第 08 章那个手算过的网络10 个参数 —— 你亲手算过它有多累

书自己把话说得很清楚:这仅仅是一个简单网络针对小输入的参数量。 换成 128×128 的图、10 层网络,「就会造成参数量过大,也就是参数爆炸的问题」2

为什么是「爆炸」而不是「变多」: 因为这种连法下, 参数量随着网络规模的增大呈指数级增长 —— 「指数级」的意思很具体:每加宽一层,新增的连线数是「乘」上一层的神经元数,不是「加」上去。

参数多带来的不只是费显存

书列了三个病,参数爆炸只是其中一个3:

具体是什么后果
参数爆炸上面那笔账训练过程更复杂、更耗时,对算力和内存要求极高
结构不灵活网络的形状是照着输入尺寸定死的。换成 64×64 的图做同一件事,只能靠加神经元、加层重搭一个一个网络只服务一种尺寸
极易过拟合参数多到足以把训练那批数据背下来模型泛化能力差;训练数据不足、或者数据里混了噪声(采集时混进来的错误值和无关干扰)时尤其明显

第三个病第 07 章已经讲透了(模型把训练那批数据背下来,换成没见过的数据就掉下去),这里不重讲 —— 但要点明它和参数量的关系:参数越多,背下来越容易。

还有一个病书没写进清单,但它藏在「结构不灵活」里,值得单挑出来: 全连接层吃的是一条线,所以一张图必须先被拉直成 256 个数排成一行。 拉直的一瞬间,「哪两个像素是上下相邻」这件事就永远丢了。 —— 而认图恰恰全靠这个。(这一句是我们的补充,书只说了「结构不够灵活」。)

3. 药一:每个单元只看一小块

这是本章第一个承重点。

现象先行:认一只猫要看整张图吗

书给的直觉非常好懂:一张图里很大一部分区域是无用或者用处很小的, 真正要关注的只是包含关键特征的那几块 —— 「通过猫鼻子这一块区域就能识别出图片中是猫」4

既然如此,为什么要让每个神经元都连到全部像素?

做法:只连一小片

书拿一张 640×480 的输入图算了第二笔账4:

全连接: 一个神经元连到全部像素
要更新的参数 = 640 × 480 = **307 200 个**

只连一小块:每次只取 16×16 的一小片
要更新的参数 = 16 × 16 = **256 个**

降幅:307 200 → 256,**降到原来的一千二百分之一**

图说:这两个数都是书给的。注意它算的是**一个神经元**的账,
整层有多少个神经元还没算进去 —— 那笔账要靠第 4 节的药二来收。

这一小片有个名字:感受野

这个词是本章的第一个承重词,而且它会一直用到第 15 章。

书给的定义是:特征图上的像素点,映射回输入图像上的对应区域4

拆开讲:

输入图(16×16) 特征图
┌─────────────────┐ ┌────────────┐
│ ▓▓▓ │ │ ● │
│ ▓▓▓ ← 这一小块 │ ──算出──▶ │ ↑ │
│ ▓▓▓ │ │ 就是这一个点 │
│ │ │ │
└─────────────────┘ └────────────┘

特征图上那一个点 ● 的**感受野**,就是左边那块 ▓▓▓ 覆盖的 3×3 区域
—— 它只看得见这么多,别的地方发生什么它一无所知。

图说:「特征图」也是本节的新词,就地解释:
一层算完之后吐出来的那张表,每个位置上的数表示「这个位置上那种特征有多强」。
它和输入图一样是个二维数组,只是上面写的不再是亮度,而是强度。

为什么这个词要紧: 因为感受野的大小决定了这一层「看得见多大范围」。 第 7 节那个新问题、第 11 章 VGG 那个「三个小核顶一个大核」的论证、 第 15 章那些「浅层管小目标、深层管大目标」的设计,全部建立在这个词上。

对全连接网络来说,每个神经元的感受野就是整张图4 —— 一上来就看全, 所以它从来不缺视野,缺的是参数。卷积反过来:参数省下来了,视野得慢慢挣。

4. 药二:所有小块共用同一套数

现象先行:药一还没治完

一个神经元只连 256 个像素,可整层有很多个神经元啊。 640×480 的图上,一小块一小块地铺过去要铺一千二百块 —— 参数不是又回来了吗?

做法:把它们的权重设成一模一样

书给的正是这一手:每个神经元连的区域各不相同, 但如果把每个神经元的权重参数都设置成一样,就可以「用尽可能少的参数覆盖尽可能多的图像区域」5

❌ 不共用:
神经元 1 看左上角那块 → 自己的一套 16×16 权重
神经元 2 看它右边那块 → 另一套 16×16 权重
…一千二百个神经元 → 一千二百套权重

✅ 共用:
一千二百个神经元,**用的是同一套 16×16 权重**
⇒ 整层只有 256 个参数,和只有一个神经元时一样

图说:所以这一层可以换个更省事的想法 ——
不是一千二百个神经元各看一块,而是**一个神经元带着它那套权重,
从左到右、从上到下在图上滚一遍**,每滚到一处算一个数。
书就是这么描述的:「只有一个神经元从上到下、从左到右在输入图像上进行滚动」。

书给了这一手最小的一笔账6:

摆法参数
3×3 的输入配一个 2×2 的滑块4 个
同样规模的全连接(9 个输入、4 个神经元)36 个

4 比 36,降到九分之一 —— 而这还只是 3×3 这么小的输入。

这一手为什么讲得通(不只是省事)

共用权重等于在说一句话:「同一个特征,出现在图的哪个角落都算数。」

一条竖着的亮暗交界,在左上角是交界,在右下角还是交界。 既然判断标准一样,凭什么给它们两套不同的权重? —— 这就是共用的理由,不是妥协,是对图像这件事的一个正确假设。 (这一段的理由是我们补的;书给的是做法和账,没给这层解释。)

5. 这两味药合起来,就是卷积

上面那个「带着一套权重在图上滚一遍」的动作,正式名字叫卷积。 书的原话是:卷积操作就是为了实现局部连接和权值共享7

那套滚动的权重叫卷积核

书给了它的两个名字,都要留住 —— 你出门在任何一份文档、任何一个报错里都会撞见:

卷积核(kernel)也叫滤波器(filter); 假设它的宽和高分别是 w 和 h,就称为 w×h 卷积8

所以「3×3 卷积」这个说法的意思只是:滚动的那个小方块是 3 行 3 列。

一次卷积具体在算什么

书说得很准确:先按对应位置各元素相乘,再累加8

拿一个具体的算给你看(这一组数是我们为演示编的,书里的图不在清洗文本里):

输入图上的这一小片(数字是亮度,0 黑 255 白):
10 10 10 ← 左边暗
10 200 200 ← 右边亮
10 200 200

卷积核(这一组权重是我们挑的,专挑「左暗右亮」的竖直交界):
−1 0 1
−1 0 1
−1 0 1

对应位置相乘再全部加起来:
第一行:(−1×10) + (0×10) + (1×10) = −10 + 0 + 10 = 0
第二行:(−1×10) + (0×200) + (1×200) = −10 + 0 + 200 = 190
第三行:(−1×10) + (0×200) + (1×200) = −10 + 0 + 200 = 190
───────────────────
输出这一格的值 = **380**

换一片没有交界的地方(整片都是 10):
每一行都是 −10 + 0 + 10 = 0 ⇒ 输出这一格的值 = **0**

图说:同一个卷积核,在有竖直交界的地方吐出 380,在平坦的地方吐出 0。
**这就是「一个卷积核提取一种特征」的字面意思** ——
这个核提的特征就叫「这里有没有一条左暗右亮的竖边」。

一个术语上的诚实交代

书特意点了一句:卷积层实现的方式,实际上是数学中定义的「互相关」运算, 而不是数学意义上严格的卷积9

这件事对读者的实际影响:零。 所有框架里的「卷积层」做的都是上面那个动作。 但知道这一点有用 —— 你看数学教材时会发现两者差一个翻转,那不是你理解错了。

输出图有多大:一条能自己核的公式

书给了尺寸公式10:

输出边长 = (输入边长 − 核边长 + 2 × 填充) ÷ 步长 + 1

三个词就地解释:
核边长 —— 滑块几行几列
步长 —— 每次滑几格(书里写 stride)
填充 —— 先在图四周补几圈 0 再开始滑(书里写 padding)

书给的例子,当场核一遍:
6×6 的输入,3×3 的核,步长 1,不填充
(6 − 3 + 0) ÷ 1 + 1 = 4 ⇒ 输出 **4×4** ✓ 和书给的一致

我们主走查那张图:
16×16 的输入,3×3 的核,步长 1,不填充
(16 − 3 + 0) ÷ 1 + 1 = 14 ⇒ 输出 **14×14**

「填充」这个旋钮为什么存在,第 13 章会给一个非常具体的理由 —— 那里会算出:不填充的话,图边缘的像素最少只被卷过 1 次,而中心的像素被卷到 9 次

6. 一个核不够:多核与多通道

这是本章第二个承重点,而且它是书自己提出问题、自己回答的一处。

书自己提的那个问题

书在算完「4 个参数 vs 36 个参数」之后,没有顺势夸奖卷积,反而自己泼了盆冷水11:

参数量越大代表模型越复杂,能模拟的函数就越多,就越接近真实; 而卷积把参数量降下来了,这也意味着整个模型所能模拟的函数空间也相应变小了那怎样才能使得卷积网络的模型不会过于简洁、以致无法完全模拟真实函数模型呢?

这个自问自答值得学。 它承认了省参数是有代价的,而不是只讲好处。

答案一:一个核只提一种特征,那就多放几个核

回想第 5 节那个例子:那个核只认「左暗右亮的竖边」。 横边呢?斜边呢?一小块亮斑呢?它一概不认。

所以做法很直白 —— 并排放很多个核,每个核学自己那一种特征。这叫多核卷积。12

同一片输入 ──┬──▶ 核 A(认竖边) ──▶ 特征图 A
├──▶ 核 B(认横边) ──▶ 特征图 B
├──▶ 核 C(认亮斑) ──▶ 特征图 C
└──▶ …

参数账:每个核 3×3 = 9 个权重 + 1 个偏置 = 10 个
6 个核 ⇒ 60 个参数,得到 6 张特征图
(3×3 核、6 个核、每核带一个偏置,这几个数是我们为演示定的;
书用的例子是「3 个 2×2 的核,共 4×3 = 12 个参数」。)

图说:核的个数决定了这一层能同时认出几种特征。
这就是为什么后面看到的模型层层都写着「32 个核」「64 个核」「128 个核」。

答案二:输入本来就有好几层,核也跟着分层

第 04 章讲过:一张彩色图是三张同尺寸的表格叠起来(红、绿、蓝各一张)。 这三张就叫三个通道

那么卷积核怎么办?书的答案是:核也做成三层的13

输入:3 个通道,每个 3×3
核: 3 个 2×2 的二维核摞成一摞 —— 书叫它「卷积核立方体」

算法:每个通道的核各自和对应通道卷一遍
⇒ 得到 3 张中间结果
⇒ **把这 3 张对应位置相加,合成一张输出特征图**

⚠ 关键在最后那个「相加」:
进去是 3 个通道,**出来只有 1 张特征图**,不是 3 张。
一个卷积核立方体,不管输入有几个通道,**永远只吐出一张特征图**。

图说:所以「输出有几张特征图」只取决于**你放了几个核立方体**,
和输入有几个通道无关。这是初学最容易绕晕的一处。

实际用的是两者合在一起 —— 书叫它多通道多核卷积14: 输入是多通道(彩色图或上一层吐出的一摞特征图),核有很多个, 每个核都是一个立方体,每个立方体吐一张特征图。

书在这里有一处数对不上

判断(我们的,不是书里的): 书讲多核卷积时说,3×3 的输入配 3 个 2×2 的核、步长 1, 得到「3 个……大小为 4×4 的特征图」12;而下一段讲多通道时, 同一批特征图又被说成「3 个 3×3 的特征图」13两处对不上,而且都和书自己给的尺寸公式对不上 —— 按 (3 − 2 + 0) ÷ 1 + 1 = 2,应该是 2×2; 书上一段刚说过同规模的全连接是「9 个输入、4 个神经元」, 4 个神经元正对应 2×2 那 4 个输出值,也印证了这一点。 这是印刷或校对的问题,不影响「多核卷积」这个机制本身 —— 参数账 4×3 = 12 是对的。 如果错,会错在: 如果书那两处指的其实是配了填充之后的尺寸(比如 padding=1), 那 4×4 就成立了 —— 但书在这一段全程没提填充,而且两处自己也不一致。

7. 药三:把图缩小

现象先行:一个新问题,是卷积自己带来的

药一让每个单元只看一小块 —— 代价现在要还了。

书讲得很形象:卷积核一般就 3×3 或者 5×5,这么卷下去,网络能处理到的范围仍旧有限。 要认出一辆车,而**「假设只采到了一个轮胎的范围,那么怎么可能只通过这个轮胎来识别出整辆车」**15

说白了:感受野太小,看到的是零件,不是整体。 于是需要把感受野撑大。

做法:池化 —— 隔一段就把图压小一圈

书给的定义是:池化层又叫下采样层,目的是压缩数据、降低数据维度16「下采样」这个词就是字面意思:原来每个格子都取,现在隔几个才取一个,于是图就小了。 形象地说,下采样就是把图像缩小;而缩小之后并不影响图像中物体的识别17

两种压法18:

压法做什么留下的是什么
最大池化(max pooling)一小块里只留最大的那个数最突出、最显著的特征保留下来
平均池化(average pooling)一小块里取平均对相邻特征之间的差别做模糊处理

为什么缩小就能撑大感受野:书给了一笔具体的账

书拿一张 4×4 的特征图走了一遍19:

卷积之后的特征图:4×4
这张图上一个格子,对应输入图上一个 **3×3** 的区域 ← 它的感受野

做 2×2 的池化:
4×4 ──▶ 2×2
新图左上角那个格子(书里的例子是 40),
代表的是原特征图左上角的**四个**格子

那它对应输入图上多大?
原来四个格子各自看 3×3,但它们互相错开一格、有重叠,
合起来正好覆盖一个 **4×4** 的区域

⇒ 一个格子的感受野从 **3×3 涨到 4×4** ← 书给的数

图说:注意池化没有引入任何新参数,它只是把已有的信息压紧。
**同样大小的特征图,却能表示更多的信息** —— 这是书给的原话。

把最大池化用主走查那组数走一遍(这组数是我们编的):

特征图上的一个 2×2 小块:
380 120
25 40

最大池化 ⇒ 留 380 (那条竖边的信号被保住了)
平均池化 ⇒ 留 141.25 (380+120+25+40 = 565,除以 4)

图说:这就是两种池化的性格差别 ——
最大池化保住峰值、丢掉其余;平均池化谁都留一点、峰值被摊平。

缩小还有第二种做法,书给了一条有信息量的判断

除了池化,把卷积的步长设成大于 1 也能缩小图(每次多滑一格,输出自然就小了)17书对这两条路的比较很有价值:

池化提供的是一种固定的、不可学习的非线性变换,可以看作一种先验运算; 而这种变换也可以靠一定深度的卷积来实现。 所以网络比较浅的时候,用池化可能更好;网络比较深的时候, 用多层卷积来替代池化可能更好 —— 因为卷积能学到比池化更好的变换17

「先验」这个词就地解释:不用看数据就事先定死的规矩。 「一小块里只留最大的」就是这么一条规矩 —— 它对任何数据都一样,永远不会被学习改变。 卷积不一样,它那套权重是学出来的。

「非线性」第 07 章讲过(掰弯,否则一百层等于一层),这里不重讲。

8. 最后一段:特征图怎么变成答案

卷积和池化只负责把特征提出来,不负责下结论。

书说得很直接:做完卷积和池化之后一般还会接一个全连接层, 它的作用是把二维的特征图「拉伸转化为一个一维向量」, 再送进最后一层拿结果 —— 分类用 Softmax,回归用 tanh20

卷积 / 池化(提特征) → 拉平成一条线 → 全连接(下结论) → Softmax 或 tanh

图说:所以全连接并没有被赶走,它只是被挪到了最后一小段 ——
到这里图已经被压得很小了,拉平之后的那条线也就不长了,参数爆炸的问题自然不在。
**卷积网络不是「不用全连接」,是「不在一开始用全连接」。**

「tanh」这个名字在这里第一次出现,只需要记住一件事: 它把任何一个数压到 −1 和 1 之间。 第 13 章那个巡航模型的最后一层就是它 —— 因为转角的标签本来就是 −1 到 1 的小数。

9. 主走查:一张 16×16 的手写数字图

这是本章的主走查。上面每味药在它上面各占一步。

━━ 起点:一张 16×16 的手写数字图(256 个像素) ━━━━━━━━━━━━━━━━━

① 用第 07 章那种全连接网(三个千神经元隐藏层)
参数 = **2 269 010 个** ← 书给的,加法我们核过
⇒ 256 个像素,二百二十七万个要调的数。**炸了。**

② 药一:每个单元只看 3×3 的一小片
一个单元的参数 = 3 × 3 = **9 个**
它的**感受野**就是那 3×3 的区域,别的地方它看不见
(书用的是 640×480 的图配 16×16 的片:307 200 → 256。
这里的 3×3 是我们为了让这张小图讲得通而换的尺寸,
下面每一步都一直用它,不再换。)

③ 药二:所有小片共用同一套权重
整层不管铺多少个单元,**还是那 9 个参数**
⇒ 等价的说法:一个 3×3 的滑块在图上滚一遍
(书给的同规模最小账:3×3 输入配 2×2 滑块 = **4 个** vs 全连接 **36 个**)

④ 真的滚一遍(就是 ②③ 那个 3×3 的滑块,步长 1,不填充)
输出边长 = (16 − 3 + 0) ÷ 1 + 1 = **14** ⇒ 特征图 **14×14**

滚到「左暗右亮」那一处,算出的值 = **380**
滚到平坦处,算出的值 = **0**
(这两个数是第 5 节那组我们编的演示数据算出来的)

⑤ 一个核不够,放 6 个
参数 = 6 × (3×3 + 1 个偏置) = **60 个**
输出 = **6 张 14×14 的特征图**

⑥ 药三:2×2 最大池化
14×14 ──▶ **7×7**
那个 2×2 小块 [380, 120 / 25, 40] ⇒ 留下 **380**
一个格子的感受野被撑大(书那笔账:3×3 → 4×4)

⑦ 拉平 + 全连接 + Softmax
6 张 7×7 拉平 = 6 × 49 = **294 个数**
接一个 10 个神经元的全连接层 = 294 × 10 + 10 = **2 950 个参数**
过 Softmax ⇒ 十个加起来等于 1 的可能性,最大的那个就是答案

━━ 全程参数账 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

全连接: 2 269 010 个
卷积版: 60 + 2 950 = **3 010 个**
降幅: **降到原来的七百五十四分之一**

⇒ **同一张图,同一个任务,参数从二百多万降到三千。这条降幅本身就是这一章的论点。**

这条走查里的数,哪些是书给的、哪些是我们算的:

书给的我们按书给的公式算的(像素值是为演示编的)
全连接那笔 2 269 0103×3 的小片、6 个核
307 200 → 256(书自己的 640×480 配 16×16)特征图 14×14、池化后 7×7
4 vs 36(书自己的 3×3 输入配 2×2)交界处 380、平坦处 0
6×6 配 3×3 核得 4×4 的尺寸例子六个核 60 个参数、全连接层 2 950
感受野从 3×3 涨到 4×4合计 3 010,以及那个降幅

书那两笔账用的是它自己的尺寸,我们只拿来当对照 —— 走查本身从头到尾用的是同一个 3×3,没有中途换过。

10. 这一章的落地项目:斑马线二分类

书这一章的收尾是一个二分类任务:含斑马线的马路 vs 不含斑马线的马路21

这是第 09 章那五步固定动作的第二次填空,书给的流程是: 数据处理 → 模型设计 → 训练配置 → 训练过程 → 模型保存22

和第 09 章那个车辆三分类比,只换了两处:

车辆三分类(第 09 章)斑马线二分类(本章)
网络全连接卷积网络
输出层3 个神经元2 个神经元
其余四步——一模一样

这就是「五步固定动作」的价值:换个任务,你只需要想清楚这两格填什么。

这个项目同样一行代码都没有,书只给了一个在线项目链接23

11. 作者的判断与证据

说法是哪一类
2 269 010 这笔账有证据,而且我们核过加得上 —— 这是书里最有说服力的一处
307 200 → 256、4 vs 36有证据,两笔都能自己核
全连接的三个病有证据(推理清楚);第四个病(拉平之后丢掉像素的位置关系)是我们补的
「通过猫鼻子这一块区域就能识别出图片中是猫」作者给的直觉,不是实验结论。 方向对,但它是个说法,不是证据
感受野的定义、卷积是互相关、尺寸公式教科书式的共识,书的表述准确
多核卷积那两处对不上的尺寸书内错误(我们的判定,见第 6 节判断块)
「网络浅用池化更好,网络深用带步长的卷积可能更好」作者的判断,给了理由(池化是不可学习的先验)但没给实验。 这个方向与后来的实践大致一致,但不是定论
权值共享讲得通的理由(同一个特征换个位置还是同一个特征)不在书里。 书给了做法和账,没给这层解释,是我们补的
那个卷积核算出 380 和 0 的例子不在书里。 书的图不在清洗文本里,这组数是我们为演示编的

12. 边界与局限

  • 这一章对应原书 §9.1—9.2 与 §9.4。 §9.3 那五个经典模型单独成章(我们的第 11 章), 因为合在一起会有十个小节,读者找不着北。
  • 书没有讲卷积层的反向传播怎么走。 第 08 章那套是对全连接讲的; 卷积层的梯度怎么回传(共用的权重要把所有位置的梯度加起来),书一个字没提。
  • 书没有讲批归一化(Batch Normalization)。 它在第 11 章讲 VGG 之后的模型时被顺口提到, 但从来没有解释过是什么。在今天的卷积网络里这是标配。(补充:不在书里,来自通用知识。)
  • 书没有讲「一个核只提一种特征」是怎么做到的。 它说了这句话, 但没有说那套权重是出来的 —— 第 5 节那个「认竖边」的核是我们手工挑的, 真实的核长什么样是训练的产物,书没有展示过任何一个学出来的核
  • 池化那笔感受野的账,书只走了一层。 卷很多层之后感受野怎么累加,书没有给公式。
  • 那两处对不上的特征图尺寸(第 6 节)。 我们按书自己的公式判定它应为 2×2。
  • 斑马线项目一行代码都没有。 全书的代码、公式、表格都是图片。

13. 可带走的

全章主走查一行写完:

一张 16×16 的手写数字图 → 全连接要 2 269 010 个参数(炸了)→ 只看 3×3 的一小片:9 个 → 所有小片共用这一套:整层还是 9 个 → 让这个 3×3 滚一遍,输出 14×14(交界处 380、平坦处 0)→ 放 6 个核:60 个参数,6 张 14×14 → 2×2 最大池化:7×7(那块留下 380)→ 拉平成 294 个数 → 全连接 + Softmax(2 950 个参数)→ 十个可能性。

合计 3 010 个参数,是全连接那版的七百五十四分之一。

  1. 「参数爆炸」不是形容词,是一笔加法 —— 16×16 的图接三层网络 = 2 269 010 个参数, 是它自己像素数的八千八百倍;
  2. 参数多带来三个病: 爆炸、结构不灵活(换个尺寸得重搭)、极易过拟合; 外加一个书没写的 —— 拉平的一瞬间,像素的上下左右关系就丢了;
  3. 药一:每个单元只看一小块。 它看得见的那块区域叫感受野, 这个词一直用到第 15 章;
  4. 药二:所有小块共用同一套权重。 等价的说法是「一个滑块在图上滚一遍」。 讲得通是因为同一个特征换个位置还是同一个特征;
  5. 药一 + 药二 = 卷积。 那套滚动的权重叫卷积核,也叫滤波器; 一次卷积就是「对应位置相乘再全部加起来」;
  6. 输出边长 =(输入 − 核 + 2×填充)÷ 步长 + 1 —— 这条公式你自己核得动;
  7. 一个卷积核只提一种特征 —— 所以要并排放很多个(多核); 输入有几个通道,核就有几层,但一个核立方体永远只吐一张特征图(多通道);
  8. 药三:把图缩小(池化)。 它治的是药一带来的新病 —— 感受野太小,看到的是轮胎不是整辆车;
  9. 最大池化保峰值,平均池化摊平峰值;池化不带任何参数;
  10. 缩小还有第二条路(步长大于 1 的卷积)。 书的判断: 浅网络用池化,深网络用带步长的卷积可能更好 —— 因为卷积那套是学出来的,池化是定死的;
  11. 卷积网络不是不用全连接,是不在一开始用 —— 图被压小之后再拉平,那条线就不长了。

14. 原文地图

主题原书章原文位置
CNN 的定义:包含卷积计算、有深度结构第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:35(搜「包含卷积计算并且具有深度结构」)
全连接的三个病;2 269 010 那笔账;「参数爆炸」第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:19(搜「结构不够灵活」) · text/10-ch09.txt:23(搜「总计2269010个参数」) · text/10-ch09.txt:25(搜「极其容易过拟合」)
三大特点;感受野的定义;猫鼻子;307 200 → 256第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:41(搜「通过猫鼻子这一块区域」) · text/10-ch09.txt:41(搜「只有256个了」)
权值共享:「尽可能少的参数覆盖尽可能多的图像区域」第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:45(搜「尽可能少的参数覆盖尽可能多的图像区域」)
下采样两种做法;池化 vs 步长卷积的判断第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:49(搜「使用多层卷积来替代池化进行下采样效果可能会更好」)
卷积就是为了实现局部连接和权值共享;滚动的说法第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:55(搜「就是为了实现上节中所提到的局部连接和权值共享」) · text/10-ch09.txt:59(搜「从上到下、从左到右在输入图像上进行滚动」)
卷积核也叫滤波器;先相乘再累加;互相关第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:67(搜「卷积核(kernel)也叫滤波器」) · text/10-ch09.txt:63(搜「互相关」)
尺寸公式;6×6 配 3×3 核得 4×4第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:69(搜「得到一张4×4大小的特征图层」) · text/10-ch09.txt:71(搜「p为填充大小」)
4 个参数 vs 36 个参数;书自己提的那个问题第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:79(搜「则需要更新36个参数」) · text/10-ch09.txt:79(搜「所能模拟的函数空间也相应变小」)
多核卷积(那两处对不上的尺寸)第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:81(搜「多核卷积」) · text/10-ch09.txt:83(搜「4×3=12个参数」)
多通道卷积;卷积核立方体;结果累加第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:87(搜「卷积核立方体」) · text/10-ch09.txt:95(搜「多通道多核卷积」)
轮胎认不出整辆车;池化的目的第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:101(搜「怎么可能只通过这个轮胎来识别出整辆车」) · text/10-ch09.txt:103(搜「目的是压缩数据」)
两种池化的语义;那笔感受野的账(3×3 → 4×4)第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:105(搜「最突出、最显著的特征保留下来」) · text/10-ch09.txt:109(搜「由原来的3×3增大至4×4」)
全连接层在 CNN 里的角色:拉平成一维向量第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:111(搜「拉伸转化为一个一维向量」)
斑马线二分类项目;五步流程;不附代码第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:244(搜「包含斑马线的马路和不包含斑马线的马路」) · text/10-ch09.txt:248(搜「数据处理、模型设计、训练配置」) · text/10-ch09.txt:250(搜「本节不附项目代码」)

Footnotes

  1. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 35 段(text/10-ch09.txt:35,搜「包含卷积计算并且具有深度结构」)。原文还说它「常用于处理计算机视觉和图像处理任务」,并点了卷积核参数共享与层间连接稀疏这两个特性。

  2. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 23 段(text/10-ch09.txt:23,搜「总计2269010个参数」;同段搜「参数爆炸」)。清洗文本里 10³ 被写成 103(上标丢失),这是转码问题不是数据错;总数 2269010 是书给的,加法我们核过对得上。 2

  3. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 19 段(text/10-ch09.txt:19,搜「结构不够灵活」)与第 25 段(text/10-ch09.txt:25,搜「极其容易过拟合」)。「拉平之后丢掉像素的位置关系」这一条书没有单列,是我们从「结构不够灵活」里拆出来补的。

  4. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 41 段(text/10-ch09.txt:41,搜「通过猫鼻子这一块区域」;同段搜「只有256个了」)。感受野的定义原文是:神经网络中每一层输出特征图上的像素点映射回输入图像上的对应区域。 2 3 4

  5. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 45 段(text/10-ch09.txt:45,搜「尽可能少的参数覆盖尽可能多的图像区域」)。

  6. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 79 段(text/10-ch09.txt:79,搜「则需要更新36个参数」)。原文的设定是:3×3 的输入特征图、2×2 的卷积核、4 个权重参数;换成全连接则是 9 个输入信号、4 个神经元。

  7. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 55 段(text/10-ch09.txt:55,搜「就是为了实现上节中所提到的局部连接和权值共享」)与第 59 段(text/10-ch09.txt:59,搜「从上到下、从左到右在输入图像上进行滚动」)。

  8. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 67 段(text/10-ch09.txt:67,搜「卷积核(kernel)也叫滤波器」)。原文:计算时先取与卷积核对应大小的区域,与卷积核按照对应位置各元素先相乘再累加。第 5 节那组像素值与那个卷积核是我们为演示编的,书的图不在清洗文本里。 2

  9. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 63 段(text/10-ch09.txt:63,搜「互相关」)。原文:卷积神经网络中卷积层的实现方式实际上是数学中定义的互相关(cross-correlation)运算。

  10. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 69 段(text/10-ch09.txt:69,搜「得到一张4×4大小的特征图层」)与第 71 段(text/10-ch09.txt:71,搜「p为填充大小」)。公式本体在书里是图片,五个符号的说明在正文里:c 输出、r 输入、k 核、p 填充、s 步长。

  11. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 79 段(text/10-ch09.txt:79,搜「所能模拟的函数空间也相应变小」)。

  12. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 81 段(text/10-ch09.txt:81,搜「多核卷积」)与第 83 段(text/10-ch09.txt:83,搜「4×3=12个参数」)。第 83 段把输出说成「大小为4×4的特征图」,与书自己的尺寸公式对不上,见第 6 节的判断块。 2

  13. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 87 段(text/10-ch09.txt:87,搜「卷积核立方体」)。同段把上一段那批特征图说成「3 个 3×3 的特征图」,与第 83 段的「4×4」对不上。原文的算法是:每个通道的卷积核分别与对应通道特征图卷积,最后把多个通道的结果累加成一张输出特征图。 2

  14. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 95 段(text/10-ch09.txt:95,搜「多通道多核卷积」)。原文的理由:输入图像一般是多通道(RGB 或 HSV),而一张图不可能只有一个特征,所以两者常常共同进行。

  15. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 101 段(text/10-ch09.txt:101,搜「怎么可能只通过这个轮胎来识别出整辆车」)。

  16. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 103 段(text/10-ch09.txt:103,搜「目的是压缩数据」)。

  17. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 49 段(text/10-ch09.txt:49,搜「使用多层卷积来替代池化进行下采样效果可能会更好」)。同段给了下采样的两种做法(步长大于 1 的池化、步长大于 1 的卷积),以及「池化提供的是固定的、不可学习的非线性变换,可以看作是一种先验运算」。「先验」这个词的解释是我们补的通用知识。 2 3

  18. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 105 段(text/10-ch09.txt:105,搜「最突出、最显著的特征保留下来」)。

  19. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 105 段(text/10-ch09.txt:105,搜「左上角40这个值」)与第 109 段(text/10-ch09.txt:109,搜「由原来的3×3增大至4×4」)。第 109 段还说:同样大小的特征图却能表示更多的信息。第 7 节末尾那组 [380, 120, 25, 40] 是我们编的演示数据。

  20. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 111 段(text/10-ch09.txt:111,搜「拉伸转化为一个一维向量」)。原文说再输入到最后诸如 Softmax 或 tanh 等激励层获得结果。

  21. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 244 段(text/10-ch09.txt:244,搜「包含斑马线的马路和不包含斑马线的马路」)。

  22. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 248 段(text/10-ch09.txt:248,搜「数据处理、模型设计、训练配置」)。

  23. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 250 段(text/10-ch09.txt:250,搜「本节不附项目代码」)。在线项目地址在第 254 段。