前言
卷积神经网络是包含卷积层的神经网络。卷积层能够自动学习图像中的局部特征,如边缘、纹理、形状等,并逐层抽象为高级语义特征。
图像的基本知识
1. 图像的构成
-
图像由像素点组成,每个像素取值范围 [0, 255]。
-
- 0:黑色,255:白色。
-
彩色图像通常使用 RGB 三通道,每个通道对应红、绿、蓝的亮度。
-
在深度学习中,图像通常表示为形状
(Height, Width, Channels)的三维数组。
2. 图像的加载与显示(使用 matplotlib)
python
import matplotlib.pyplot as plt
import numpy as np
# 创建全黑图像(200×200,3通道)
img_black = np.zeros((200, 200, 3))
plt.imshow(img_black)
plt.show()
# 创建全白图像
img_white = np.full((200, 200, 3), 255)
plt.imshow(img_white)
plt.show()
# 加载真实图像
img = plt.imread('data/img.jpg') # 返回 numpy 数组,形状 (H, W, C)
print(img.shape) # 如 (640, 640, 3)
plt.imshow(img)
plt.axis('off')
plt.show()
注意 :plt.imread() 读取的图像像素值通常在 0~255,但转换为张量后常被归一化到 [0,1] 或 [0,1] 之间。如果图像后缀是png,则默认将像数值归一化到 [0,1]。
卷积神经网络概述
CNN的典型结构
CNN: Convolutional Neural Network)
一个经典的图像分类 CNN 由三部分组成:
| 模块 | 作用 |
|---|---|
| 卷积层 | 提取图像局部特征 |
| 池化层 | 降低特征图尺寸,减少计算量 |
| 全连接层 | 将提取的特征映射到类别输出 |

示意图:输入图像 → [卷积+激活+池化]×n → 全连接层 → 输出类别
卷积层
卷积层是卷积神经网络的核心组件,主要作用是从输入数据(如图像)中自动学习并提取局部特征,如边缘、纹理、形状等。
1. 卷积层主要作用
-
特征提取
-
- 卷积层通过可学习的卷积核自动提取图像特征。
- 浅层卷积核负责边缘、颜色、纹理等低级特征;
- 深层卷积核将这些低级特征组合成形状、物体部件等高级语义特征。
- 这种逐层抽象的能力让网络"理解"图像内容。
-
局部连接
-
- 每个输出神经元只与输入图像上的一个局部区域(即感受野)相连 ,而不是全图。这符合图像"邻近像素关联强、远距离像素关联弱"的自然属性,使得卷积层能高效捕捉局部特征,比如一条斜线或一个角点。
-
权重共享,减少参数量
-
- 同一个卷积核在整个输入图像上滑动时,其权重是固定不变的 。这意味着一个卷积核就能检测同一类特征(如垂直边缘)出现在任何位置。权重共享极大减少了参数量,相比全连接层动辄千万级的参数,卷积层通常只有几千到几十万,训练更快且不易过拟合。
-
平移不变性
-
- 由于权重共享和局部连接,物体在图像中平移后,卷积层输出的特征图也会相应平移,但特征值本身不变。换句话说,无论猫耳朵出现在左上角还是右下角,都能被同一个卷积核检测到。这让模型对物体的位置不那么敏感,泛化能力更强。
2. 核心思想:卷积运算过程
卷积层通过一个可学习的卷积核 (也称为滤波器)在输入数据上滑动,对应位置元素相乘再求和,进行点积运算,生成特征图。这个过程模拟了生物视觉系统对局部信息的敏感度。

