深度学习卷积神经网络(CNN)实战应用
卷积神经网络(CNN)的核心原理及实战应用。内容包括卷积层和池化层的工作机制,详细讲解了 LeNet-5 经典架构的搭建过程。基于 TensorFlow 框架,使用 MNIST 数据集完成了模型的编译、训练与评估。针对过拟合问题提出了 Dropout 解决方案,并分享了使用 ReLU 激活函数、批量归一化及学习率调整等模型优化技巧,旨在帮助读者掌握 CNN 在图像分类任务中的开发流程与调优方法。

卷积神经网络(CNN)的核心原理及实战应用。内容包括卷积层和池化层的工作机制,详细讲解了 LeNet-5 经典架构的搭建过程。基于 TensorFlow 框架,使用 MNIST 数据集完成了模型的编译、训练与评估。针对过拟合问题提出了 Dropout 解决方案,并分享了使用 ReLU 激活函数、批量归一化及学习率调整等模型优化技巧,旨在帮助读者掌握 CNN 在图像分类任务中的开发流程与调优方法。

学习目标:掌握卷积神经网络的核心原理、经典网络架构,以及在图像分类任务中的实战开发流程。
学习重点:理解卷积层、池化层的工作机制,学会使用 TensorFlow 搭建 CNN 模型并完成训练与评估。
卷积层是 CNN 的核心组件,其作用是通过卷积核对输入图像进行局部特征提取。
卷积核本质是一个小型的权重矩阵。它会按照设定的步长在图像上滑动。每滑动一次,卷积核就会与对应区域的像素值做内积运算,输出一个特征值。
这个过程可以捕捉图像的边缘、纹理等基础特征。
注意:卷积核的数量决定了输出特征图的通道数,数量越多,提取的特征维度越丰富。
import tensorflow as tf
from tensorflow.keras.layers import Conv2D
# 定义卷积层
conv_layer = Conv2D(filters=32, kernel_size=(3,3), strides=(1,1), padding="SAME", input_shape=(28,28,1))
# 模拟输入:1 张 28×28 单通道图像
input_image = tf.random.normal(shape=(1,28,28,1))
# 执行卷积运算
output_feature = conv_layer(input_image)
print("输出特征图形状:", output_feature.shape)
池化层的作用是对卷积层输出的特征图进行降采样。它可以在保留关键特征的同时,减少参数数量和计算量。
常见的池化方式有两种:最大池化和平均池化。
最大池化选取局部区域内的最大值作为输出,能更好保留纹理特征。平均池化选取局部区域的平均值,能保留背景特征。
from tensorflow.keras.layers import MaxPooling2D
# 定义最大池化层
pool_layer = MaxPooling2D(pool_size=(2,2), strides=(2,2), padding="SAME")
# 对卷积层输出的特征图做池化
pool_output = pool_layer(output_feature)
print("池化后特征图形状:", pool_output.shape)
LeNet-5 是由 Yann LeCun 提出的经典卷积神经网络。它专门用于手写数字识别任务,奠定了现代 CNN 的基础架构。
LeNet-5 的结构分为 5 层:2 个卷积层、2 个池化层、1 个全连接层,最后通过 Softmax 输出分类结果。
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Flatten, Dense
# 搭建 LeNet-5 模型
lenet5 = Sequential([
# 卷积层 1:6 个 5×5 卷积核,步长 1,无填充
Conv2D(filters=6, kernel_size=(5,5), strides=(1,1), padding="VALID", input_shape=(28,28,1), activation="tanh"),
# 池化层 1:2×2 最大池化,步长 2
MaxPooling2D(pool_size=(2,2), strides=(2,2), padding="VALID"),
# 卷积层 2:16 个 5×5 卷积核,步长 1,无填充
Conv2D(filters=16, kernel_size=(5,5), strides=(1,1), padding="VALID", activation="tanh"),
# 池化层 2:2×2 最大池化,步长 2
MaxPooling2D(pool_size=(2,2), strides=(2,2), padding="VALID"),
# 展平层:将特征图转为一维向量
Flatten(),
# 全连接层 1:120 个神经元
Dense(units=120, activation="tanh"),
# 全连接层 2:84 个神经元
Dense(units=84, activation="tanh"),
# 输出层:10 个神经元对应 10 个数字类别,Softmax 激活
Dense(units=10, activation="softmax")
])
# 查看模型结构
lenet5.summary()
本次实战使用 MNIST 手写数字数据集。这个数据集包含 60000 张训练图像和 10000 张测试图像,每张图像都是 28×28 的灰度图。
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
# 1. 加载并预处理数据
(x_train, y_train),(x_test, y_test)= mnist.load_data()
# 归一化:将像素值从 0-255 转为 0-1
x_train = x_train /255.0
x_test = x_test /255.0
# 增加通道维度:(样本数,28, 28) → (样本数,28, 28, 1)
x_train = tf.expand_dims(x_train, axis=-1)
x_test = tf.expand_dims(x_test, axis=-1)
# 标签独热编码
y_train = to_categorical(y_train, num_classes=10)
y_test = to_categorical(y_test, num_classes=10)
# 2. 编译模型
lenet5.compile(optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"])
# 3. 训练模型
history = lenet5.fit(x_train, y_train, batch_size=32, epochs=10, validation_split=0.1)
# 4. 评估模型
test_loss, test_acc = lenet5.evaluate(x_test, y_test)
print(f"测试集准确率:{test_acc:.4f}")
问题:训练过程中,训练集准确率持续上升,但验证集准确率出现下降。这就是过拟合现象。
解决方案:加入Dropout 层随机丢弃部分神经元,防止模型过度依赖某些特征。
在全连接层后加入 Dropout 层的示例代码:
from tensorflow.keras.layers import Dropout
# 修改模型,加入 Dropout 层
lenet5_with_dropout = Sequential([
Conv2D(6,(5,5), strides=1, padding="VALID", input_shape=(28,28,1), activation="tanh"),
MaxPooling2D((2,2), strides=2, padding="VALID"),
Conv2D(16,(5,5), strides=1, padding="VALID", activation="tanh"),
MaxPooling2D((2,2), strides=2, padding="VALID"),
Flatten(),
Dense(120, activation="tanh"),
Dropout(0.2),# 丢弃 20% 的神经元
Dense(84, activation="tanh"),
Dropout(0.2),
Dense(10, activation="softmax")
])
lenet5_with_dropout.compile(optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"])
技巧 1:使用ReLU 激活函数替换 tanh 函数。ReLU 能缓解梯度消失问题,加速模型收敛。
技巧 2:使用批量归一化(BatchNormalization)。它可以使每一层的输入分布更稳定,提升训练效率。
技巧 3:调整学习率。使用学习率衰减策略,在训练后期降低学习率,让模型更精准收敛。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online