Class 3 - Convolutional Neural Networks

1. Computer Vision

1.1. 应用

  • 图像识别与视频搜索 (Image recognition and video search)
    • 这是最基础也最广泛的应用。
    • 想想手机相册,你可以直接搜索“狗”、“沙滩”或者某个朋友的名字,系统就能自动找出所有相关的照片。这背后就是图像识别技术在起作用。对于视频,像YouTube这样的平台会利用CV技术自动为视频打上标签、审查内容,甚至在视频中进行广告植入。
  • 安防 (Security)
    • 人脸识别、虹膜识别、指纹识别和入侵检测。
    • 这些技术统称为生物识别技术。每天用Face ID解锁手机,或者在火车站“刷脸”进站,都是计算机视觉在安防领域的应用。更进一步,在智慧城市监控系统中,CV技术可以实时分析成千上万个摄像头的画面,实现对异常事件(如人群骚乱、交通事故、非法入侵)的自动检测和报警,极大地提升了公共安全效率。
  • 医疗影像处理 (Medical image processing)
    • 这是一个非常重要的前沿领域。
    • 医生通过观察X光片、CT或MRI扫描来诊断疾病。计算机视觉可以作为医生的“第二双慧眼”,通过分析这些影像自动检测和圈出潜在的病灶,比如肺结节、癌细胞等。这不仅可以提高诊断的准确率,还能大大减轻医生的阅片负担。
  • 机器人学 (Robotics)
    • 机器人需要“眼睛”来与世界交互。
    • 无论是工厂里精准抓取零件的机械臂,还是家里的扫地机器人,它们都需要通过摄像头或其他视觉传感器来感知环境、识别障碍物、定位自身位置。没有计算机视觉,机器人就是“盲人”,无法自主完成复杂的任务。
  • 自动驾驶 (Self-driving cars)
    • 这是当前最热门也是最复杂的CV应用之一。
    • 自动驾驶汽车本质上是一个带轮子的机器人。它依赖于大量的摄像头和传感器来实时构建对周围环境的3D理解,需要精准地识别车辆、行人、交通标志、车道线等。每一次决策都基于视觉系统的输入,因此其可靠性和实时性至关重要。

计算机视觉在这个时代变得如此重要和可行的一个重要的原因是海量视觉数据的出现。智能手机和视频的普及导致了视觉数据的极大增长,这点是理解现代人工智能(特别是深度学习)的关键。

早期的计算机视觉算法因为缺少足够的数据进行训练,效果很有限。而今天,每个人都有一部高清摄像头的手机,每天在社交媒体上产生数十亿张照片和视频。这些海量的数据成为了训练强大AI模型的“燃料”。没有这些数据,再好的算法也只是纸上谈兵。

对人类来说,视觉看起来似乎很简单,但是看一下时间的历史尺度。

  • 视觉感知 (Visual perception): 拥有 5.4亿年 的进化数据积累。
  • 双足行走 (Bipedal movement): 拥有超过 2.3亿年 的历史。
  • 抽象思维 (Abstract thought): 只有短短 10万年 的历史。

这个惊人的时间对比直接引出了人工智能领域一个著名的观点——莫拉维克悖论。这个悖论指出:对人类来说轻而易举的事情(如下意识的视觉感知、行走),对计算机来说却极其困难;而对人类来说很困难的事情(如下棋、做复杂的数学计算),计算机却能轻易完成。

答案就在于进化。我们的祖先在数亿年的时间里,为了生存、捕食和躲避天敌,不断地在优化视觉和运动这些底层感官能力。这些能力已经通过自然选择深深地“硬编码”进了我们的大脑结构中,所以我们用起来感觉毫不费力。而逻辑、数学这些抽象思维是人类文明近期的产物,我们的大脑还没有为它进行过长时间的专门优化,所以需要后天刻苦学习。

因此,人类视觉的“简单”是一种假象,它其实是地球生命在5.4亿年间,用无数次试错和迭代“训练”出来的一个极其高效和鲁棒的系统。

1.2. 生物结构

大脑的视觉皮层拥有约 800万个神经元 和 20亿个突触。这是一个庞大而复杂的生物计算网络。

视觉皮层中的某些神经元只对特定方向的线条产生强烈反应。比如一个神经元可能只在看到垂直线条时才会被激活,而对水平或倾斜的线条毫无反应。视觉处理也存在一个分层结构,底层的“简单细胞”负责检测视野中特定位置的特定方向的边缘;而更高一级的“复杂细胞”则整合来自多个简单细胞的信息,能够检测视野中任意位置的特定方向的边缘。

  • 起点 (Eye -> V1): 当我们看到一张脸时,信息首先到达初级视觉皮层(V1)。V1并不“看到”一张完整的脸,它更像是一个基础特征分析器,将图像分解成最基本的元素,比如在不同位置、不同方向的短线、边缘、光点等。这正是Hubel & Wiesel实验中发现的“边缘检测器”所在的地方。
  • 中继站 (V2 -> V4): 接着,这些来自V1的简单特征被传递到V2和V4等更高级的视觉区域。这些区域像是“组装工”,它们将简单的线条和边缘组合成更复杂的形状,比如角、曲线、或者简单的几何图形(比如图中的圆形和弧线)。
  • 高级处理与识别 (IT-posterior): 信息继续传递,到达颞下皮层(Inferior Temporal Cortex, IT)。在这里,之前组合好的各种形状被进一步整合,最终形成对整个物体的识别。比如,IT皮层的后部(IT-posterior)可能会被激活,让你识别出这是“比尔”、“简”或者“吉尔”的脸。
  • 语义关联 (IT-anterior): 最后,在IT皮层更靠前的部分(IT-anterior),识别出的身份会与我们的记忆和知识相关联。你不仅知道这是“比尔”,你还知道他是“男性 (male)”、“朋友 (friend)”、“人很好 (nice)”等抽象的语义信息。

深度学习模仿以上行为的过程:

深度学习(尤其是CNN)是如何模仿上述生物过程的。

  • 输入层 (Input Layer - Pixels): 神经网络的输入是一张猫的图片,对应的是一堆原始的像素值 $(x_1​,x_2​,...,x_N​)$。这就像光线进入我们眼睛的视网膜(Retina)。
  • 浅层网络 (Layer 1 - Edges): 网络的第一个隐藏层,通过学习,其功能会变得和V1皮层非常相似。它并不能识别出“猫”,但它能从像素中学习到如何检测一些基础的特征,比如横线、竖线、斜线等各种“边缘 (Edges)”。
  • 中层网络 (Layer 2 - Primitive Shapes): 第二个隐藏层会把第一层检测到的边缘进行组合,形成更复杂的“原始形状 (Primitive Shapes)”,比如眼睛的轮廓、耳朵的尖角、胡须的曲线等等。这对应了生物视觉中的V2和V4区域。
  • 深层网络 (Layer L - High-level Features): 随着网络层数的加深,后续的层(直到第L层)会继续这个组合过程,将眼睛、耳朵、胡须等部件组合起来,最终形成能够代表“猫”或者“人脸”的非常高级和抽象的特征表示。这就好比我们大脑中的IT皮层。

1.3. 困难

计算机看到的世界不是物体,而是一个个像素组成的巨大数字矩阵。同一个物体,在不同的情况下,会产生完全不同的像素矩阵。一个强大的视觉模型必须能够克服这些差异,抓住物体不变的本质。

  1. 视角变化 (Viewpoint variation)
    • 如从不同角度拍摄的雕塑头像。
    • 从计算机的角度看,一张正脸和一张侧脸的像素数据是天差地别的。模型必须学习到,这些完全不同的像素组合,实际上都指向同一个三维物体。它需要具备一种“空间想象力”。
  2. 光照条件 (Illumination conditions)
    • 如在不同光照下的企鹅和人脸,特别是强烈侧光下的人脸。
    • 光照是CV中最棘手的问题之一。强光、弱光、阴影、反光都会极大地改变一个物体表面的像素值。模型必须学会忽略光照带来的“表面差异”,去识别物体本身固有的颜色和纹理。
  3. 尺度变化 (Scale variation)
    • 同一个人和笔记本电脑,在照片中可以很大,也可以很小。
    • 物体在图像中的大小取决于它离摄像头的远近。模型需要做到尺度不变性 (Scale Invariance),即无论是一只占据整个屏幕的大猫,还是一只远在角落里的小猫,都能被识别为“猫”。
  4. 形变 (Deformation)
    • 一只猫可以蜷缩、伸展,摆出各种各样奇怪的姿势。
    • 这对于非刚性物体尤其具有挑战性。与汽车、建筑这种形状固定的物体不同,动物、人的形态是千变万化的。模型不能靠简单的模板匹配,而必须学习到一个物体各个部件的组合关系,理解其“拓扑结构”是不变的。

