卷积神经网络(Convolutional Neural Network),是深度学习里专门处理图像、视频、语音等 “网格型数据”的神经网络。

# 背景:MLP 不适用于图像处理

假设你有一张 28×28 的黑白手写数字图片,如 MNIST 数据集

# 1️⃣ MLP 的做法:拉平


图片 (28×28)  →  拉成向量 (784 个数字)  →  输入全连接层

问题

  • 丢失空间信息:像素之间的上下左右关系没了。
  • 参数爆炸:如果图片是 224×224×3 (RGB),输入就是 150,528 维。第一层如果有 1000 个神经元,光权重就有 1.5 亿个,显存直接爆掉。
  • 无法识别位置变化:猫在左上角和右下角,MLP 可能认为是两种东西。

# 2️⃣ CNN 的做法:保留结构


图片 (28×28×1)  →  卷积层提取特征  →  池化层缩小  →  分类

优势

  • 保留空间结构:知道相邻像素的关系。
  • 参数共享:同一个滤波器扫描整张图,参数极少。
  • 平移不变性:猫在左边还是右边,都能认出来。

# CNN 的核心组件(三大件)

CNN 主要由三种层交替堆叠而成:


输入 → [卷积层] → [激活函数] → [池化层] → ... → [全连接层] → 输出
      (提取特征)   (非线性)   (缩小尺寸)          (分类)

# 1️⃣ 卷积层(Convolutional Layer)⭐ 核心

作用:提取特征(边缘、纹理、形状)。
工作原理:用一个卷积核Filter/Kernel)在图片上滑动扫描

术语

含义

作用

卷积核滤波器

一个小矩阵(如 3×3)

用来提取特定特征(如竖线、横线)

填充 (Padding)

在图片周围补 0

保持输出尺寸不变,保留边缘信息

步幅 (Stride)

每次滑动几格

步长越大,输出越小

通道 (Channel)

彩色图有 3 通道 (RGB)

卷积核也有深度,对应输入通道

直观理解

1. 不同的 卷积核 就像不同的"滤镜",有的专门找边缘,有的专门找圆形。
2. 有时将卷积层的输入输出数据称为 特征图feature map)。其中,卷积层的输入数据称为 输入特征图input feature map),输出数据称为 输出特征图output feature map

卷积:乘积累加求和

填充 Padding:向输入数据的周围填入固定数据

步幅 Stride:指定卷积核的间隔

通道 Channel:各层(通道)卷积结果之和


# 2️⃣ 池化层(Pooling Layer)

作用缩小尺寸,减少计算量,保留主要特征。
特点:① 没有要学习的参数(只是提取出值);② 通道数不发生变化
常见类型

类型

做法

比喻

最大池化 (Max Pooling)

取区域内最大值

"只保留最显著的特征" ⭐ 最常用

平均池化 (Average Pooling)

取区域内平均值

"保留整体背景信息"

💡 为什么池化?

图片太大,计算太慢。池化就像把高清大图变成缩略图,猫还是猫,但像素少了很多


# 3️⃣ 全连接层(Fully Connected Layer)

作用:最后进行分类。

位置:通常在 CNN 的末尾

  • 前面卷积 + 池化已经把图片变成了高级特征向量
  • 全连接层把这些特征整合起来,输出"这是猫"还是"这是狗"。

卷积提取的特征  →    全连接层    →    概率输出
[0.9, 0.1...]      (MLP)      [猫:90%, 狗:10%]

# 经典 CNN 架构流程


输入图片 (32×32×3)

[卷积层 1]  →  提取边缘  →  (32×32×32)

[池化层 1]  →  缩小一半  →  (16×16×32)

[卷积层 2]  →  提取纹理  →  (16×16×64)

[池化层 2]  →  缩小一半  →  (8×8×64)

[卷积层 3]  →  提取形状  →  (8×8×128)

[展平 Flatten] → 变成向量  →  (1024)

[全连接层]    →  分类      →  (10 类)

输出 (Softmax)

📌 规律

1. 越往后,图片尺寸越小通道数(特征数量)越多
2. 前面学简单特征(边、角),后面学复杂特征(眼睛、耳朵)。

# CNN 中的正则化与 BN

组件

常见位置

备注

BatchNorm

卷积层之后,激活函数之前

Conv → BN → ReLU ⭐ 标准配置

Dropout

全连接层之前

卷积层通常不用 Dropout(用 BN 代替)

L2 正则

优化器中

weight_decay 全局生效

数据增强

数据加载时

旋转、裁剪对 CNN 特别有效


# 代码实例(PyTorch)


import torch.nn as nn
import torch.nn.functional as F

class SimpleCNN(nn.Module):
    def __init__(self):
        super().__init__()
        # 1. 卷积层 (输入 1 通道,输出 32 通道,卷积核 3x3)
        self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1)
        self.bn1 = nn.BatchNorm2d(32)  # 批归一化

        # 2. 卷积层 (输入 32 通道,输出 64 通道)
        self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
        self.bn2 = nn.BatchNorm2d(64)

        # 3. 池化层 (2x2 最大池化)
        self.pool = nn.MaxPool2d(2, 2)

        # 4. 全连接层 (展平后 64*14*14 → 128 → 10)
        self.fc1 = nn.Linear(64 * 14 * 14, 128)
        self.dropout = nn.Dropout(0.5)  # 全连接层前用 Dropout
        self.fc2 = nn.Linear(128, 10)

    def forward(self, x):
        # 卷积块 1
        x = self.conv1(x)
        x = self.bn1(x)
        x = F.relu(x)
        x = self.pool(x)  # 尺寸减半

        # 卷积块 2
        x = self.conv2(x)
        x = self.bn2(x)
        x = F.relu(x)
        x = self.pool(x)  # 尺寸再减半

        # 展平
        x = x.view(-1, 64 * 14 * 14)

        # 全连接
        x = self.dropout(x)
        x = self.fc1(x)
        x = F.relu(x)
        x = self.fc2(x)
        return x

# CNN 的进阶架构

随着深度学习发展,CNN 也在进化:

架构

年份

核心创新

地位

LeNet-5

1998

最早的 CNN

祖师爷

AlexNet

2012

ReLU + Dropout + GPU

深度学习爆发起点

VGG

2014

用小卷积核堆叠

结构规整,常用 backbone

ResNet

2015

残差连接 (跳过层)

解决了梯度消失,可训练上百层 ⭐

EfficientNet

2019

复合缩放

效率最高

💡 现在工业界最常用ResNet 系列(如 ResNet18, ResNet50


参考书籍:斋藤康毅.深度学习入门:基于 Python 的理论与实现 [M]. 陆宇杰,译.北京:人民邮电出版社,2018. ISBN 978-7-115-48558-8.


更新于

请我喝[茶]~( ̄▽ ̄)~*

Plusjia&Bondrewd 微信支付

微信支付

Plusjia&Bondrewd 支付宝

支付宝