📚 课程目录

第8课:卷积操作原理

📖 本课概述

卷积神经网络(CNN)是计算机视觉的基石。本课从卷积的数学定义出发,理解卷积核、步长、填充等核心概念,并用PyTorch验证。

🔍 一、卷积的数学定义

1.1 连续卷积

(f * g)(t) = ∫ f(τ)g(t-τ)dτ

注意:一个函数翻转后滑动相乘积分

1.2 离散卷积(互相关)

Y[i,j] = Σₘ Σₙ X[i+m, j+n] · K[m,n]

深度学习中实际用的是互相关(cross-correlation),不翻转核

📐 二、卷积的关键参数

参数含义影响
kernel_size卷积核大小感受野
stride步长输出尺寸
padding填充边界处理
dilation膨胀扩大感受野

输出尺寸 = ⌊(输入尺寸 + 2×padding - dilation×(kernel-1) - 1) / stride⌋ + 1

2.1 PyTorch验证卷积操作


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

# 卷积操作详解
print("=== 卷积参数计算 ===")
# 输入1×5×5,3×3卷积核
x = torch.arange(25, dtype=torch.float32).reshape(1, 1, 5, 5)
print(f"输入张量: shape={x.shape}")
print(x.reshape(5, 5))

# 基本卷积
conv = nn.Conv2d(1, 1, kernel_size=3, bias=False)
with torch.no_grad():
    conv.weight[:] = torch.ones(1, 1, 3, 3) / 9  # 均值滤波器
out = conv(x)
print(f"\n3×3卷积(无padding): 输出shape={out.shape}")
print(out.reshape(3, 3).detach())

# 带padding
conv_pad = nn.Conv2d(1, 1, kernel_size=3, padding=1, bias=False)
with torch.no_grad():
    conv_pad.weight[:] = torch.ones(1, 1, 3, 3) / 9
out_pad = conv_pad(x)
print(f"\n3×3卷积(padding=1): 输出shape={out_pad.shape}")

# 带stride
conv_stride = nn.Conv2d(1, 1, kernel_size=3, stride=2, bias=False)
with torch.no_grad():
    conv_stride.weight[:] = torch.ones(1, 1, 3, 3) / 9
out_stride = conv_stride(x)
print(f"3×3卷积(stride=2): 输出shape={out_stride.shape}")

# 多通道卷积
x_rgb = torch.randn(1, 3, 32, 32)
conv_multi = nn.Conv2d(3, 16, kernel_size=3, padding=1)
out_multi = conv_multi(x_rgb)
print(f"\n3通道→16通道 3×3卷积: {x_rgb.shape} → {out_multi.shape}")
print(f"参数量: 3×16×3×3 + 16 = {3*16*3*3 + 16}")

# 输出尺寸公式验证
print("\n=== 输出尺寸公式验证 ===")
formulas = [
    ("7×7, k=3, s=1, p=0", 7, 3, 1, 0),
    ("7×7, k=3, s=1, p=1", 7, 3, 1, 1),
    ("7×7, k=3, s=2, p=0", 7, 3, 2, 0),
    ("7×7, k=3, s=2, p=1", 7, 3, 2, 1),
    ("32×32, k=5, s=1, p=2", 32, 5, 1, 2),
]
for desc, inp, k, s, p in formulas:
    out_size = (inp + 2*p - k) // s + 1
    actual = nn.Conv2d(1, 1, k, s, p)(torch.randn(1, 1, inp, inp)).shape[-1]
    print(f"{desc}: 公式={out_size}, 实际={actual}, {'✓' if out_size==actual else '✗'}")
🟢 运行结果 ✅验证通过 === 卷积参数计算 === 输入张量: shape=torch.Size([1, 1, 5, 5]) tensor([[ 0., 1., 2., 3., 4.], [ 5., 6., 7., 8., 9.], [10., 11., 12., 13., 14.], [15., 16., 17., 18., 19.], [20., 21., 22., 23., 24.]]) 3×3卷积(无padding): 输出shape=torch.Size([1, 1, 3, 3]) tensor([[ 6.0000, 7.0000, 8.0000], [11.0000, 12.0000, 13.0000], [16.0000, 17.0000, 18.0000]]) 3×3卷积(padding=1): 输出shape=torch.Size([1, 1, 5, 5]) 3×3卷积(stride=2): 输出shape=torch.Size([1, 1, 2, 2]) 3通道→16通道 3×3卷积: torch.Size([1, 3, 32, 32]) → torch.Size([1, 16, 32, 32]) 参数量: 3×16×3×3 + 16 = 448 === 输出尺寸公式验证 === 7×7, k=3, s=1, p=0: 公式=5, 实际=5, ✓ 7×7, k=3, s=1, p=1: 公式=7, 实际=7, ✓ 7×7, k=3, s=2, p=0: 公式=3, 实际=3, ✓ 7×7, k=3, s=2, p=1: 公式=4, 实际=4, ✓ 32×32, k=5, s=1, p=2: 公式=32, 实际=32, ✓