除了物体本身的变化,它所处的环境也给识别带来了巨大的麻烦。

  1. 遮挡 (Occlusion)
    • 如一只猫被墙挡住只露出头顶,或者被树干、桌腿部分遮挡。
    • 在真实世界中,物体很少会完整地出现在我们面前。模型必须具备强大的推理能力,能够“管中窥豹”,从可见的一小部分(比如一只耳朵、一条尾巴)推断出整个物体的存在和类别。
  2. 背景混淆 (Background clutter)
    • 如一只豹猫完美地融入了背景中,难以分辨。
    • 当物体的颜色、纹理与背景非常相似时,模型就很难将它从背景中分离出来。这要求模型不仅要学习物体长什么样,还要学习如何区分“前景”和“背景”。
  3. 伪装 (Disguise)
    • 如一只猫被打扮成了狮子,另一只则穿上了猴子的服装。
    • 这是更极端的一种挑战,它考验的是模型对核心特征的把握能力。当次要特征(如毛发)被改变时,模型是否还能抓住主要特征(如猫的脸部结构、眼睛)来做出正确判断?
  4. 类内差异 (Intra-class variation)
    • 如,“椅子”这个类别包含了各种各样的设计;“猫”和“狗”也包含了无数个品种,形态各异。
    • 我的补充: 这是计算机视觉中最根本的挑战之一。“椅子”是一个抽象的概念,而不是一个具体的形象。模型需要通过学习成千上万个不同的椅子样本,最终在“脑中”形成对“椅子”这个抽象概念的理解。
    • 除了简单地“是什么”,我们还想知道更多信息。

超越识别的更复杂任务 (Other Challenges)

 - **物体计数 (Object Counting)**: 比如数清一堆香蕉有多少根。当物体大量重叠、互相遮挡时,精确计数就变得非常困难。

 - **语义分割 (Semantic Segmentation)**: 这是像素级别的分类任务。它不仅要识别出图里有车、有人、有路,还要精确地标出哪个像素属于车,哪个像素属于路,这比单纯的图像分类要难得多。

2. Milestones in Computer Vision

2.1. 先驱

1959年,拉塞尔·基尔希(Russell Kirsch),像素(pixel)的发明者,开发了第一台数字图像扫描仪。“像素”这个概念是整个数字成像领域的基石。它意味着我们可以将一个连续的、物理世界中的画面,离散化、数字化,变成计算机可以读取和处理的数据。图像不再是模拟信号,而成了一个巨大的数字矩阵。

1963年,劳伦斯·罗伯茨(Lawrence Roberts)在他1963年的博士论文中,研究了如何从2D照片中推导出3D信息。他通过处理简单的“积木世界”图像,从原始图片中提取边缘线条,并最终重建出物体的三维结构,甚至可以从不同视角观察它。Roberts选择从简单的几何体(立方体、棱锥体)入手,这是一个非常聪明的简化。他假设物体都是由直线和平面构成的。他的算法流程大致是:

  • 边缘检测: 首先,在2D图像中找到亮度的突变处,从而识别出物体的轮廓和边缘。
  • 线条与顶点连接: 将检测到的边缘连接成线段,并找到它们的交点(顶点)。
  • 3D模型匹配: 将这些2D的顶点和线条,与已知的3D几何模型(如立方体)进行匹配,通过几何约束求解出这些物体在三维空间中的位置、大小和朝向。

2.2. 理论框架

1980年,受Hubel & Wiesel (H&W) 的启发,Kunihiko Fukushima (福岛邦彦) 研究了如何识别不受位置和位移影响的模式,这直接引出了卷积层 (convolutional layers) 的思想。福岛邦彦基于这个思想,开发了名为“神经认知机”(Neocognitron)的模型。这个模型可以说是现代卷积神经网络(CNN)的直接鼻祖。它已经具备了CNN的两个核心要素:

  • 能够检测局部特征的“S细胞层”(类似于卷积层)。
  • 能够对局部特征的位置信息进行模糊处理,从而实现位移不变性的“C细胞层”(类似于池化层/下采样层)。 虽然当时的计算机能力有限,无法训练很深的网络,但Neocognitron在理论上已经为CNN铺平了道路。

1982年,David Marr (大卫·马尔) 同样基于H&W的研究,提出了分层视觉处理 (hierarchical vision processing) 的理论,即视觉处理是从识别简单的边缘、曲线、角点等开始的。

David Marr是计算机视觉领域极具影响力的理论家。他提出了一套完整的视觉计算理论,认为要完全理解视觉,需要分三个层次:计算理论层、算法表示层和硬件实现层。他提出的视觉处理流程是一个自底向上的分层过程:首先从2D图像中生成一个“原始简图”(Primal Sketch),描述边缘和基本几何形状;然后生成一个“2.5D简图”,包含表面的朝向和深度信息;最终构建一个完整的、以物体为中心的3D模型。这个宏大的理论框架在整个80年代主导了计算机视觉的研究方向。

2.3. 关键应用与范式转变

到了90年代末,随着计算能力的提升,研究开始分化,一些更专注、更实用的算法开始出现,同时,一个革命性的思想正在酝酿。

  • 1997年 - J. Shi 和 K. Malik
    • 他们在图像分割 (image segmentation) 领域做出贡献,旨在将相关的像素组合在一起。
    • 图像分割是比图像分类更复杂的任务,它要求算法将图像划分成若干个有意义的区域(例如,把图中的电话、书本、鞋子都精确地分割出来)。Shi和Malik提出的“归一化切割”(Normalized Cuts)算法是当时该领域的一个重大突破,它能更有效地找到全局最优的分割方案。
  • 1998年 - Yann LeCun (杨立昆)
    • 针对MNIST手写数字识别任务,他将反向传播 (backprop) 式的学习算法成功应用于一个卷积神经网络架构(即LeNet)上,用于字符识别。
    • 这是深度学习应用于计算机视觉的第一次伟大成功。LeCun是神经网络领域的先驱之一。他设计的LeNet-5网络,完美地结合了卷积层、池化层和全连接层,并利用反向传播算法进行端到端的训练。它在MNIST手写数字识别任务上取得了极高的准确率,在当时被广泛应用于银行的支票识别系统中。这项工作雄辩地证明了,一个精心设计的神经网络,可以通过从数据中学习,自动提取有效的特征,从而在模式识别任务上超越传统的手工设计特征方法。可以说,没有LeNet,就没有后来的深度学习革命。
  • 约1999年 - 范式转变
    • 研究者们逐渐放弃了构建完整3D模型(Marr的理论)的宏大目标,转而使用基于特征的物体识别 (feature-based object recognition)。这种新方法的核心是寻找那些对图像缩放、平移和旋转不敏感的特征 (invariant features)
    • 人们发现,Marr提出的从2D图像重建精确3D模型的路径在真实世界的复杂场景中太难实现了。一种更实用、更鲁棒的方法是:我们不求完全理解物体的三维结构,而是去寻找一些“关键点”或“特征描述子”,这些特征足够独特,并且在光照、视角、尺度变化时依然保持稳定。这个思想直接催生了接下来十年(21世纪初)最成功的算法,如SIFT (Scale-Invariant Feature Transform)、SURF等。这些方法主导了计算机视觉领域,直到2012年AlexNet的出现,才宣告了深度学习时代的全面回归。

