VGG16 漫游:结构与每一层看到的东西
2014 年的经典卷积网络:13 层 3×3 卷积、5 次池化、3 层全连接,1.38 亿参数;结构图按论文的画法一条线摆开,点哪一层,哪一层就摊开露出真实的卷积核和这张照片的特征图
此刻
从左到右一条线,每块板就是一层:板高=这一层的分辨率,板厚=通道数,颜色区分卷积、ReLU、池化、全连接,下方标着每个 block 的通道数卷积池化全连接跳接点任意一块板(或按「下一步」),那一层就摊开,露出它的真实卷积核与这张照片在这一层的特征图
怎么做
- 一块板就是一层板的高度是这一层的分辨率(224 一路缩到 7),厚度是通道数(64 涨到 512),颜色区分卷积、ReLU、池化、全连接。这就是论文里画 VGG16 的那张图
- 点开一层,才看细节摊开后板上方浮出这一层的真实卷积核与这张照片在这一层的特征图;不点的时候结构一条线,看得清整体
- 卷积核是立体的,不是 3×3 的平面每个核是 3×3×输入通道数:第一层 3×3×3(对着红绿蓝),后面是 3×3×512。一个核不管多厚,只产出一张图
- 最后拉直,全连接投票7×7×512 = 25,088 个数拉成一行,乘两层 4096 的矩阵,再乘 1000 列,softmax 变成 1000 类的概率
会骗你
- 参数几乎都在全连接层1.38 亿参数里 1.24 亿在最后三层(89%),卷积只占一成;这也是后来被淘汰的原因之一
- 块的厚度是压过的通道数按对数画,不然 512 通道的块会比 64 通道的长八倍、根本排不下;块上的数字写的是真实通道数
- 画出来的核只是一小撮每层只画激活最强的 12 个核、每个核只画前 8 层;真实数量写在核下面那行小字里
- 特征图是缩小显示的224×224 的图这里缩到 28×28 看,滑窗是示意;每个格子里的数值是真实的
- 它只认识 1000 类图片不属于那 1000 类时它照样给一个答案,把握还可能不低
卷积核找花纹、池化缩小、层层堆叠、最后拉直投票;VGG16 把这一套做到 16 层,结构极其规整,代价是参数太重。
文字版:VGG16 漫游在做什么
VGG16 是 2014 年提出的经典卷积网络,16 层里只用了一种尺寸的卷积核(3×3),结构极其规整。这一页用真实照片走完它的全过程,并且可以把任意一层拆开,看那一层实际输出的特征图长什么样。
画面上正在发生什么
立体视图里,正面是特征图的宽和高,纵深是通道数。跟着播放走一遍你会看到一个清晰的规律:每过一个池化层,宽高减半而通道数翻倍——224×224×3 的输入最后变成 7×7×512。空间分辨率在下降,但「每个位置能表达多少种含义」在上升。
切到平面展开视图,逐层查看真实的特征图。浅层(conv1、conv2)的通道图里能看出边缘、色块、纹理;越往深走越抽象,到了后面几组已经看不出具体形状,只剩下某些区域的强弱响应。最后展平成 25,088 个数,经过三个全连接层给出 1000 类的概率。
什么时候它会骗你
- 最高概率 52.2%,不是「认对了一半」。页面显示的猫这张图预测为埃及猫、最高概率 52.2%。这个数字是 1000 个类别竞争后的相对得分,不是「有 52.2% 的把握」。ImageNet 里有十几种猫,得分被它们分散是正常的。
- 特征图好看,不等于模型可解释。浅层能看出边缘纹理,这容易让人以为看懂了网络在想什么。但深层的响应无法用人类概念对应,而模型的判断主要由深层决定。看特征图是理解结构的手段,不是解释决策的依据。
- VGG16 很重。它有约 1.38 亿个参数,其中绝大部分集中在第一个全连接层(25,088×4,096)。这也是后来的网络改用全局平均池化替代大全连接层的原因。
常见问题
- VGG16 为什么全部用 3×3 的卷积核?
- 两个 3×3 卷积叠起来的感受野等于一个 5×5,三个叠起来等于 7×7,但参数更少、非线性更多(每层之间都有一次激活)。这个「用小核堆深度」的思路是 VGG 最重要的贡献之一。
- 为什么每次池化后通道数要翻倍?
- 池化把宽高各减半,特征图的元素数量降到四分之一。通道数翻倍是为了部分补偿这个信息损失,让网络在空间分辨率下降的同时保有足够的表达能力。
- 现在还有人用 VGG16 吗?
- 直接用于分类任务不多了——ResNet 等更深且更高效的网络在准确率和计算量上都更优。但 VGG 因为结构简单规整,至今仍常被用作特征提取器(如感知损失、风格迁移),也是教学中讲解卷积网络的标准例子。
本页的特征图由 torchvision 预训练 VGG16 对四张固定照片离线实跑导出,每层仅保存 12 个展示通道并做了缩小与 8 位量化;概率为该次实跑结果,播放速度不代表推理耗时。