想象你是一座城市的首席规划师。20 世纪 90 年代,AI 想识别手写数字,但它只会一种笨办法——把整张图片的每个像素都拿去做“全城广播”,计算量惊人,准确率却很差。这时,一位叫 Yann LeCun 的建筑师站了出来,他用“小窗扫图”的卷积和“压缩地图”的池化,盖出了第一座真正的识别小镇:LeNet。二十年后,另一支建筑队把小镇扩建成了超级城市:AlexNet。他们装上了快速电梯 ReLU、逃生梯 Dropout,还通了 GPU 高铁,瞬间让深度学习在全世界的聚光灯下引爆。这篇文章,就是带你重游这两座地标建筑,看清经典 CNN 的图纸。

岗位关联

理解 LeNet 与 AlexNet,等于拿到 CNN 设计的第一版施工图;无论未来研究 Transformer 还是 Stable Diffusion,这份“空间归纳偏置”的直觉都是你的职业底座。

目录
  1. 可视化演示
  2. 时代背景
  3. LeNet结构
  4. 卷积与池化
  5. AlexNet创新
  6. ReLU与Dropout
  7. GPU训练与历史影响
  8. 后世启发
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示LeNet与AlexNet经的核心机制,通过入门/进阶/实战/优化四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

LeNet与AlexNet经:LeNe LeNet与卷积网络范式确立 LeNet架构细节与设计思想 核心机制可视化 LeNet与AlexNet经整体架构与关键组件

时代背景

在 LeNet 出现之前,AI 想识别一张 32×32 的手写数字图,最直接的办法是把 1024 个灰度值全部送给全连接网络。这在我们的城市规划故事里,相当于市长要求全城每个人都跑到市中心核对一遍“你是不是数字 7”。图像稍微大一点,参数就像人口爆炸一样失控。

Yann LeCun 没有继续堆“全城广播”,而是从生物视觉里借来灵感:人眼看东西时,一开始只关注局部边缘,而不是盯着每个像素。于是 LeCun 设计了“街区巡逻”机制——用一个固定大小的窗口在图像上滑动,每次只看一小块区域,这就是卷积。再配合“小区合并”的池化,把地图逐渐缩小。

这个阶段对应思维导图里“时代背景”的三个节点:手写识别需求催生了实用场景,算力限制逼着人们减少参数,LeCun 的卷积动机则奠定了 CNN 的核心假设——相邻像素才有意义,距离远的像素不必强行直接关联。旧工地虽然简陋,但地基已经画好了。

LeNet结构

LeNet-5 是 1998 年交付的第一份完整“城镇蓝图”。整座城市有五层可训练建筑:两层卷积、两层池化、三层全连接。输入是一张 32×32 的灰度图,相当于城市入口的大广场;之后每经过一次卷积,地图边长变小,通道数变多;每经过一次池化,地图面积减半,信息更加浓缩。

卷积层的输出尺寸由下面这个公式决定:

按这张图纸,LeNet-5 的 C1 层用 6 个 5×5 卷积核,把 32×32 变成 28×28;S2 层做 2×2 池化,变成 14×14;C3 层用 16 个卷积核变成 10×10;S4 层再池化成 5×5;最后由 C5、F6 和输出层完成分类。今天几乎所有 CNN 都能在这张图纸上找到影子。

O=W−K+2PS+1\displaystyle O = \frac{W - K + 2P}{S} + 1
这个公式像城市规划里的“容积率”:输入边长 W 减去卷积核 K,补上填充 P,再除以步长 S,最后加一,就是输出地图的边长。
  1. 输入边长 W代表输入特征图的宽度或高度,比如 32×32 图像中的 32。
    WW
  2. 减去卷积核 K卷积窗口在边上滑过时会吞掉一部分边界,W−K 表示可滑动的总距离。
    W−KW - K
  3. 加上填充 2P如果我们在图像四周补一圈 0,相当于给城市扩建了一圈缓冲区,所以恢复部分边界。
    W−K+2PW - K + 2P
  4. 除以步长 S步长是巡逻队每次跨几步;步长越大,输出越小。
    W−K+2PS\frac{W - K + 2P}{S}
  5. 最后加一从起点开始数格子,间隔数为总距离除以步长,格子数要比间隔数多一个。
    O=W−K+2PS+1O = \frac{W - K + 2P}{S} + 1