2.4. MNIST

MNIST的问题就是识别手写数字图片,判断图片上写的是0到9中的哪一个数字。

数据集构成 (MNIST Dataset (1998)):

  • 训练数据: 包含了60,000张图像,用作训练模型。这些图像扫描自250个不同人的手写笔迹,保证了数据的多样性。
  • 测试数据: 包含了10,000张图像,用于在模型训练完成后,评估其在从未见过的数据上的表现(即泛化能力)。
  • 图像规格:
    • 尺寸: 每张图像都是一个28x28像素的小图片。这个尺寸非常小,便于快速处理。
    • 颜色: 图像是灰度的,每个像素的取值范围是 [0, 255],代表了该点的灰度强度(intensity)。通常0代表纯黑色(背景),255代表纯白色(笔迹)。

2.5. MLP

一个解决MNIST问题的最基础的神经网络模型——全连接神经网络(Fully Connected Neural Network),有时也称为多层感知机(MLP)如下。

![[Pasted image 20250925165200.png]]

这张图描绘了一个三层的神经网络结构:输入层、隐藏层和输出层。

  • 输入层 (Input Layer)
    • 网络的输入是一张28x28的图像,它被转换成一个包含784个神经元的输入层。
    • 这里的关键操作是“展平”(Flattening)。一个28x28的二维图像矩阵,被“拉直”成一个784维的一维向量(28 * 28 = 784)。输入层的每一个神经元就对应着原始图像中的一个像素点,其输入值就是该像素的灰度值(0-255)。
    • 重要缺陷: 这种“展平”操作有一个巨大的缺点:它完全丢失了图像的空间结构信息。在被拉直的向量里,原本在图像上相邻的像素点可能变得相距很远。计算机无法直接知道哪些像素是相邻的,这使得它学习图像的局部模式(比如线条、角点)变得非常困难。
  • 隐藏层 (Hidden Layer)
    • 图中展示了一个包含15个神经元的隐藏层。
    • 我的补充: 这是网络的核心计算部分。“隐藏”的意思是它既不是输入也不是输出,是中间的处理单元。这个层被称为“全连接”的,因为输入层中的每一个神经元,都与隐藏层中的每一个神经元相连接(图中密密麻麻的线就代表这些连接)。每个连接都有一个权重(weight),这些权重就是网络需要通过训练来学习的参数。隐藏层的作用就是从输入数据中检测和组合更复杂的模式。例如,某些神经元可能在学习后,会对特定位置出现的弧线或直线产生强烈的激活反应。
  • 输出层 (Output Layer)
    • 网络的输出层包含10个神经元,分别对应0到9这10个数字。
    • 输出层也是全连接的,它接收来自隐藏层的信息。这10个神经元会各自输出一个分数或概率值,代表输入图像是相应数字的可能性。例如,如果输入的图像是“7”,理想情况下,代表“7”的那个输出神经元的值会最接近1,而其他9个神经元的值会接近0。在做出最终预测时,我们通常会选择值最高的那个神经元所代表的数字作为结果。

简单全连接网络,虽然能够解决MNIST问题(通常能达到95%以上的准确率),但它并不是处理图像任务的最佳选择。

  • 优点: 结构简单,易于理解,是入门神经网络的经典模型。
  • 缺点:
    1. 参数量巨大: 仅仅从输入层到这个15个神经元的隐藏层,就有784 * 15 = 11,760个权重参数需要学习。如果图像尺寸更大或者隐藏层更宽,参数量会爆炸式增长。
    2. 丢失空间信息: 如前所述,展平操作破坏了图像的二维结构,不利于学习视觉特征。
    3. 不具备平移不变性: 如果一个数字“7”在图像左上角,网络学会了识别它;但如果把这个“7”平移到右下角,对于全连接网络来说,这就是一个全新的、完全不同的输入,它需要重新学习。

正是为了解决这些问题,特别是丢失空间信息参数量巨大的问题,研究者们才设计出了卷积神经网络(CNN)。CNN通过局部连接参数共享(即卷积核)的思想,能够高效地处理图像的二维结构,是专门为计算机视觉任务量身定做的架构,其性能也远超简单的全连接网络。

3. Convolutional Neural Network (CNN)

  1. 全连接层 (Fully-connected layer) 的问题

如果用全连接层来处理图像,会遇到两个致命问题:

  • 连接数爆炸 (lots of connections!)
    • 以一张100x100的图像为例,这张图共有10,000个像素。如果下一层也是同样大小,那么两层之间的连接数将达到10,000 * 10,000 = 1亿(100M)个。
    • 每个连接都对应一个需要学习的权重参数。这意味着,仅仅一层就需要学习1亿个参数。这会带来几个灾难性后果:
      1. 计算量巨大: 训练过程会变得极其缓慢。
      2. 内存消耗巨大: 存储模型参数需要海量内存。
      3. 极易过拟合: 参数数量远远超过了训练样本的数量,模型会轻易地“记住”所有训练图片,而不是学习到通用的识别规律,导致其在测试图片上表现极差。
  • 结构性缺陷
    • 在全连接层中,“每个像素都对所有其他像素产生贡献 (each pixel contributes to all other pixels)”。
    • 这种处理方式完全忽略了图像的空间结构 (spatial structure)。它把图像看作一个扁平的、无序的像素集合。然而,图像中像素的位置和相邻关系恰恰是至关重要的信息。

要设计一个好的图像处理模型,就必须利用图像自身的特点,最起码有以下两点:

  • 局部相关性 (Locality)只有相邻的像素才是高度相关的。一张图片中,一个像素的意义主要由它周围的像素决定,而与距离很远的像素基本无关。例如,要判断一个像素是否属于猫的眼睛,我们只需要看它周围的像素,而不需要关心图片另一个角落里的像素。
  • 特征的平移不变性 (Stationarity)在图像的不同位置上,我们使用相同的函数(或特征检测器) (same functions for each patch)。一个用来检测“鸟嘴”的特征检测器,不仅应该能检测出图片左上角的鸟嘴,也应该能检测出图片右下角的鸟嘴。也就是说,特征的模式与它出现的位置无关。

卷积操作的设计,正是为了完美地利用上述图像的两个内在属性,从而解决全连接层的问题。卷积通过减少连接数来适应输入的结构。它能够提取出最重要的属性。卷积采用下面两个做法:

  • 局部连接 (Local Connectivity): 卷积层中的一个神经元,不再连接到输入图像的所有像素,而仅仅连接到一个很小的局部区域,这个区域被称为“感受野”(receptive field),也就是PPT中的patch(例如5x5)。这完美地利用了图像的局部相关性
  • 参数共享 (Parameter Sharing): 用于处理图片左上角那个5x5区域的滤波器(包含一组权重参数),会被重新用来处理图片上所有其他的5x5区域。也就是说,整个图像共享同一组权重。这完美地利用了特征的平移不变性

对于一个5x5的patch,可学习的参数数量只有25个。对于一个100x100的图像,如果用全连接,每个输出神经元需要100*100 = 10,000个连接;而用卷积,每个输出神经元只需要5*5 = 25个连接。

这里最关键的不是连接数的减少,而是可学习参数的惊人减少。对于全连接层,我们需要1亿个参数。而对于卷积层,我们只需要学习那一个5x5滤波器的25个参数(外加一个偏置项),无论图像有多大。这使得模型变得轻量、高效,并且更专注于学习通用的视觉模式,而不是记忆像素位置。