🔬 三、卷积的深入理解

3.1 卷积 vs 全连接

特性全连接卷积
参数量输入×输出核大小×通道数
连接模式全连接局部连接
权重共享有(同一核在所有位置)
平移不变性
适合数据结构化数据图像/时序

一个3×3卷积核只有9个参数,但能在整张图上滑动检测同一模式——这就是权重共享的威力。

3.2 感受野计算

单层3×3卷积:感受野 = 3

两层3×3卷积:感受野 = 5

三层3×3卷积:感受野 = 7

通用公式:RF_l = RF_{l-1} + (k_l - 1) × ∏_{i=1}^{l-1} s_i

深层网络通过逐层累积,最终每个输出单元可以"看到"很大区域

3.3 分组卷积与深度可分离卷积

标准卷积:输入C_in → 输出C_out,参数 = k²×C_in×C_out

分组卷积:将通道分成g组,每组独立卷积,参数减少到 1/g

深度可分离卷积 = 深度卷积(C_in组) + 逐点卷积(1×1)

参数比 = 1/C_out + 1/k² (MobileNet的核心)

📖 四、延伸阅读

💡 推荐资源:

📝 练习

练习1:自定义卷积核

实现Sobel边缘检测核和锐化核,对图像应用并观察效果。

练习2:空洞卷积

实现dilation=2的卷积,对比感受野和参数量。

练习3:深度可分离卷积

实现MobileNet的深度可分离卷积,计算参数量节省比例。

💡 五、卷积的工程实践

5.1 卷积参数选择指南

场景kernel_sizestridepadding
特征提取(不降采样)311
降采样321
大感受野5或712或3
1×1卷积(降维)110
全局信息等于输入尺寸10

5.2 特征图尺寸变化追踪

在构建CNN时,追踪每一层的特征图尺寸至关重要。常见错误:

💡 建议:在forward函数中加入assert检查,或打印每层输出shape调试。

🔬 深度拓展:从理论到实践

核心概念网络

理解本课内容需要将其置于更大的知识网络中。每个核心概念都不是孤立的,它们相互关联、相互支撑:

关键洞察与直觉

建立正确的直觉比记住公式更重要:

1. 维度直觉:高维空间中,数据分布与低维直觉截然不同(维度诅咒)

2. 信息瓶颈:神经网络逐层压缩信息,保留任务相关的、丢弃无关的

3. 流形假设:高维数据实际分布在低维流形上,学习即发现流形结构

4. 偏差-方差权衡:简单模型欠拟合(高偏差),复杂模型过拟合(高方差)

与其他课程的关联

本课作为CNN阶段的核心内容,与前后课程紧密关联:

关联课程关联点协同效应
前序课程提供了本课的基础知识循序渐进的理解
后续课程本课内容是后续的基础逐步构建能力
平行课程同一阶段的互补知识多角度深入理解
实战项目综合运用所有知识理论与实践结合

面试常见问题

💡 准备面试时,确保能回答以下问题:

  1. 用简单语言解释本课核心概念
  2. 画出关键算法/结构的流程图
  3. 比较不同方法的优缺点
  4. 举出实际应用场景
  5. 讨论常见误解和注意事项

进阶学习路径

掌握本课内容后,可以通过以下方式继续深入:

📐 补充:知识体系梳理

核心公式速查

将本课涉及的关键公式整理如下,方便回顾和记忆。理解每个公式背后的直觉比死记硬背更重要——试着用自然语言解释每个公式在做什么。

易混淆概念辨析

概念A概念B关键区别
参数超参数参数通过训练学习,超参数需要手动设定
训练误差泛化误差训练误差衡量拟合程度,泛化误差衡量预测能力
偏差方差偏差是系统性误差,方差是随机波动
L1正则L2正则L1产生稀疏解,L2产生平滑解
BatchNormLayerNormBN沿batch维度,LN沿特征维度

代码模板

以下是本课核心概念的标准PyTorch实现模板,可以直接用于实际项目:

💡 调试建议:当结果不符合预期时,先检查数据,再检查损失函数,最后检查模型结构。90%的问题出在前两个环节。

👁️

成就解锁:视觉工程师

卷积是CNN的灵魂——你已经理解了计算机视觉的基础操作!