卷积与池化

卷积层是这座小城的“街道巡逻队”。巡逻队带着一张固定大小的权重表,也就是卷积核,在图像上从左到右、从上到下扫描。每次扫到一块区域,就把区域里的像素和权重做加权求和,得到一个新数值,记录到输出特征图上。这个操作就是卷积。

为什么这套设计高效?因为它有两个关键机制:局部感受野让每个神经元只关心相邻区域;权值共享让同一个卷积核在所有位置复用。你可以理解为“同一支巡逻队用同一套标准巡逻全城”,参数从全连接的百万级降到几千级。池化层则像“小区合并”,每个 2×2 小片区只保留最大值或平均值,既缩小地图,又让模型对轻微位移更不敏感。多层卷积和池化堆叠后,网络就能从边缘、纹理逐步组合出数字的整体轮廓。

yi,j=∑a=0K−1∑b=0K−1wa,b xi+a,j+b+b\displaystyle y_{i,j} = \sum_{a=0}^{K-1} \sum_{b=0}^{K-1} w_{a,b} \, x_{i+a,j+b} + b
这个公式描绘了巡逻队的一次完整检查:把卷积核内每个位置的权重 w 和对应像素 x 相乘,全部加起来,再加一个偏置 b,得到输出特征图上 (i,j) 位置的值。
  1. 输出位置y_{i,j} 是卷积后特征图在第 i 行第 j 列的值。
    yi,jy_{i,j}
  2. 双重累加两个求和号表示把卷积核覆盖的 K×K 小块里的每个点都遍历一遍。
    ∑a=0K−1∑b=0K−1\sum_{a=0}^{K-1} \sum_{b=0}^{K-1}
  3. 可学习权重w_{a,b} 是卷积核内部的权重,训练时会不断更新,相当于巡逻队不断调整“该重点关注什么”。
    wa,bw_{a,b}
  4. 输入像素块x_{i+a,j+b} 是原图上以 (i,j) 为左上角的小块像素。
    xi+a,j+bx_{i+a,j+b}
  5. 偏置末尾的 b 给每个输出通道一个基础偏移,让城市可以有“底线海拔”。
    +b+b

AlexNet创新

2012 年,AlexNet 建筑队决定不再盖小镇,而是直接建超级城市。它把 LeNet 的五层楼拔高到八层:5 个卷积层再加 3 个全连接层,总参数约 6000 万,训练数据是 120 万张 ImageNet 图像。这个规模如果还用老办法,普通电脑要训练到地老天荒。

AlexNet 的创新像给城市装上了三套新系统:一是快速电梯 ReLU,让信号不再堵塞在负楼层;二是逃生梯 Dropout,让某些神经元随机“轮休”,防止全城过度依赖同一条主干道;三是 GPU 高铁,用并行计算把训练时间从几个月压缩到几天。此外,它还用了重叠池化,让池化窗口之间有重叠区域,像巡逻路线适当交叉,减少信息遗漏。

如果说 LeNet 证明了“卷积+池化”这个结构可行,AlexNet 则证明了“更大、更深、更强正则化”能把 CNN 推向真实世界。超级城市的第一仗,就打出了改写 AI 历史的结果。

ReLU与Dropout

ReLU 是 AlexNet 最有名的“快速电梯”。在它之前,神经网络常用 Sigmoid 激活函数,但 Sigmoid 在输入很大或很小时会把梯度压到几乎为零,信号像堵在老旧电梯里一样传不动。ReLU 的规则极其简单:正数原样通过,负数一律归零。

ReLU 不仅缓解了 Sigmoid 的梯度消失问题,还让网络产生稀疏激活:很多神经元输出为 0,相当于城市里大部分道路暂时关闭,只有关键路线在运输信息。这种稀疏性让计算更高效,也带来一定的抗过拟合效果。