3. 关键参数
- 输入 :数据、图像或特征图,形状
(H, W, C_in) - 输入深度:指输入特征图的通道数(例如 RGB 图像的 3)。
- 卷积核(filter) :一个小矩阵,其上的权重是网络通过训练学到的。每个卷积核专门用于检测某一种特定特征。形状
(K, K, C_in),其中K为核大小(常为奇数,如3、5) - **多通道卷积核:**输入通道数必须等于卷积核通道数,各通道分别卷积后相加,产生一个通道的输出。
- 填充(Padding) :在输入数据周围补零 。主要作用是控制输出尺寸,并让边缘像素也能被充分计算(保持图像尺寸,防止边缘信息丢失)。
- 步长(Stride) :卷积核每次滑动的距离 。步长为2会使输出特征图的尺寸减半,常用于降维,步长越大,输出尺寸越小。
- 输出深度(通道数):等于当前卷积层中卷积核的个数。每个卷积核独立提取一种特征,产生一个输出特征图,这些特征图堆叠在一起就形成了输出深度。
- 输出 :特征图,形状
(H_out, W_out, C_out),C_out为卷积核个数
示例:

4. 输出尺寸计算
给定输入尺寸 W,卷积核大小 K,填充 P,步长 S,输出尺寸 O 的计算公式为:
注释:
- 分子 W - K + 2P:表示卷积核在输入上能滑动的有效距离(考虑了填充后输入的有效边长)。
- 2P:是因为填充后,行列数是2倍增长
- 除以 S:确定在这个距离上能放下多少个步长间隔。
- 加 1:因为初始位置(第一个输出点)不计入滑动步数,所以总输出点数 = 滑动步数 + 1。
示例:
输入 32×32,核 3×3,填充 1,步长 1
O=(32−3+2×1)/1+1=32,输出尺寸不变(Same 填充)。
输入 32×32,核 5×5,填充 0,步长 2
O=(32−5+0)/2+1=14.5 → 向下取整 → 14
向下取整,是因为滑动步长必须完整覆盖。公式通常期望结果能整除,否则取 floor。
5. 卷积层的参数数量计算
对于一个卷积层,其可训练参数由两部分组成:卷积核的权重 和 偏置(如果使用)。
注释:
其中:
- Kh,Kw:卷积核的高和宽(通常 Kh=Kw=K)
- Cin:输入特征图的通道数(即上一层输出的深度)
- Cout:本层卷积核的数量(即输出特征图的通道数)
**权重:**每个卷积核是一个Kh × Kw × Cin 的三维张量,它有 Cout 个这样的独立卷积核,因此权重数为 Kh × Kw × Cin × Cout。
**偏置:**每个卷积核对应一个偏置项(一个标量),多通道卷积核共用一个偏置,所以偏置数为 Cout。
示例:
简单灰度图像
-
输入:单通道灰度图,Cin=1
-
卷积层:3×33×3 卷积核,输出 32 个通道,有偏置
-
- 参数=(3×3×1×32)+32=288+32=320
彩色图像,常用卷积层
-
输入:RGB三通道,Cin=3
-
卷积层:3×33×3 卷积核,输出 64 个通道,有偏置
-
- 参数=(3×3×3×64)+64=1728+64=1792
6. PyTorch 卷积层 API
python
import torch.nn as nn
conv = nn.Conv2d(
in_channels = 3, # 输入通道数
out_channels = 3, # 输出通道数
kernel_size = 3, # 卷积核大小
stride = 1, # 步长
padding = 1, # 填充
# dilation = 1, # 膨胀
# groups = 1, # 分组卷积
# bias = True, # 是否有偏置
padding_mode = 'zeros' # 填充模式
)
#
# 正向传播
out = conv(input)
池化层
1. 作用
- 降低特征图尺寸,减少计算量和内存占用。
- 提高模型鲁棒性,对微小平移不敏感。
- 无参数(无需学习),仅计算固定窗口内的统计量。
2. 常见池化方式
- 最大池化(Max Pooling):取窗口内最大值。
- 平均池化(Average Pooling):取窗口内平均值。
3. 多通道处理
池化层对每个通道独立操作,不进行合并,输出通道数 = 输入通道数。