一个典型的CNN可以被清晰地划分为两个主要部分:特征提取 (Feature Extraction) 和 分类 (Classification)

  1. 特征提取 (Feature Extraction)
    • 这部分的输入是原始图像,输出是一组“特征”。它主要由两种层交替堆叠而成:卷积层 (Convolutional layer) 和 池化层 (Pooling/subsampling layer)
    • 这部分是CNN的精髓所在,也是它与上一张PPT讲的全连接网络最根本的区别。它的工作不是直接对整个图像进行分类,而是像我们之前讨论的生物视觉系统一样,逐层地、自动地从图像中学习和提取有用的特征。从底层的边缘、颜色,到中层的纹理、部件,再到高层的物体轮廓。这个过程保留了图像的空间结构,并且通过“卷积”这种操作实现了高效计算。
  2. 分类 (Classification)
    • 这部分的任务是根据提取到的特征,进行最终的分类判决。它通常由全连接层 (Fully connected layer) 组成。
    • 当特征提取部分完成了它的工作后,我们就得到了一组高度抽象和浓缩的特征信息。这时,我们不再需要关心这些特征在原始图像中的空间位置了。因此,我们将这些特征“展平”(flatten)成一个长向量,然后把它喂给一个或多个传统的全连接层。这些全连接层的作用,就如同一个“决策大脑”,它综合分析所有高级特征,然后投票得出最终的结论(例如,这张图片是数字“3”的概率最大)。

![[Pasted image 20250925170141.png]]

LeNet处理一张手写数字“3”的完整流程:

  • 输入 (Input): 一张32x32像素的灰度图像。
    • 注意:这比MNIST原始的28x28要大,通常是为了让卷积核有更充分的边缘处理空间。
  • C1层 (第一卷积层):
    • 操作: 对输入图像进行5x5的卷积。
    • 输出: 得到6个28x28特征图 (feature maps)。可以想象成有6个不同的5x5“特征探测器”(滤波器),每个探测器都去扫描一遍原始图像,寻找它感兴趣的特定模式(比如某个方向的斜线、某个角度的拐角等),然后将探测结果绘制成一张特征图。
  • S2层 (第一池化/下采样层):
    • 操作: 对C1输出的特征图进行2x2的下采样。
    • 输出: 6个特征图的尺寸都被缩小一半,变成了14x14。这个过程主要是为了降低数据维度,减少计算量,并提供一定程度的位移不变性(即特征在小范围内移动不影响结果)。
  • C3层 (第二卷积层):
    • 操作: 再次进行卷积操作。
    • 输出: 得到16个10x10的特征图。这一层会组合S2层输出的较为简单的特征,形成更复杂、更抽象的特征。
  • S4层 (第二池化/下采样层):
    • 操作: 再次进行2x2的下采样。
    • 输出: 16个特征图的尺寸进一步被缩小到5x5。至此,特征提取部分完成。
  • 全连接层 (n1, n2) 与输出:
    • 操作: 将S4层输出的16个5x5特征图“展平”成一个向量,然后送入两个全连接层(n1和n2),最后连接到10个节点的输出层,分别代表0到9。
    • 输出: 最终输出10个概率值,其中值最高的节点对应的数字,就是模型的预测结果。

3.1. 卷积层(Convolutional layer)

卷积层有三个关键概念:局部感受野 (Local Receptive Field)滤波器 (Filter/Kernel) 和 参数共享 (Parameter Sharing)

卷积层(CONV layer)中的每个神经元只与输入的一个局部连续区域相连接,这个区域被称为局部感受野(local receptive field, LRF)。这就像通过一个很小的“猫眼”(peep hole)来看一张大图,这个“猫眼”就是滤波器(filter)或核(kernel)

  1. 定义一个滤波器 (Filter/Kernel):
    • 首先,我们有一个小的权重矩阵 W,它就是滤波器。如一个 3x3 的滤波器。你可以把这个滤波器看作是一个特征检测器,它的权重 w_ij 被设计(或通过训练学习得到)用来检测某种特定的微小模式(比如一条竖线、一个角点或一种颜色过渡)。
  2. 应用滤波器:
    • 我们将这个滤波器覆盖在输入图像(Layer l)的一个局部感受野 X 上。
    • 然后,进行加权求和的计算。将感受野 X 中的每个像素值 x_ij 与滤波器 W 中对应位置的权重 w_ij 相乘,然后将所有乘积相加,最后再加上一个偏置项 b
  3. 生成输出:
    • 这个计算结果就是输出层的一个像素值。 $$\mathrm{Output}=W^Tx+b$$
  • 这个输出值代表了当前局部感受野 X 与滤波器 W 所检测的特征的匹配程度。如果X区域的模式和W要找的模式很像,那么输出值就会很高(激活强度大);反之则很低。
  • 这个输出值会成为下一层(隐藏层)的一个节点,而由所有这些输出值组成的新矩阵,就叫做特征图 (feature map)
  1. 滑动窗口与参数共享
    • 滤波器会从左到右、从上到下地扫描整个输入图像。在这个过程中,一个至关重要的机制是参数共享 (Parameter sharing):对于所有的局部感受野,我们使用的都是同一个权重矩阵 W 和同一个偏置 b
    • 这正是我们之前讨论的平移不变性原理的体现。因为我们在整个图像上都用同一个滤波器(同一组参数),所以这个滤波器无论是在图像的左上角还是右下角,检测的都是同一种特征。这极大地减少了需要学习的参数数量,使得模型更加高效,也更不容易过拟合。

3.1.1. 特征图的尺寸

举一个例子,因为滤波器是从左到右,从上到下依次扫描的,所以在步幅为1的情况下,当 3x3 的滤波器在整个 8x8 的图像上完成滑动后,我们最终会得到一个 6x6 的特征图(Feature Map),所以我们可以得出一个计算输出尺寸的通用公式(在步幅为1,且没有填充的情况下): $$\text{Output Size}=(\mathrm{Input~Size}-\text{Filter Size})+1$$ 卷积层的本质就是通过一个共享的、小的滤波器,在输入数据上进行滑动窗口式的加权求和,最终生成一张能够反映某种特定特征在原图上分布情况的“特征地图”。这个简单而强大的操作,是CNN能够从图像中提取有用信息的关键所在。

3.1.2. 步幅 (Stride)

简单来说,步幅(Stride)就是滤波器(filter)在输入图像上每次滑动的距离。当步幅为1的时候,滤波器每次都是向右或向下移动一个像素的距离,这也是最常见的情况。

而步幅也可以设置为2或者更大,这时滤波器不再是向右移动1格,而是跳过1列,直接向右移动2格,覆盖在一个新的3x3区域上。然后在这个新位置进行计算,得到输出的第二个像素。

使用大于1的步幅是一种非常常见的操作,它主要有两个作用:

  1. 显著减小输出特征图的尺寸(下采样 Downsampling):
    • 当步幅为1时,一个8x8的输入和一个3x3的滤波器会产生一个6x6的输出。
    • 但如果步幅为2,输出尺寸会大大减小。我们可以用一个更通用的公式来计算: $$\text{Output Size}=\lfloor\frac{(\mathrm{Input~Size}-\text{Filter Size})}{\mathrm{Stride}}\rfloor+1$$
  2. 减少计算量,降低模型复杂度:
    • 因为输出的特征图变小了,后续网络层的计算量也会相应地大幅减少,这可以加快模型的训练和推理速度。
    • 在某种程度上,使用更大的步幅也有助于减少过拟合,因为它迫使网络对特征进行更概括性的提取,丢弃了一些冗余信息。

步幅(Stride)是设计CNN架构时需要决定的一个关键超参数

  • S=1 是最常见的选择,它能最精细地提取特征,保留最多的空间信息。
  • S>1 (通常是 S=2) 则扮演了下采样的角色,可以在卷积操作中直接实现对特征图的降维。这与我们之后会学到的“池化层”(Pooling Layer)有异曲同工之妙,都是用来减小特征图尺寸的重要手段。选择多大的步幅,是在信息保留的精细度计算效率之间做出的权衡。

3.1.3. 填充 (Padding)

简单来说,填充(Padding)就是在输入图像的边界周围添加额外的像素。最常见的填充方式是零填充(Zero-padding),即用值为0的像素来填充。对于一个矩阵(图像),我们在它的顶部和底部各增加 P 行0,在左侧和右侧各增加 P 列0。图中的例子展示了当 P=1 时的零填充,即在原始矩阵的四周包裹了一圈0。