Dropout 则是配套的“逃生梯”。训练时,每个神经元以概率 p 随机失活,也就是暂时退出本次传播;预测时不再随机失活,而是把权重按比例缩放,相当于全城恢复通行,但每人只带一部分行李。这样迫使网络学会多套冗余路线,而不是把希望全压在少数几个神经元上。AlexNet 正是靠 ReLU 和 Dropout,在 6000 万参数的大工地上稳住了训练。

ReLU(z)=max⁡(0,z)\displaystyle \text{ReLU}(z) = \max(0, z)
这座电梯的按钮只有两个:输入 z 大于 0 就上升,小于等于 0 就停在原地。简单粗暴,却让梯度有了畅通的下行通道。
  1. 输入信号 z这是上一层卷积或全连接算出来的原始分数。
    zz
  2. 取 0 和 z 的最大值负数全被剪成 0,正数保持不变。
    max⁡(0,z)\max(0, z)
  3. 得到激活输出ReLU(z) 作为本层神经元的输出,传给下一层。
    ReLU(z)\text{ReLU}(z)

GPU训练与历史影响

城市规模变大了,施工速度也必须跟上。AlexNet 当时用两块 GTX 580 GPU 并行训练,把卷积运算拆分到不同处理器上同时计算。GPU 的关键优势是“很多个小工人同时干活”,特别适合卷积这种大量重复的乘加运算。

除了硬件,AlexNet 还用了数据增强:对训练图片随机裁剪、翻转、调整颜色,相当于给城市装上天气模拟器,让模型见过更多变化,从而降低过拟合。2012 年,AlexNet 在 ImageNet 图像分类比赛上把 top-5 错误率从 26% 左右大幅压到 15.3%,一举夺冠。

这个结果的意义远超一场比赛:它让学术界和工业界第一次确信,深度学习在大规模视觉任务上真的能碾压传统方法。随后深度学习进入爆发期,GPU 价格下降、框架成熟、数据变多,超级城市的版图迅速扩展到语音、文本、自动驾驶等领域。可以说,AlexNet 是深度学习进入主流视野的“竣工典礼”。

后世启发

LeNet 和 AlexNet 留下的不只是两栋楼,而是一套城市规划规范。后来的 VGG 发现,与其不断调大卷积核,不如用多个小卷积核堆叠出同样大的感受野,还能减少参数;GoogLeNet 则尝试在同一层里并行使用不同尺寸的卷积核,像同时修几条不同宽度的马路。

最著名的后续建筑是 ResNet。它发现网络太深之后,训练误差反而会上升,于是干脆在模块旁边加了一条“心跳捷径”:让输入 x 直接跳到输出,网络只需要学习残差 F(x)。

回看 LeNet 和 AlexNet,它们共同定义了 CNN 的三个设计原则:用卷积提取局部特征、用池化降低分辨率、用深层次堆叠获得更强的表达能力。今天的 EfficientNet、MobileNet 等架构,依然是在这份旧图纸上不断改进门窗和电梯,而不是另起炉灶。

H(x)=F(x)+x\displaystyle H(x) = F(x) + x
这个公式像一个应急通道:如果深层模块学不到有用东西,至少原始输入还能原封不动地送到下一层。网络因此可以放心地越建越深。
  1. 目标映射H(x) 是这一整段网络最终想学到的理想输出。
    H(x)H(x)
  2. 残差部分F(x) 是模块自己需要学习的“变化量”,通常比完整映射更容易优化。
    F(x)F(x)
  3. 恒等捷径x 是输入的直接拷贝,相当于施工时留好的直达通道。
    +x+x

AI 应用场景

银行票据与手写 OCR

阶段:模型设计与特征提取

解决的问题:传统模板匹配对手写数字的笔迹变化非常敏感,同一个“5”可能写成五种样子。LeNet 类 CNN 用局部感受野扫描笔画细节,再通过池化容忍轻微变形,从而稳定识别手写数字。

具体案例:银行网点每天有大量支票、汇款单需要录入系统。工程师先用定位模型找到数字区域,再裁剪出单个字符,送入一个 LeNet 风格的小型 CNN,输出 0-9 十个类别的概率。网络只有几万参数,能在 CPU 上实时完成识别。

