深度学习实战:利用TensorFlow构建卷积神经网络(CNN)

[复制链接]
发表于 2025-10-24 18:32:31 | 显示全部楼层 |阅读模式
在前两篇文章中,我们从零开始构建了简单的神经网络,并徐徐扩展到多层神经网络。这些网络在处置处罚简单的数据集(如鸢尾花数据集)时表现出色。然而,对于更复杂的任务,如图像分类,我们必要更强盛的模子结构。本日,我们将先容卷积神经网络(CNN),这是一种专门用于处置处罚图像数据的深度学习模子。
  

1. 卷积神经网络(CNN)简介

卷积神经网络(CNN)是深度学习中一种非常告急的网络结构,广泛应用于图像辨认、视频分析和天然语言处置处罚等范畴。CNN的核心头脑是利用卷积层(Convolutional Layer)和池化层(Pooling Layer)主动提取图像的局部特性,从而淘汰人工特性工程的需求。
1.1 CNN的劈头

CNN的灵感泉源于生物视觉体系的研究。生物视觉体系通过多层神经元处置处罚视觉信息,每一层负责提取差异条理的特性。CNN模拟了这种结构,通过多层卷积和池化操纵徐徐提取图像的特性。
1.2 CNN的告急组件

CNN告急由以下几部门构成:


  • 卷积层(Convolutional Layer):通过卷积操纵提取图像的局部特性。
  • 池化层(Pooling Layer):通过下采样操纵淘汰特性的维度,同时生存告急信息。
  • 全毗连层(Fully Connected Layer:将提取的特性用于分类或回归任务。
1.3 卷积操纵

卷积操纵是CNN的核心。它通过一个滑动窗口(称为卷积核)在输入图像上滑动,盘算卷积核与图像局部地域的点积,从而天生新的特性图(Feature Map)。卷积操纵可以提取图像的边沿、纹理等局部特性。
1.4 池化操纵

池化操纵是一种下采样技能,用于淘汰特性图的维度,同时生存告急信息。常见的池化方法包罗最大池化(Max Pooling)宁静均池化(Average Pooling)。
2. 构建卷积神经网络

接下来,我们将利用TensorFlow框架构建一个卷积神经网络,并用它办理MNIST手写数字辨认任务。MNIST是一个经典的手写数字数据集,包罗60,000张训练图像和10,000张测试图像,每张图像的巨细为28×28像素。
2.1 安装TensorFlow

在开始之前,请确保你已经安装了TensorFlow。假如尚未安装,可以通过以下下令安装:
  1. pip install tensorflow
复制代码
2.2 数据准备

MNIST数据集是TensorFlow中内置的数据集,可以直接加载。
  1. import tensorflow as tf
  2. from tensorflow.keras import layers, models
  3. from tensorflow.keras.datasets import mnist
  4. from tensorflow.keras.utils import to_categorical
  5. # 加载MNIST数据集
  6. (x_train, y_train), (x_test, y_test) = mnist.load_data()
  7. # 数据预处理
  8. x_train = x_train.reshape((60000, 28, 28, 1)).astype('float32') / 255
  9. x_test = x_test.reshape((10000, 28, 28, 1)).astype('float32') / 255
  10. # 将标签转换为独热编码
  11. y_train = to_categorical(y_train, 10)
  12. y_test = to_categorical(y_test, 10)
复制代码
2.3 构建CNN模子

我们将构建一个包罗两个卷积层和两个池化层的CNN模子。
  1. # 构建CNN模型
  2. model = models.Sequential()
  3. # 第一个卷积层
  4. model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
  5. model.add(layers.MaxPooling2D((2, 2)))
  6. # 第二个卷积层
  7. model.add(layers.Conv2D(64, (3, 3), activation='relu'))
  8. model.add(layers.MaxPooling2D((2, 2)))
  9. # 展平层
  10. model.add(layers.Flatten())
  11. # 全连接层
  12. model.add(layers.Dense(64, activation='relu'))
  13. # 输出层
  14. model.add(layers.Dense(10, activation='softmax'))
  15. # 编译模型
  16. model.compile(optimizer='adam',
  17.               loss='categorical_crossentropy',
  18.               metrics=['accuracy'])
  19. # 打印模型结构
  20. model.summary()
复制代码
2.4 训练模子

接下来,我们将利用训练数据训练CNN模子。
  1. # 训练模型
  2. history = model.fit(x_train, y_train, epochs=10, batch_size=64, validation_split=0.2)
复制代码
2.5 评估模子

训练完成后,我们将利用测试数据评估模子的性能
  1. # 评估模型
  2. test_loss, test_acc = model.evaluate(x_test, y_test)
  3. print(f"Test Accuracy: {test_acc:.4f}")
复制代码
2.6 可视化训练过程

为了更好地明确模子的训练过程,我们可以绘制训练和验证的正确率曲线。
  1. import matplotlib.pyplot as plt
  2. # 绘制训练和验证的准确率曲线
  3. plt.plot(history.history['accuracy'], label='Training Accuracy')
  4. plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
  5. plt.xlabel('Epochs')
  6. plt.ylabel('Accuracy')
  7. plt.legend()
  8. plt.show()
复制代码
3. CNN的高级特性

3.1 数据增强

数据增强是一种通过天生更多训练数据来进步模子泛化本领的技能。在图像分类任务中,常见的数据增强方法包罗旋转、平移、缩放和裁剪。
TensorFlow提供了ImageDataGenerator类,可以方便地实现数据增强。
  1. from tensorflow.keras.preprocessing.image import ImageDataGenerator
  2. # 定义数据增强
  3. datagen = ImageDataGenerator(
  4.     rotation_range=10,
  5.     width_shift_range=0.1,
  6.     height_shift_range=0.1,
  7.     shear_range=0.1,
  8.     zoom_range=0.1,
  9.     horizontal_flip=True,
  10.     fill_mode='nearest'
  11. )
  12. # 应用数据增强
  13. datagen.fit(x_train)
  14. # 使用数据增强训练模型
  15. history = model.fit(datagen.flow(x_train, y_train, batch_size=64),
  16.                     epochs=10,
  17.                     validation_data=(x_test, y_test))
复制代码
3.2 Dropout

Dropout是一种常用的正则化技能,通过在训练过程中随机抛弃一部门神经元的输出,防止神经元之间的共顺应,从而进步模子的泛化本领。
  1. # 在模子中添加Dropoutmodel = models.Sequential()model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))model.add(layers.MaxPooling2D((2, 2)))model.add(layers.Dropout(0.25))  # 添加Dropoutmodel.add(layers.Conv2D(64, (3, 3), activation='relu'))model.add(layers.MaxPooling2D((2, 2)))model.add(layers.Dropout(0.25))  # 添加Dropoutmodel.add(layers.Flatten())model.add(layers.Dense(64, activation='relu'))model.add(layers.Dropout(0.5))  # 添加Dropoutmodel.add(layers.Dense(10, activation='softmax'))# 编译模子model.compile(optimizer='adam',              loss='categorical_crossentropy',              metrics=['accuracy'])# 训练模型
  2. history = model.fit(x_train, y_train, epochs=10, batch_size=64, validation_split=0.2)
复制代码
3.3 Batch Normalization

Batch Normalization是一种通过标准化每一层的输入来加速训练并进步模子性能的技能。它可以资助缓解梯度消散和梯度爆炸题目。
  1. # 在模子中添加Batch Normalizationmodel = models.Sequential()model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))model.add(layers.BatchNormalization())  # 添加Batch Normalizationmodel.add(layers.MaxPooling2D((2, 2)))model.add(layers.Conv2D(64, (3, 3), activation='relu'))model.add(layers.BatchNormalization())  # 添加Batch Normalizationmodel.add(layers.MaxPooling2D((2, 2)))model.add(layers.Flatten())model.add(layers.Dense(64, activation='relu'))model.add(layers.BatchNormalization())  # 添加Batch Normalizationmodel.add(layers.Dense(10, activation='softmax'))# 编译模子model.compile(optimizer='adam',              loss='categorical_crossentropy',              metrics=['accuracy'])# 训练模型
  2. history = model.fit(x_train, y_train, epochs=10, batch_size=64, validation_split=0.2)
复制代码
4. CNN的变体与应用

4.1 LeNet-5

LeNet-5是最早的卷积神经网络之一,由Yann LeCun在1998年提出,用于手写数字辨认。LeNet-5的结构相对简单,包罗两个卷积层和两个全毗连层。
  1. # 构建LeNet-5模子model = models.Sequential()model.add(layers.Conv2D(6, (5, 5), activation='relu', input_shape=(28, 28, 1)))model.add(layers.MaxPooling2D((2, 2)))model.add(layers.Conv2D(16, (5, 5), activation='relu'))model.add(layers.MaxPooling2D((2, 2)))model.add(layers.Flatten())model.add(layers.Dense(120, activation='relu'))model.add(layers.Dense(84, activation='relu'))model.add(layers.Dense(10, activation='softmax'))# 编译模子model.compile(optimizer='adam',              loss='categorical_crossentropy',              metrics=['accuracy'])# 训练模型
  2. history = model.fit(x_train, y_train, epochs=10, batch_size=64, validation_split=0.2)
复制代码
4.2 AlexNet

AlexNet是深度学习范畴的另一个告急里程碑,由Alex Krizhevsky等人在2012年提出。AlexNet在ImageNet角逐中取得了优秀的结果,证实了深度卷积神经网络在图像分类任务中的强盛本领。
AlexNet包罗五个卷积层和三个全毗连层,利用ReLU激活函数和Dropout正则化技能。
  1. # 构建AlexNet模子model = models.Sequential()model.add(layers.Conv2D(96, (11, 11), strides=4, activation='relu', input_shape=(227, 227, 3)))model.add(layers.MaxPooling2D((3, 3), strides=2))model.add(layers.Conv2D(256, (5, 5), padding='same', activation='relu'))model.add(layers.MaxPooling2D((3, 3), strides=2))model.add(layers.Conv2D(384, (3, 3), padding='same', activation='relu'))model.add(layers.Conv2D(384, (3, 3), padding='same', activation='relu'))model.add(layers.Conv2D(256, (3, 3), padding='same', activation='relu'))model.add(layers.MaxPooling2D((3, 3), strides=2))model.add(layers.Flatten())model.add(layers.Dense(4096, activation='relu'))model.add(layers.Dropout(0.5))model.add(layers.Dense(4096, activation='relu'))model.add(layers.Dropout(0.5))model.add(layers.Dense(1000, activation='softmax'))# 编译模子model.compile(optimizer='adam',              loss='categorical_crossentropy',              metrics=['accuracy'])# 训练模型
  2. history = model.fit(x_train, y_train, epochs=10, batch_size=64, validation_split=0.2)
复制代码
4.3 VGGNet

VGGNet是牛津大学视觉多少组(Visual Geometry Group)提出的一种深度卷积神经网络。VGGNet的告急特点是利用了多个3×3的卷积核和2×2的池化核,结构轻便且性能优秀。
  1. # 构建VGGNet模子model = models.Sequential()model.add(layers.Conv2D(64, (3, 3), activation='relu', padding='same', input_shape=(224, 224, 3)))model.add(layers.Conv2D(64, (3, 3), activation='relu', padding='same'))model.add(layers.MaxPooling2D((2, 2), strides=2))model.add(layers.Conv2D(128, (3, 3), activation='relu', padding='same'))model.add(layers.Conv2D(128, (3, 3), activation='relu', padding='same'))model.add(layers.MaxPooling2D((2, 2), strides=2))model.add(layers.Conv2D(256, (3, 3), activation='relu', padding='same'))model.add(layers.Conv2D(256, (3, 3), activation='relu', padding='same'))model.add(layers.Conv2D(256, (3, 3), activation='relu', padding='same'))model.add(layers.MaxPooling2D((2, 2), strides=2))model.add(layers.Conv2D(512, (3, 3), activation='relu', padding='same'))model.add(layers.Conv2D(512, (3, 3), activation='relu', padding='same'))model.add(layers.Conv2D(512, (3, 3), activation='relu', padding='same'))model.add(layers.MaxPooling2D((2, 2), strides=2))model.add(layers.Conv2D(512, (3, 3), activation='relu', padding='same'))model.add(layers.Conv2D(512, (3, 3), activation='relu', padding='same'))model.add(layers.Conv2D(512, (3, 3), activation='relu', padding='same'))model.add(layers.MaxPooling2D((2, 2), strides=2))model.add(layers.Flatten())model.add(layers.Dense(4096, activation='relu'))model.add(layers.Dropout(0.5))model.add(layers.Dense(4096, activation='relu'))model.add(layers.Dropout(0.5))model.add(layers.Dense(1000, activation='softmax'))# 编译模子model.compile(optimizer='adam',              loss='categorical_crossentropy',              metrics=['accuracy'])# 训练模型
  2. history = model.fit(x_train, y_train, epochs=10, batch_size=64, validation_split=0.2)
复制代码
6. 小结

在本篇文章中,我们详细先容了卷积神经网络(CNN)的根本原理、结构和实现方法。通过TensorFlow框架,我们构建了一个CNN模子,并用它办理了MNIST手写数字辨认任务。我们还先容了CNN的高级特性,如数据增强、Dropout和Batch Normalization,以及几种经典的CNN架构,如LeNet-5、AlexNet和VGGNet。
盼望这篇文章能资助你更好地明确卷积神经网络的原理和应用。在下一篇文章中,我们将进一步深入,探索循环神经网络(RNN)及其变体,如优劣期影象网络(LSTM)和门控循环单位(GRU),并应用于天然语言处置处罚任务。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表