使用填充的两个主要原因:

  • 原因一:避免特征图尺寸持续缩小
    • 如果不使用填充,每经过一个卷积层,图像的尺寸就会变小。这将限制我们能够构建的网络的总层数。
    • 回顾之前的例子,一个 8x8 的输入经过 3x3 的卷积后,会变成 6x6。如果网络很深,比如有几十个卷积层,那么图像尺寸会迅速缩小到 1x1,导致后续无法再进行卷积。这严重限制了深度神经网络的设计。通过填充,我们可以控制甚至保持输出尺寸不变,从而构建任意深度的网络。
  • 原因二:更好地处理边界信息 (我的补充)
    • 这是一个非常重要的的原因。在没有填充的卷积过程中,图像中心的像素会被滤波器多次扫描和计算,而边界和角落的像素只会被扫描到很少次(例如角落像素只被计算1次)。
    • 这意味着网络从图像中心学习到的信息远比从边界学习到的多,边界信息在某种程度上被“浪费”了。
    • 通过添加填充,滤波器的中心可以移动到原始图像的边界甚至角落像素上,使得边界信息得到更充分的利用。

根据填充量的不同,卷积操作通常被分为以下几种类型:

  1. 有效卷积 (Valid convolution)
    • 定义不使用任何填充 (no padding),即 P=0。
    • 效果: 这就是最早接触的卷积形式。输出尺寸会小于输入尺寸。
  2. 相同卷积 (Same convolution)
    • 定义: 选择一个合适的填充量 P,使得输出图像的尺寸与输入图像的尺寸保持完全相同
    • 这是迄今为止最常用的一种填充方式。它使得我们在设计深度网络时,不必担心每一层的尺寸变化,极大地简化了网络结构的设计。
    • 当步幅 Stride=1 时,要实现“相同卷积”,填充量 P 的计算公式为: $$P=\frac{\text{Filter Size}-1}{2}$$
  3. 全卷积 (Full convolution)
    • 定义: 选择一个足够大的填充量P,使得滤波器的每一次滑动都包含有效的输入像素,确保每个输入像素都被同等次数地“看到”。
    • 在这种模式下,输出的尺寸会大于输入的尺寸。这种操作在标准的CNN图像分类任务中不太常用,但在其他领域如信号处理或生成模型(如转置卷积)中可能会遇到。

在现代CNN架构(如ResNet等)中,相同卷积几乎是标准配置,因为它允许我们构建非常深的网络而无需担心特征图尺寸的衰减。而“有效卷积”(Valid convolution)则通常在需要明确进行下采样(降维)的层中使用。

3.1.4. 万能公式

计算卷积层输出尺寸的通用公式: $$M=\lfloor\frac{(N+2P-F)}{S}\rfloor+1$$

  • N: 输入特征图的尺寸(例如,对于N x N的图像,就是N)。
  • F: 滤波器的尺寸(例如,对于F x F的滤波器,就是F)。
  • P: 在单边填充的像素数量(Padding)。
  • S: 步幅(Stride)。
  • M: 输出特征图的尺寸。

这个公式是设计任何卷积神经网络架构的基础工具。通过调整FPS这三个超参数,网络设计者可以像搭积木一样,精确地控制每一层特征图的尺寸是保持不变缩小还是增大

3.1.5. 不同的滤波器

滤波器就是特征检测器,不同的滤波器可以检测不同的特征。这里展示的所有滤波器都是在经典图像处理领域中被广泛使用的、由人类专家手工设计的滤波器。

  1. 恒等滤波器 (Identity)
  • 矩阵:$\begin{bmatrix}0&0&0\0&1&0\0&0&0\end{bmatrix}$
  • 效果: 输出图像和原图一模一样。
  • 当这个滤波器滑过图像时,输出像素的值 = 1 * 中心像素值 + 0 * 其他所有邻居像素值。所以,它做的唯一一件事就是原封不动地复制中心像素的值,因此图像没有任何变化。
  1. 边缘检测滤波器 (Edge detection)

这里我们展示三种不同的边缘检测器及其效果。处理后的图像中,边缘部分会呈现为亮色或暗色,而平坦区域则接近于灰色(零值)。

  • 矩阵一: $$\begin{bmatrix}1&0&-1\0&0&0\-1&0&1\end{bmatrix}$$
  • 这是一个类似索伯(Sobel)算子的变体,它主要检测对角线方向的边缘。

  • 矩阵二: ​$$\begin{bmatrix}0&1&0\1&-4&1\0&1&0\end{bmatrix}$$
  • 这是一个拉普拉斯(Laplacian)算子。它通过计算中心像素与周围像素的差异来检测边缘,对各个方向的边缘都很敏感。

  • 矩阵三: $$\begin{bmatrix}-1&-1&-1\-1&8&-1\-1&-1&-1\end{bmatrix}$$
  • 这是另一种形式的拉普拉斯算子,它将中心像素与周围所有8个邻居进行比较。
  1. 锐化滤波器 (Sharpen)
  • 矩阵:$\begin{bmatrix}0&-1&0\-1&5&-1\0&-1&0\end{bmatrix}$​
  • 效果: 图像的细节和边缘变得更加清晰、突出。
  • 这个滤波器的工作方式是:将中心像素的值放大5倍,然后减去周围邻居的值。这极大地增强了中心像素与周围像素的对比度,从而达到了锐化的效果。
  1. 模糊滤波器 (Blur)
  • 方框模糊 (Box blur)
    • 矩阵:$\frac{1}{9}\begin{bmatrix}1&1&1\1&1&1\1&1&1\end{bmatrix}$​
    • 效果: 图像变得模糊。
    • 它用3x3邻域内所有9个像素的平均值来取代中心像素的值。这个平均化的过程会抹平像素间的剧烈变化,从而使图像变得平滑和模糊。1/9是归一化系数,以保证图像整体亮度不变。

高斯模糊 (Gaussian blur)

  • 矩阵:$\frac{1}{16}\begin{bmatrix}1&2&1\2&4&2\1&2&1\end{bmatrix}$​
  • 效果: 产生比方框模糊更平滑、更自然的模糊效果。
  • 方框模糊的“一视同仁”不同,高斯模糊在计算平均值时,给予了不同位置的邻居不同的权重。离中心越近的像素权重越高(中心为4,紧邻为2,角落为1)。这更符合“距离越近,关系越密切”的自然规律。

在传统的图像处理中,这些功能各异的滤波器是由人类专家根据数学和经验手工设计出来的。然而,卷积神经网络(CNN)的革命性之处在于,它不需要人类去设计这些滤波器

CNN在训练过程中,会自动学习出成百上千个最适合当前任务的滤波器权重。当我们去可视化一个训练好的CNN的底层滤波器时,我们常常会发现,它自动学习出了大量类似于我们今天看到的这些边缘检测器、颜色检测器等基础模式。这就是深度学习强大的“特征自学习”能力的体现。

3.1.6. 彩色图像

一张32x32彩色图像(包含红、绿、蓝三个通道)在模型中被表示为一个32x32x3的立方体(cuboid)或数据体。

这是理解多通道卷积的第一步。我们不能再把彩色图像看作是一个高x宽的二维矩阵,而必须看作是高x宽x通道数的三维数据体。这里的“3”就是深度(depth),分别代表红色(Red)、绿色(Green)和蓝色(Blue)三个颜色通道的强度图。

要处理一个32x32x3的输入数据体,我们所使用的滤波器也必须是三维的。它的深度必须与输入数据的深度相匹配。因此,我们使用一个5x5x3的滤波器。这个5x5x3的滤波器会在32x32x3的输入数据体上滑动。每滑动到一个位置,就对覆盖住的5x5x3区域进行加权求和,计算出一个单一的输出值

尽管输入区域和滤波器都是3D的,但它们经过一次卷积运算后,输出的是一个标量。因此,当这个5x5x3的滤波器在整个32x32x3的输入上滑动完成后,它生成的特征图(Feature map)是二维的,其深度为1。这个过程有效地将3个颜色通道的信息压缩进了一个特征图中。

因此,卷积操作可以自然地从2D推广到3D,以处理像彩色图像这样的多通道数据。关键在于滤波器的深度必须与输入的深度相匹配