工业产品表面缺陷检测

阶段:训练优化与数据增强

解决的问题:手机外壳划痕、锂电池鼓包等缺陷样本少且外观多样,用人工规则很难覆盖。AlexNet 展示的深度卷积 + Dropout + 数据增强组合,正好适合在数据有限时训练鲁棒分类器。

具体案例:某 3C 工厂部署生产线质检系统,采集良品与划痕两类图片,在线随机裁剪和翻转扩充数据,用 AlexNet 类似的八层 CNN 做二分类。推理时关掉 Dropout,保留完整网络,准确率稳定在 98% 以上。

预训练特征迁移

阶段:迁移学习与特征提取

解决的问题:医疗影像、卫星图片等场景标注成本高,从头训练大模型不现实。AlexNet 一类预训练 CNN 在 ImageNet 上学到的边缘、纹理特征具有通用性,可以直接迁移到小数据集上。

具体案例:研究团队加载在 ImageNet 上预训练的 AlexNet,冻结前面的卷积层,只重新训练最后一层分类器,用来区分肺部 CT 中是否有结节。两周时间就完成了从数据准备到部署的原型验证。

Python 演示

python70 行
import numpy as np  def conv2d(x, w, b, stride=1):    # x: (H, W, Cin), w: (Kh, Kw, Cin, Cout)    H, W, Cin = x.shape    Kh, Kw, _, Cout = w.shape    Oh = (H - Kh) // stride + 1    Ow = (W - Kw) // stride + 1    out = np.zeros((Oh, Ow, Cout))    for i in range(Oh):        for j in range(Ow):            patch = x[i*stride:i*stride+Kh, j*stride:j*stride+Kw, :]            out[i, j, :] = np.sum(                patch[:, :, :, None] * w,                axis=(0, 1, 2)            ) + b    return out  def max_pool(x, size=2):    H, W, C = x.shape    Oh = H // size    Ow = W // size    out = np.zeros((Oh, Ow, C))    for i in range(Oh):        for j in range(Ow):            out[i, j, :] = x[                i*size:(i+1)*size,                j*size:(j+1)*size,                :            ].max(axis=(0, 1))    return out  def relu(x):    return np.maximum(0.0, x)  def softmax(z):    e = np.exp(z - np.max(z))    return e / np.sum(e)  def lenet_forward(x):    conv1_w = np.random.randn(3, 3, 1, 6) * 0.1    conv1_b = np.zeros(6)    x = relu(conv2d(x, conv1_w, conv1_b))    print("after conv1:", x.shape)    x = max_pool(x)    print("after pool1:", x.shape)    conv2_w = np.random.randn(3, 3, 6, 16) * 0.1    conv2_b = np.zeros(16)    x = relu(conv2d(x, conv2_w, conv2_b))    print("after conv2:", x.shape)    x = max_pool(x)    print("after pool2:", x.shape)    h = x.flatten()    fc_w = np.random.randn(h.shape[0], 10) * 0.1    fc_b = np.zeros(10)    logits = h @ fc_w + fc_b    return softmax(logits)  if __name__ == "__main__":    np.random.seed(0)    x = np.random.randn(32, 32, 1)    p = lenet_forward(x)    print("prediction shape:", p.shape)    print("prob sum:", p.sum())
目的:用 NumPy 从零实现一个简化版 LeNet 前向传播,展示卷积、池化、ReLU、全连接各层的张量形状变化与分类输出。
  1. out = np.zeros((Oh, Ow, Cout))为卷积输出特征图预先分配空间,相当于在蓝图上画出新街道的宽度。
  2. patch = x[i*stride:i*stride+Kh, j*stride:j*stride+Kw, :]从输入图中切出一个小块,这正是卷积“街区巡逻”的局部感受野。
  3. np.sum(patch[:, :, :, None] * w, axis=(0, 1, 2)) + b把卷积核权重和像素块逐元素相乘再求和,完成一次加权检查。
  4. .max(axis=(0, 1))在 2×2 小块里取最大值,对应池化层的“小区合并”操作。
  5. x = relu(conv2d(x, conv1_w, conv1_b))先卷积再 ReLU,所有负数归零,正数继续向上传递。
  6. logits = h @ fc_w + fc_b把展平后的特征向量与全连接权重做矩阵乘法,得到 10 个类别的原始分数。
  7. if __name__ == "__main__":独立运行入口,让脚本可以直接演示一个随机 32×32 图像的前向传播。

