卷积神经网络 CNN
卷积神经网络(Convolutional Neural Network, CNN)是处理图像、视频、语音频谱等网格数据的经典模型。它通过局部感受野、参数共享和逐层抽象,把像素级输入转换成边缘、纹理、局部形状和高级语义特征。
本章使用 TensorFlow/Keras 搭建一个完整 CNN,并说明每个模块的作用、常见调参方法和排错思路。
适用场景
CNN 常用于:
- 图像分类:判断图片属于猫、狗、车辆、植物等类别
- 目标检测:定位并识别图片中的多个对象
- 图像分割:为每个像素预测类别
- 医学影像:辅助识别病灶、器官区域或异常模式
- 时序或文本特征图:把一维序列转成局部模式学习问题
如果数据存在明显的局部结构,并且相邻位置之间有关系,CNN 往往是很好的起点。
核心层
Conv2D
Conv2D 使用多个卷积核在图像上滑动,提取局部特征。
关键参数:
filters:卷积核数量,决定输出通道数kernel_size:卷积核大小,常见为3x3padding="same":保持特征图尺寸,便于堆叠多层activation="relu":引入非线性能力
MaxPooling2D
池化层降低特征图尺寸,减少计算量,并增强局部平移鲁棒性。
Dropout
Dropout 在训练时随机关闭一部分神经元,降低过拟合风险。
Dense
卷积层负责提取特征,最后通常使用全连接层完成分类。
构建一个基础 CNN
下面以 CIFAR-10 为例。CIFAR-10 包含 10 类彩色图片,每张图片大小为 32x32x3。
这里使用 GlobalAveragePooling2D 替代 Flatten,可以减少参数量,让模型更不容易过拟合。
训练模型
EarlyStopping 能在验证集效果不再提升时停止训练;ReduceLROnPlateau 会在验证损失停滞时降低学习率。
加入数据增强
图像数据增强可以让模型见到更多变体,常用于提升泛化能力。
对于真实项目,推荐把数据增强放在模型或 tf.data 管道中,并只在训练阶段启用。
训练曲线诊断
训练完成后应检查训练集和验证集曲线。
常见现象:
- 训练准确率高、验证准确率低:过拟合,增加数据增强、Dropout 或正则化
- 两条曲线都低:欠拟合,增加模型容量、训练轮次或改善输入特征
- 验证损失震荡明显:学习率可能过高,或 batch size 太小
- 训练很慢:检查是否使用 GPU,并优化输入管道
常见改进
- 使用更深的网络结构,例如 ResNet、EfficientNet、MobileNet。
- 使用迁移学习,用预训练模型作为特征提取器。
- 增加数据增强,但避免破坏标签语义。
- 使用
BatchNormalization稳定训练。 - 对类别不均衡数据使用 class weight 或重采样。
小结
CNN 的基本套路是:卷积提取局部特征,池化降低空间尺寸,正则化减少过拟合,最后用分类层输出类别概率。掌握这一章后,可以继续学习图像分类、迁移学习和模型部署,把 CNN 应用到真实图片任务中。