摘要
本文将通过解剖CNN的五大核心组件,实现图像分类全流程:
- 卷积运算本质:局部感受野与参数共享的数学表达
- 特征图可视化:直观展示不同卷积核的提取效果
- 池化层对比实验:MaxPooling vs AveragePooling
- 经典网络复现:用Keras搭建简化版VGG16
- 迁移学习实战:COVID-19肺部CT影像诊断
目录
- 卷积核工作原理图解
- CNN五大核心层详解
- 特征图可视化实验
- 实战:CIFAR-10分类模型
- 模型压缩技巧
1. 卷积核工作原理图解
卷积运算流程图
graph TB
A[输入图像] --> B[3x3卷积核]
B --> C[滑动窗口计算]
C --> D[特征图]
style A fill:#f9f,stroke:#333
style D fill:#bbf,stroke:#f66
数学表达式:
卷积参数计算表
| 参数类型 | 计算公式 | 示例(输入224x224x3,32个3x3卷积核) |
|---|---|---|
| 参数量 | 3×3×3×32 = 864 | |
| 输出特征图尺寸 | 224-3+0)/1 +1 = 222 |
2. CNN五大核心层详解
层级功能对比表
| 层类型 | 作用 | 超参数 | 输出变化 |
|---|---|---|---|
| 卷积层 | 特征提取 | kernel_size, filters | 通道数改变 |
| 池化层 | 降维抗噪 | pool_size | 宽高减半 |
| 激活层 | 引入非线性 | - | 尺寸不变 |
| BN层 | 加速收敛 | - | 尺寸不变 |
| 全连接层 | 分类决策 | units | 变为1D向量 |
经典CNN架构示例
from tensorflow.keras import layers
model = Sequential([
# 特征提取块
layers.Conv2D(32, (3,3), activation='relu', input_shape=(32,32,3)),
layers.MaxPooling2D((2,2)),
layers.Conv2D(64, (3,3), activation='relu'),
# 分类决策块
layers.Flatten(),
layers.Dense(64, activation='relu'),
layers.Dense(10) # CIFAR-10有10类
])
3. 特征图可视化实验
可视化代码
import tensorflow as tf
import matplotlib.pyplot as plt
# 获取第一层卷积核输出
conv_layer = model.layers[0]
visual_model = tf.keras.models.Model(inputs=model.inputs, outputs=conv_layer.output)
# 显示前6个特征图
feature_maps = visual_model.predict(img_array)
plt.figure(figsize=(10,5))
for i in range(6):
plt.subplot(2,3,i+1)
plt.imshow(feature_maps[0,:,:,i], cmap='viridis')
不同卷积核效果对比:
| 卷积核类型 | 边缘检测 | 纹理增强 | 模糊效果 |
|---|---|---|---|
| Sobel算子 | ✔️ | ✖️ | ✖️ |
| Gaussian模糊 | ✖️ | ✖️ | ✔️ |
| Gabor滤波器 | ✔️ | ✔️ | ✖️ |
4. 实战:CIFAR-10分类模型
数据增强流程
graph LR
A[原始图像] --> B[随机旋转±15°]
B --> C[水平翻转]
C --> D[亮度调整]
D --> E[训练数据]
训练结果对比
| 模型配置 | 测试准确率 | 参数量 |
|---|---|---|
| 基础CNN | 72.3% | 1.2M |
| +数据增强 | 78.6% | 1.2M |
| +残差连接 | 81.2% | 1.8M |
5. 模型压缩技巧
轻量化方法对比
| 技术 | 原理 | 压缩率 | 精度损失 |
|---|---|---|---|
| 深度可分离卷积 | 分离空间/通道卷积 | 8-9x | <2% |
| 知识蒸馏 | 小模型学习大模型输出 | 2-4x | <1% |
| 参数量化 | FP32→INT8 | 4x | 1-3% |
MobileNet实现示例
from tensorflow.keras.applications import MobileNetV2
base_model = MobileNetV2(input_shape=(32,32,3), include_top=False)
base_model.trainable = False # 冻结权重
下一篇预告
Day 8:循环神经网络(RNN)与LSTM——时序数据处理
"用LSTM预测股票走势?先搞懂时间序列的'记忆'机制!"
关键公式速查表
需要增加哪些具体案例的详细实现步骤?例如:
- 医学影像分割的U-Net实现
- 目标检测的YOLO简化版
- 风格迁移的Gram矩阵应用