常见误区

误区我以为 AlexNet 就是把 LeNet 复制几层,深度翻倍而已。LeNet 在 1998 年就能跑,AlexNet 应该只是大一点的 LeNet。

正解AlexNet 的“大”背后还有系统性的工程创新:ReLU 解决梯度消失、Dropout 防止过拟合、GPU 并行加速、数据增强扩大训练集。没有这些配套设施,单纯加深网络很容易无法收敛或严重过拟合。就像只把楼盖高,却不装电梯和消防通道,根本没人敢住。

为何常见:因为 LeNet 和 AlexNet 的结构骨架确实都遵循“卷积+池化+全连接”,新手容易只看到层数差异,忽略训练策略才是引爆点。

误区我看 LeNet 和 AlexNet 都有池化,就觉得任何 CNN 都要有池化层,否则无法下采样。

正解池化只是下采样的一种方式。后来的很多网络用步长大于 1 的卷积直接缩小特征图,效果同样好。池化擅长提供局部平移不变性,但也可能丢掉位置信息,所以像分割、检测任务中要谨慎使用。经典架构爱用池化,不代表它是不可替代的唯一答案。

为何常见:教科书和入门教程几乎都用 LeNet 讲解,池化出现频率太高,容易形成“必须如此”的错觉。

误区我一直认为训练和推理要保持一致,训练时神经元随机失活,推理时也应该随机失活,才能公平。

正解推理时如果不做任何处理,每个神经元的输出会被整体放大,因为训练时的期望输出已经因失活被缩小。标准做法是推理时使用完整网络,并对权重或输出做缩放补偿。Dropout 本质上是一种训练期的正则化手段,不是推理期的数据增强。

为何常见:很多初学者把 Dropout 理解成“噪声”,以为模型就应该在噪声环境下工作,忽略了它只是防止训练阶段过度依赖某些路径。

误区我看到 AlexNet 比 LeNet 卷积核多、参数多,就觉得只要不断增加卷积核数量,模型能力就能一直变强。

正解更大的模型容量意味着更强的拟合能力,但如果没有足够的训练数据、正则化和计算资源,模型会记住训练集噪声,导致测试集表现变差。AlexNet 的 6000 万参数之所以成功,是因为配套了 120 万张训练图、Dropout、数据增强和 GPU。容量是枪,弹药和训练纪律同样重要。

为何常见:在 Benchmark 排行榜上,大模型效果更好,容易让人忽略训练条件和数据规模这些默默付出的因素。

面试题

Q1. LeNet-5 中池化层的主要作用是什么?

单选题 · easy

  • A.扩大输入图像尺寸
  • B.缩小特征图尺寸← 正确答案
  • C.增加卷积核的数量
  • D.替代全连接层分类

答案:B。池化在 LeNet 中负责对特征图进行下采样,把 2×2 的小块合并成一个值,从而缩小尺寸、减少计算量并增强平移不变性。它不是用来扩图、加卷积核或替代分类器的。

Q2. 卷积层的“权值共享”指什么?

单选题 · mid

  • A.每个像素使用独立权重
  • B.同一卷积核滑动时权重不变← 正确答案
  • C.全连接层共享所有输入
  • D.每个通道只使用一个偏置

答案:B。权值共享强调的是同一个卷积核在图像不同位置都使用同一套权重,这正是“一支巡逻队用同一标准巡全城”。A 是共享的反面,C 描述的是全连接,D 只是偏置设计,不是权值共享。

Q3. 下列哪些属于 AlexNet 相对 LeNet 的关键创新?

多选题 · mid

  • A.采用 ReLU 加速训练← 正确答案
  • B.采用 Dropout 防止过拟合← 正确答案
  • C.借助 GPU 并行加速← 正确答案
  • D.使用遗传算法调参