![[Pasted image 20250925175957.png]]

一个5x5x3的滤波器只能检测一种复合特征(比如“红色的曲线”)。如果我们想同时检测多种特征(比如“蓝色的直线”、“绿色的斑点”等),我们就会使用多个不同的滤波器

比如,当我们有一个32x32x3的彩色输入图像时,我们不再只使用一个滤波器。如果我们使用四个不同的5x5x3滤波器,我们就会得到四个独立的28x28x1特征图(channels)。这四个特征图最终会堆叠在一起,形成一个28x28x4的新数据体,其深度为4。

![[Pasted image 20250925180113.png]]

一个滤波器可能通过学习,专门用于检测“垂直线(vert line)”,另一个检测“水平线(hor line)”,第三个检测“顶端(tip)”,第四个检测“拐角(bend)”。

卷积层的主要作用之一,就是将输入的“深度”(例如彩色图像的3个颜色通道),转换为输出的、更具语义信息的“特征深度”(例如这里的4个特征通道)。网络的深度(层数)让我们学习更复杂的特征,而通道的深度让我们在每一层能学习更多种类的特征。

3.1.7. 卷积层的优势

  1. 平移不变性 (Translation invariance)
    • 因为卷积层在整张图上都使用相同的滤波器参数,所以它可以在图像的任何位置识别出同一种模式。这使得训练更加容易,因为它需要更少的训练样本。
    • 这是由“参数共享”机制带来的直接好处。想象一下训练了一个滤波器来识别猫的耳朵。因为这个滤波器会滑过图像的每一个位置,所以无论这只猫出现在照片的左上角、右下角还是正中央,这个“猫耳朵检测器”都能生效。而对于全连接层,它会把猫在左上角和猫在右下角看作是两个完全不同的输入,需要分别学习,这极大地降低了学习效率。因此,平移不变性让模型更加鲁棒和高效。
  2. 学习模式的层次结构 (Learn hierarchies of patterns)
    • 底层特征 (Low-Level Feature): 网络的最底层(靠近输入的层)学习识别非常基础的局部模式,比如各种方向的线条、边缘、颜色块等。
    • 中层特征 (Mid-Level Feature): 中间层会组合底层学习到的简单特征,形成更复杂的模式,例如圆形、纹理、角点等。
    • 高层特征 (High-Level Feature): 更深的高层网络会继续组合中层特征,形成更抽象、更具语义的特征,比如车轮、引擎盖、人脸、动物眼睛等物体的特定部件。
    • 可训练的分类器 (Trainable Classifier): 最后,这些被提取出的高层特征被送入一个分类器(通常是全连接层),它根据这些高级特征的存在与否来做出最终的判断。
    • 中层网络有“更大的LRF(局部感受野)”。这是因为中层的一个神经元虽然只“看”着前一层的一小块区域,但前一层的每个神经元又“看”着更前一层的一小块区域。层层叠加,导致深层网络的神经元实际上能够“感知”到原始输入图像中一个非常大的区域,这就是感受野的扩大。
  3. 更少的参数 (Less parameters)卷积层通过重复使用一个小的滤波器,极大地减少了需要学习的参数数量。这带来了几个好处:
    • 训练更快,内存更少
    • 更不容易过拟合,因为模型被限制在学习通用的、可平移的特征,而不是死记硬背特定位置的像素模式。

3.1.8. 激活函数

此前,我们认为卷积的计算是加权求和 + 偏置。但实际上在加权求和之后,其结果还需要经过一个ReLU函数。 $$\mathrm{Output}=\mathrm{ReLU}(\sum_{ij}x_{ij}w_{ij}+b)$$ 如果没有像ReLU这样的非线性(non-linear)激活函数,那么无论我们堆叠多少层卷积,整个网络本质上都只是在做一个巨大的线性变换(矩阵乘法)。而一个复杂的线性变换,最终都可以用一个更简单的线性变换来表示。

这意味着,没有激活函数的“深度”网络,其表达能力和一个“浅层”网络是等价的,无法学习现实世界中复杂的、非线性的模式。激活函数的引入,就是为了给网络注入非线性,使得深度网络能够学习和拟合任意复杂的函数。

使用ReLU的几个关键优势:

  • 计算高效
    • 这是ReLU的一大优点。
    • 相比于过去常用的Sigmoid或tanh等激活函数需要进行复杂的指数运算,ReLU的计算仅仅是一个简单的取最大值操作,这使得网络的正向传播和反向传播都快得多。
  • **更快的训练速度(解决了“梯度消失”问题)
    • ReLU可以有效避免梯度消失问题。
    • 这是ReLU最重要的优点。
  • 增强特征的稀疏性和显著性
    • 卷积会平滑图像的边界和颜色变化,而“经过ReLU修正后,颜色的变化会更加突然”。
    • 我们可以这样理解这个比较形象的说法:
      • 卷积本身是一种加权平均,确实带有一定的平滑效应。输出的特征图中会包含正值、负值和零值。正值通常代表检测到了某种特征,而负值可能代表检测到了相反的特征。
      • 当应用ReLU后,所有负值都被“砍掉”,变成了0。这会带来一个稀疏(Sparsity)的效果,特征图中的很多像素都变成了0,只有那些真正检测到显著特征的区域才保留为正值。
      • 这种操作使得被激活的特征更加“突出”,与未激活的背景(现在全是0)形成了更鲜明的对比,这实际上形成了一种筛选,有助于网络更好地关注和学习有用的特征。

3.1.9. 层次学习的例子

![[Pasted image 20250925181413.png]]

图中共有三行,每一行都代表一次独立的实验,但使用的是同一个已经训练好的CNN模型

  • 输入 (第一列):
    • 第一行: 输入一张背景干净的手写数字 “2”。
    • 第二行: 输入一张带有放射状条纹背景的数字 “2”。
    • 第三行: 输入一张带有杂乱纹理背景的数字 “2”。
  • 网络层输出 (后续列):
    • conv1: 第一个卷积层输出的特征图(这里有6个通道/特征图)。
    • relu1: 经过第一个ReLU激活函数后的结果。
    • conv2: 第二个卷积层输出的特征图(这里有16个通道/特征图)。
    • relu2: 经过第二个ReLU激活函数后的结果。

对比三行中的conv1relu1列。在第一行(干净背景),relu1的输出清晰地勾勒出了数字“2”的各种笔画特征。在第二行和第三行(带背景),我们能清楚地看到,relu1的输出不仅包含了数字“2”的特征,还混杂了大量由背景条纹和纹理激活的“噪声”特征。

这是因为第一层卷积层(conv1)扮演的是基础边缘/纹理检测器的角色。它的滤波器非常简单,只能识别一些低级的模式,如横线、竖线、斜线等。因此,无论是数字“2”的笔画,还是背景中的线条,只要符合这些基础模式,都会被conv1的滤波器检测到并激活。此时,网络还无法区分哪些是“有意义的”特征,哪些是“无关的”背景。所以,我们可以说结构化的背景对第一层的6个通道响应有影响

但是对比conv2relu2列,尽管第二行和第三行的输入带有强烈的背景干扰,但它们在relu2层输出的特征图,与第一行(干净背景)在relu2层输出的特征图看起来非常相似。背景噪声在relu1中还清晰可见,但到了relu2层,它们的影响几乎被“过滤”掉了,只留下了与数字“2”这个高级概念相关的、更稳定的特征模式。

这是因为第二层卷积层(conv2)执行的是更高级的任务。它不再是简单地看边缘,而是学习如何组合第一层输出的基础特征。例如,conv2中的一个滤波器可能学会了识别“一个水平笔画”和“一个右上角的弧线”的组合,而这个组合模式是数字“2”所特有的。背景噪声虽然能在第一层产生大量的孤立的线条特征,但这些特征的空间组合方式是随机、无意义的,它们无法激活conv2中那些寻找特定“部件”的滤波器。

3.2. 池化层 (Pooling Layer)

