神经网络与深度学习 第二周知识总结
卷积神经网络通过“局部感受野”、“参数共享”和“池化降采样”三大核心机制,大幅减少了模型参数、提升了对平移不变性的鲁棒性,并能逐层抽象图像特征。从最简单的 LeNet-5 到深度的 ResNet,CNN 网络结构不断演进,引入了更深、更宽或带有“跳跃连接”的模块,以解决梯度消失与模型过拟合等挑战。在实践中,借助 PyTorch、TensorFlow 等深度学习框架,开发者可快速搭建网络、加载数据集、可视化中间特征,并采用 SGD、Adam 等优化算法高效训练模型。以下各节将详细剖析这些内容。
一、CNN 的核心思想与动机
1. 全连接网络的瓶颈
-
海量参数:若输入 32×32×3(CIFAR-10 图像)展平后连到 1000 个隐藏单元,需要 32×32×3×1000 ≈ 3.07 亿个权重,计算和存储代价极高。
-
弱平移不变性:全连接层对输入空间的位置敏感,同一样本的微小平移会完全改变中间激活。
-
难收敛与易过拟合:参数量巨大,梯度传播路径长,训练时易陷局部极小且泛化能力弱。
2. 局部感受野与参数共享
-
局部感受野:每个卷积核只关注局部小窗口(如 3×3 或 5×5),模仿生物视觉皮层;
-
参数共享:一组卷积核在整张图像上滑动共用同一套权重,大幅减少参数;
-
平移不变性:同一特征无论出现在图像何处,都能被同一个卷积核检测到。
二、CNN 的基本组件
1. 卷积层(Convolutional Layer)
-
运算原理:对输入 XX 与卷积核 WW 做滑动点积,然后加偏置 bb,即
Yi,j,k=∑c=1C∑u=1K∑v=1KWk,c,u,v Xi+u−1, j+v−1, c+bk Y_{i,j,k} = \sum_{c=1}^{C} \sum_{u=1}^{K} \sum_{v=1}^{K} W_{k,c,u,v} , X_{i+u-1,,j+v-1,,c} + b_k
-
超参数
-
核大小(Kernel Size):常用 3×3、5×5;
-
填充(Padding):‘valid’(无填充)与‘same’(零填充保证输出尺寸与输入相同);
-
步长(Stride):卷积核移动的步幅,影响输出尺寸;
-
-
输出维度计算(单通道输入)
Hout=⌊Hin+2P−KS⌋+1,Wout=⌊Win+2P−KS⌋+1 H_{\text{out}} = \left\lfloor \frac{H_{\text{in}} + 2P - K}{S} \right\rfloor + 1,\quad W_{\text{out}} = \left\lfloor \frac{W_{\text{in}} + 2P - K}{S} \right\rfloor + 1
2. 激活函数(Activation)
-
ReLU:f(x)=max(0,x)f(x)=\max(0,x),收敛快、抑制梯度消失;
-
Sigmoid/Tanh:易饱和、梯度小,通常只在浅层或特定场景中使用;
-
Leaky ReLU、ELU:对负值保留少量通路,缓解“神经元死亡”。
3. 池化层(Pooling)
-
最大池化(Max Pooling):取窗口内最大值;
-
平均池化(Average Pooling):取窗口内平均值;
-
功能:降维降噪、扩大感受野、减少计算量和过拟合。
4. 归一化层(BatchNorm / LayerNorm)
-
BatchNorm:对 mini-batch 内每个通道作均值-方差归一化,然后线性变换,可加速收敛并有轻微正则化效果;
-
LayerNorm / GroupNorm:对单个样本不同维度归一化,适用于小批量或 RNN 场景。
5. 全连接层(Fully-Connected)
- 将前面提取到的多维特征展平,输入若干全连接层进行分类或回归。
三、经典 CNN 架构演进
1. LeNet-5(1998)
-
结构:
-
C1: Conv(1→6, 5×5, p=2) → Sigmoid
-
S2: AvgPool(2×2, s=2)
-
C3: Conv(6→16, 5×5) → Sigmoid
-
S4: AvgPool(2×2, s=2)
-
Flatten → FC(400→120) → Sigmoid → FC(120→84) → Sigmoid → FC(84→10)
-
-
贡献:首个端到端学习的手写数字识别模型。
2. AlexNet(2012)
-
改进:ReLU 激活、Dropout 随机失活、LRN(局部响应归一化)、数据增强。
-
规模:5 层卷积 + 3 层全连接,总参数约 6000 万。
3. VGG(2014)
-
策略:使用一系列连续的 3×3 卷积核堆叠代替大核,保持感受野,同时参数可控;
-
典型网络:VGG-16(16 层权重层),结构简单规整,性能与灵活性兼顾。
4. Inception(2014)、GoogLeNet
-
Inception 模块:并行多种尺寸卷积(1×1、3×3、5×5)和池化,再 concat;
-
1×1 卷积:先降维减少计算,再做大核卷积。
5. ResNet(2015)
-
残差块:添加恒等“短路”路径,学习残差 F(x)=H(x)−x\mathcal{F}(x)=H(x)-x,极大缓解梯度消失;
-
深度可扩展:Ordinary ResNet-50/101/152 可训练上百层网络。
6. DenseNet(2017)
- 密集连接:每层接收所有前面层的输出,特征复用更充分,参数更节省。
四、训练细节与优化策略
1. 数据预处理与增强
-
标准化:减去均值、除以标准差;
-
增强:随机裁剪、翻转、旋转、色彩抖动、CutMix、MixUp 等。
2. 优化器与学习率调度
-
优化器:SGD + Momentum、Adam、RMSProp;
-
LR 调度:StepLR、Cosine Annealing、Warmup、OneCycle。
3. 正则化技术
-
Dropout:随机屏蔽部分神经元;
-
权重衰减(L2 正则):惩罚大权重;
-
早停(Early Stopping):监控验证集性能避免过拟合。
4. 可视化与调试
-
TensorBoard / Visdom:监控 loss、accuracy、LR;
-
CAM / Grad-CAM:热力图可视化网络关注区域;
-
Netron:查看模型图与参数分布。
五、PyTorch 上手示例
1. 定义网络(以简化版 VGG-like 为例)
import torch.nn as nn
class SimpleVGG(nn.Module):
def __init__(self, num_classes=10):
super().__init__()
self.features = nn.Sequential(
# Block 1
nn.Conv2d(3, 64, kernel_size=3, padding=1), nn.ReLU(inplace=True),
nn.Conv2d(64, 64, kernel_size=3, padding=1), nn.ReLU(inplace=True),
nn.MaxPool2d(2, 2),
# Block 2
nn.Conv2d(64, 128, kernel_size=3, padding=1), nn.ReLU(inplace=True),
nn.Conv2d(128, 128, kernel_size=3, padding=1), nn.ReLU(inplace=True),
nn.MaxPool2d(2, 2),
)
self.classifier = nn.Sequential(
nn.Flatten(),
nn.Linear(128 * 8 * 8, 256), nn.ReLU(inplace=True),
nn.Dropout(0.5),
nn.Linear(256, num_classes)
)
def forward(self, x):
x = self.features(x)
return self.classifier(x)
2. 数据加载与训练循环
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
# 数据增强与归一化
transform = transforms.Compose([
transforms.RandomHorizontalFlip(),
transforms.RandomCrop(32, padding=4),
transforms.ToTensor(),
transforms.Normalize((0.5,0.5,0.5), (0.5,0.5,0.5))
])
train_ds = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
train_loader = DataLoader(train_ds, batch_size=128, shuffle=True, num_workers=4)
model = SimpleVGG(num_classes=10).to(device)
optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9, weight_decay=5e-4)
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=200)
criterion = nn.CrossEntropyLoss()
for epoch in range(1, 201):
model.train()
for imgs, labels in train_loader:
imgs, labels = imgs.to(device), labels.to(device)
preds = model(imgs)
loss = criterion(preds, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
scheduler.step()
# …记录日志、验证、早停判断等
六、常用数据集概览
| 数据集 | 样本数(训练/测试) | 图像尺寸 | 类别数 | 典型应用 |
|---|---|---|---|---|
| MNIST | 60,000 / 10,000 | 28×28×1 | 10 | 手写数字识别 |
| Fashion-MNIST | 60,000 / 10,000 | 28×28×1 | 10 | 服饰分类 |
| CIFAR-10 | 50,000 / 10,000 | 32×32×3 | 10 | 基础图像分类 |
| CIFAR-100 | 50,000 / 10,000 | 32×32×3 | 100 | 细粒度分类 |
| PASCAL VOC | ~10,000 | 可变 | 20 | 目标检测/分割 |
| MS COCO | >120,000 | 可变 | 80 | 检测/分割/关键点 |
| ImageNet | 1,281,167 / 50,000 | 可变 | 1000 | 大规模分类 |
七、扩展方向与前沿趋势
-
轻量化模型:MobileNet、ShuffleNet、GhostNet 等,适合移动端与嵌入式设备。
-
注意力机制:SENet、CBAM、Non-Local 模块,动态调整通道或空间权重。
-
Transformer 融合:Vision Transformer(ViT)、Swin Transformer,将全局自注意力引入视觉建模。
-
自监督学习:MoCo、SimCLR、BYOL,减少对标注数据的依赖。
更多推荐


所有评论(0)