答案:ABC。AlexNet 在激活函数、正则化和计算硬件上做出了标志性改进。它并没有用遗传算法调参,而是采用标准反向传播和随机梯度下降训练。D 属于常见混淆项。

Q4. ReLU 相比 Sigmoid 主要缓解了什么问题?

单选题 · hard

  • A.梯度消失问题← 正确答案
  • B.模型过拟合问题
  • C.池化丢失信息
  • D.参数初始化困难

答案:A。Sigmoid 在两端梯度接近 0,反向传播时梯度连乘会迅速变小,导致浅层几乎无法更新。ReLU 对正数导数为 1,相当于给梯度开了快速电梯,缓解了深层网络的梯度消失问题。过拟合、池化损失和初始化不是 ReLU 直接解决的主要对象。

Q5. LeNet-5 的原始输入图像尺寸通常是多少?

单选题 · easy

  • A.28×28
  • B.32×32← 正确答案
  • C.224×224
  • D.96×96

答案:B。LeNet-5 的标准输入是 32×32 的灰度图。28×28 是 MNIST 数据集中单个字符的常见尺寸,也是后来很多入门示例常用的尺寸,但它不是 LeNet-5 论文中的原始输入规格。

Q6. AlexNet 在 2012 年 ImageNet 比赛中的主要意义是什么?

单选题 · mid

  • A.提出新型反向传播算法
  • B.大幅降低错误率引爆深度学习← 正确答案
  • C.证明池化层必须使用最大值
  • D.提出残差连接解决退化问题

答案:B。AlexNet 用深度 CNN 把 ImageNet 分类错误率大幅拉低,让学界看到深度学习的巨大潜力,由此开启深度学习浪潮。它没有发明新的反向传播算法,没有规定池化必须用最大值,残差连接是后来 ResNet 的贡献。

Q7. 为什么卷积层能自动提取图像特征?

多选题 · hard

  • A.局部感受野关注相邻像素← 正确答案
  • B.权值共享大幅减少参数← 正确答案
  • C.多层堆叠形成层级特征← 正确答案
  • D.训练时会丢弃大量样本

答案:ABC。卷积通过局部感受野感知邻域信息,通过权值共享控制参数量,再通过逐层堆叠把边缘组合成纹理、把纹理组合成部件,从而自动学习特征层级。D 描述的丢弃样本不属于特征提取机制,Dropout 丢弃的是神经元而不是训练样本。

Q8. 使用 Dropout 时,预测阶段一般如何处理?

单选题 · mid

  • A.与训练阶段同样随机置零
  • B.使用完整网络并缩放权重← 正确答案
  • C.只保留一个隐藏层神经元
  • D.把 Dropout 层替换为池化层

答案:B。Dropout 是训练期的正则化手段。训练时随机失活是为了让网络不要过度依赖某条路径;预测时使用完整网络,并对权重或输出做缩放补偿,这样神经元输出的期望才与训练时一致。A 会引入随机性导致结果不稳定,C 和 D 是错误操作。

Q9. 下列哪项是 AlexNet 训练时降低过拟合的关键手段?

单选题 · extreme

  • A.随机翻转和裁剪图像← 正确答案
  • B.增加每个卷积核尺寸
  • C.删除所有池化层
  • D.把学习率设为无穷大

答案:A。AlexNet 通过随机裁剪、水平翻转等方式做数据增强,相当于给训练集增加更多“天气模拟”,让模型学到更稳健的特征,从而降低过拟合。增大卷积核、删除池化、把学习率设为无穷大都不是合理做法,反而会导致训练崩溃或性能下降。

Q10. 下列哪些属于经典 CNN 的基本操作?

多选题 · easy

  • A.卷积运算← 正确答案
  • B.池化下采样← 正确答案
  • C.全连接分类← 正确答案
  • D.注意力机制

答案:ABC。LeNet 和 AlexNet 时代的经典 CNN 由卷积、池化和全连接组成,卷积负责提取局部特征,池化负责缩小特征图,全连接负责汇总并分类。注意力机制是后来 Transformer 等架构的核心概念,不属于这两代经典 CNN 的基本操作。