如果说卷积层是用来“提取特征”的,那么池化层的主要目的就是对特征图进行降维(或称下采样),即“缩小尺寸/简化输入 (reduce size / simplify input)”。它通常紧跟在卷积层和激活函数之后。

![[Pasted image 20250925182105.png]]

这里我们举一个最大池化(Max pooling)的例子,实际上很简单,就是使用一个 2x2 的滤波器,设置步幅 stride = 2,使得窗口之间没有重叠。取每次滑动窗口里面的最大值。我们有三种主要的池化方式:

  • 最大池化 (Max pooling):
    • 公式: $outputs~max_{ij} A_{ij}$
    • 说明: 如上例所示,取局部区域中的最大值。它被认为能够最好地保留纹理等最显著的特征,是当今最常用的池化方法。
  • 平均池化 (Average pooling):
    • 公式: $outputs~Σ_{i,j} A_{ij} / nm$
    • 说明: 计算局部区域中所有值的平均值。它能提供更平滑的特征表示,在早期的一些网络(如LeNet)中比较流行。
  • L2池化 (L2 pooling):
    • 公式: $outputs~||A||2 = sqrt(Σ{i,j} A_{ij}^2)$
    • 说明: 计算局部区域中所有值的L2范数。这种方法相对少见。

池化层的必要性和核心优势在于提升效率扩大感受野提供不变性

  1. 提升效率与减少过拟合
  • 池化的首要目的是“在丢失特征精确位置的代价下,减少参数数量”。一个2x2、步幅为2的池化操作,可以将参数量(更准确地说是特征图大小)减少4倍
    • 一个100x100的特征图,经过2x2、步幅为2的池化后,会变成50x50。像素点数量从10000个减少到2500个,数据量骤减了75%。
    • **更少的参数/数据量意味着:
      • 更少的内存占用 (less memory)
      • 更高的计算效率 (more efficient)
      • 更少的过拟合 (less overfitting): 池化强制网络对信息进行“概括”和“总结”,丢弃了一些冗余细节,这本身就是一种有效的正则化手段,有助于提高模型的泛化能力。
    • 代价是特征位置的模糊化。经过最大池化后,我们只知道某个区域内存在一个显著特征,但不知道它在该区域的哪个具体像素上。不过,对于图像分类这类宏观任务来说,我们更关心“有没有”这个特征,而不是它“精确在哪”,所以这个代价通常是可以接受的。
  1. 允许后续层“看得更远”(扩大感受野)
  • 池化允许后续的卷积层在输入上看到更大的窗口(即局部感受野 LRF),从而检测到更高级、更复杂的特征。
    • 感受野 (Receptive Field): 指的是输出特征图上的一个像素,对应回原始输入图像上的区域大小。
      1. 假设第一层卷积(F=3x3, S=1)后,一个神经元的感受野是3x3
      2. 然后我们进行2x2、步幅为2的池化(Pooling 2, s=2)。
      3. 现在,在池化后的特征图上再进行一次3x3的卷积。这个新卷积层的单个神经元虽然“看”的是3x3的区域,但这3x3的9个“像素”中的每一个,都代表了前一层的一个2x2区域的“精华”。
      4. 因此,这个新神经元实际上能够“感知”到原始输入图像上一个远大于3x3的区域。
    • 2x2的池化会让LRF翻倍吗?
      • 但不完全是简单的乘以2。如下图,感受野从3x3变成了4x4。感受野的计算是一个更复杂的累加过程,但池化的确是让感受野快速指数级增长的关键步骤。
    • 只有当感受野足够大时,网络深层的神经元才能看到足够多的低级、中级特征,从而将它们组合成高级的、有意义的物体部件(比如把“曲线”和“圆形”组合成“眼睛”)。

![[Pasted image 20250925183118.png]]

  1. 提供平移不变性
    • 局部不变性: 池化提供的是一种局部的平移不变性。在最大池化中,只要那个最强的特征激活值仍然在池化窗口内(例如2x2的窗口),哪怕它的位置在窗口内移动了1个像素,池化的输出结果是完全一样的。
    • 全局不变性的基石: 这种在网络中每一层都存在的局部不变性,层层累加起来,就为整个网络对目标物体在图像中的位置、姿态、形态的微小变化提供了很强的鲁棒性,这是CNN能成功识别真实世界复杂图像的关键属性。

池化层是CNN架构中实现下采样信息压缩的关键一环。它通过一个简单的局部运算(如取最大值或平均值),在显著降低数据量的同时,为模型带来了宝贵的位置不变性,是构建高效、鲁棒的卷积神经网络不可或缺的工具。

3.3. 全连接层 (Dense Layers)

3.1.1. Flatten

卷积/池化层负责“看”和“提取特征”,而全连接层则负责“思考”和“做出决策”

在CNN的前半部分(卷积层和池化层),我们一直致力于保留特征的空间结构(例如,眼睛在鼻子的上方)。但到了最后阶段,我们已经提取出了足够高级的特征(比如“猫眼”、“猫耳朵”、“猫胡须”等),现在需要一个机制来将这些分散的特征聚合在一起 (aggregate them together),从而做出一个全局性的判断。

为了从卷积世界过渡到全连接世界,我们需要一个叫做“展平”(Flattening)的操作。这个操作将最后一个特征图(一个宽x高x深,即 W x H x D 的三维张量),转换成一个一维的长向量,这个向量包含 W * H * D 个神经元。

![[Pasted image 20250925183449.png]]

展平操作会丢失特征的位置信息。然而,这在分类任务的最后阶段是可以接受的。因为经过层层提取,我们得到的已经是高度抽象的、语义级别的特征了。在这个阶段,“存在哪些特征”的重要性已经超过了“这些特征的精确相对位置”。全连接层要做的,就是学习这些高级特征之间的组合逻辑

因此一个完整的CNN可以大致分为两段设计:

  • 前半段:特征提取器 (Feature Extractor)。由卷积层和池化层组成,负责处理空间信息,从原始像素中逐级提取出越来越复杂的特征。
  • 后半段:分类器 (Classifier)。由全连接层组成,它接收前半段提取出的高级特征,忽略其空间位置,进行最终的逻辑推理和分类。

3.1.2. 3D CNN

3D卷积神经网络 (3D CNN),是在我们已经理解的2D CNN基础上的一个自然延伸,专门用于处理三维的、具有“体积”的数据。

  • 2D CNN: 处理的是二维数据,比如图像。它的卷积核(filter)是一个2D平面,在图像的高度(height)和宽度(width)两个方向上滑动。
    • 注意:即便我们处理的是RGB彩色图像(例如 32x32x3),它仍然是由2D CNN处理的。因为 3x3x3 的滤波器虽然是3D的,但它不会在深度(channel)方向上滑动,它只是在每个 (x, y) 位置上一次性处理掉所有通道。所以,滑动依然是二维的。
  • 3D CNN: 处理的是三维的“体积”数据,比如由体素(voxel)构成的三维图像。它的卷积核是一个3D立方体(cube),它会在输入数据的高度、宽度和深度三个方向上进行滑动。

3D CNN的用武之地在于那些“第三维度”包含关键信息的场景。比如:

  • 医学影像分析(空间数据)
    • 例如CT或MRI扫描。
    • 一次CT或MRI扫描会生成一系列连续的2D切片图像,将它们堆叠起来就构成了一个三维的身体器官模型。比如要检测一个肺部肿瘤,如果只用2D CNN一张一张地看切片,可能会丢失肿瘤在Z轴(深度)方向上的形态信息。而3D CNN可以同时“看”到连续的几张切片,它的3D卷积核能够直接学习肿瘤的三维空间结构特征,从而做出更精准的判断。
  • 视频分析(时空数据)
    • 捕捉视频序列中的时间依赖性 (temporal dependencies)
    • 我的补充: 视频可以看作是一个高 x 宽 x 帧数的三维数据体,这里的第三维是时间。例如,要识别一个“挥手”的动作,只看单张静态图片是无法判断的。3D CNN的卷积核(比如 3x3x3)可以同时覆盖一个3x3的像素区域和连续的3帧画面。这使得它能够直接学习到动作和变化的模式,而不仅仅是静态的外观。因此,3D CNN在视频动作识别、事件检测等领域非常强大。

这张图展示了一个典型的3D CNN架构,用于处理高光谱图并分类健康/患病样本。

  • 输入 (Input): 一个64x64x240数据立方体 (Data Cube)。这里的240可以是光谱的波段数。
  • 特征提取: 与2D CNN类似,它也是由卷积层(Convolution)和池化层(Pooling)交替组成的。但这里的所有操作都是三维的
    • 3D卷积: 使用3D的卷积核(Kernels)在输入数据体上进行滑动计算。
    • 3D池化: 使用3D最大池化(3D max-pooling)来对数据的空间维度进行下采样。例如,一个2x2x2的池化窗口会把8个“体素”压缩成1个。
  • 分类: 经过多层特征提取后,得到的三维特征图会被重塑(Reshaping)成一个一维向量(即“展平”),然后送入全连接层(Dense Layer)进行最终的分类。

![[Pasted image 20250925184527.png]]

3.1.3. 数据增强 (Data Augmentation)

当训练数据不足时,模型很容易发生过拟合。数据增强是一种通过对现有数据进行变换来“无中生有”、扩充数据集的技术,从而有效抑制过拟拟合。

例如,像AlexNet这样的深度神经网络拥有数千万个参数,像一塊可塑性极强的“黏土”。如果只给它看少量、有限的图片,它不会去学习“猫”的通用概念,而是会选择最简单的“作弊”方式,即死记硬背住这几张训练图片的每一个像素。结果就是,它在训练集上表现完美,但一遇到从未见过的、稍有不同的新图片,就完全无法识别。

在进行数据增强之前,通常需要先将尺寸不一的原始图片处理成统一的尺寸,我们以Alexnet为例子

  • AlexNet要求输入的RGB图像尺寸为256x256。处理步骤包括:
    1. 将原始图像较短的一边缩放到256像素。
    2. 从缩放后的图像中心裁剪出一个256x256的区域。
    • 例如,一张1024x500的图片,短边是500,会先被缩放到(500/500*256) = 256,长边等比例缩放,然后从中间裁出256x256的部分。

数据增强的核心,就是在不改变图片语义标签(是猫还是狗)的前提下,对其进行各种变换,创造出“看起来不同,但本质一样”的新样本。AlexNet主要使用了以下几种方法:

  1. 位置增强
    • 随机裁剪:
      • 256x256的图像中,随机裁剪出227x227大小的区域。
      • 这一步非常关键。一张256x256的图片可以产生大量不同的227x227裁剪。这等于在告诉模型:“猫”这个物体可能出现在画面的不同位置,不要过分依赖它的绝对坐标。这强迫模型去学习物体本身的样子,而不是它在图片中的位置。
    • 镜像 (Mirroring):
      • 对图像进行水平翻转。
      • 一只朝左的猫和一只朝右的猫都是猫。通过随机的水平翻转,我们让数据集的规模直接翻倍,并教会了模型“左右不变性”。
  2. 颜色增强 (Color augmentation)
    • PPT内容: 对图像的颜色进行扰动。比如可以对原始图加入绿色色偏。
    • AlexNet使用了一种基于主成分分析(PCA)的颜色扰动方法。简单来说,就是对整个训练集中所有像素的RGB值进行分析,找到颜色变化的主要方向(比如是整体偏亮/暗,还是红色/蓝色通道更强等),然后在训练时,给每张图片随机地叠加上这些主方向上的微小颜色变化。
    • 这种操作模拟了真实世界中光照条件和相机白平衡的变化。它等于在告诉模型:“不要过分关注颜色,一只在傍晚拍的、色调偏黄的猫,和一只在日光灯下拍的、色调偏蓝的猫,都是猫。”这强迫模型去学习对颜色和光照不敏感的、更本质的形状和纹理特征。

![[Pasted image 20250925184903.png]]

3.4. 总结

我们做一个如下图的例子,并分析参数量和计算量

![[Pasted image 20250925191356.png]]

3.4.1. 网络整体架构

所有幻灯片都展示了同一个用于MNIST数字识别的CNN架构,其流程如下:

  1. 输入: 一张 28x28 的手写数字图像。
  2. 第一模块:
    • 一次 5x5 卷积 (使用4个滤波器)。
    • 一次 2x2 池化
  3. 第二模块:
    • 一次 5x5 卷积 (使用8个滤波器)。
    • 一次 2x2 池化
  4. 分类模块:
    • 展平 (Flattening) 操作。
    • 一个全连接层 (fully-connected),输出10个类别(数字0-9)。

3.4.2. 特征图尺寸分析 (Size of the Network)

我们来追踪数据在网络中流淌时,其尺寸的变化:

  • 输入28x28x1 (原始图像,1个灰度通道)。
  • 经过第1层卷积28x28x4
    • 这里假设使用了“相同卷积”(Same Convolution),通过添加P=2的填充,使得5x5的卷积核在S=1的步幅下,输出尺寸与输入保持一致。
  • 经过第1层池化14x14x4
    • 2x2的池化层(步幅通常也为2),将特征图的高度和宽度都减半 (28 / 2 = 14)。
  • 经过第2层卷积14x14x8
    • 同样,这里也假设使用了“相同卷积”,保持了14x14的空间尺寸,但通道数因为使用了8个滤波器而从4增加到了8。
  • 经过第2层池化7x7x8
    • 尺寸再次减半 (14 / 2 = 7)。
  • 经过展平392
    • 7x7x8的三维数据体拉直成一个一维向量,总神经元数量为 7 * 7 * 8 = 392

3.4.3. 参数量 & 计算量分析 (No of Parameters and Computation)

  • 第1层卷积 (1st conv):
    • 参数量:
      • 输入通道为1,滤波器尺寸为5x5,所以每个滤波器的权重数量是 1x5x5 = 25
      • 每个滤波器有1个偏置项。
      • 因此,每个滤波器有 (1x5x5) + 1 = 26 个参数。
      • 该层有4个滤波器,所以总参数量为 4 * 26 = 104
    • 计算量 (乘法次数):
      • 每个输出像素点需要 5x5=25 次乘法。输出特征图尺寸为28x28
      • 4个滤波器产生的总计算量为 4 * (5x5) * (28x28) = 78,400 次。
  • 池化层 (Pooling):
    • 参数量0 (none)。池化(如最大池化)只是一个固定的取最大值操作,没有任何需要学习的参数。
    • 计算量0 (none)。它只涉及比较操作,不涉及乘法,因此计算成本极低,通常忽略不计。
  • 第2层卷积 (2nd conv):
    • 参数量:
      • 这一层的输入有4个通道。因此,每个滤波器的深度必须为4,尺寸为4x5x5
      • 每个滤波器有 (4x5x5) + 1 = 101 个参数。
      • 该层有8个滤波器,所以总参数量为 8 * 101 = 808
    • 计算量:
      • 每个输出像素点需要 4x5x5=100 次乘法。输出尺寸为14x14
      • 8个滤波器产生的总计算量为 8 * (4x5x5) * (14x14) = 156,800 次。
  • 全连接层 (Dense):
    • 参数量:
      • 输入向量大小为 7x7x8 = 392。输出节点为10。
      • 权重数量为 392 * 10 = 3,920
      • 10个输出节点各有1个偏置项,共10个。
      • 总参数量为 3920 + 10 = 3,930
    • 计算量392 * 10 = 3,920 次乘法。
  • 总参数量104 (conv1) + 808 (conv2) + 3,930 (dense) = 4,842
  • 总计算量78,400 (conv1) + 156,800 (conv2) + 3,920 (dense) = 239,120

我们可以清晰地看到CNN的一个典型特点:

  1. 参数主要集中在全连接层: 尽管卷积层处理了大量数据,但由于参数共享,其参数量相对较小。模型的参数“大头”往往在最后的分类层。
  2. 计算主要集中在卷积层: 绝大多数的乘法运算都发生在卷积层,因为滤波器需要在巨大的特征图上反复滑动和计算。