当前位置: 首页 > article >正文

机器学习实战(10):深度学习初探——卷积神经网络(CNN)


  • 机器学习中的神经网络部分是大模型LLM训练的基础之基础,熟练掌握这一部分的知识和基础技能对后续理解大模型原理至关重要!

第10集:深度学习初探——卷积神经网络(CNN)

在深度学习领域,卷积神经网络(Convolutional Neural Networks, CNN) 是图像识别和分类任务的核心技术。与传统的全连接神经网络相比,CNN 通过卷积层、池化层等结构提取图像的空间特征,从而显著提高了性能。今天我们将深入探讨 CNN 的基本原理,并通过实践部分使用 CIFAR-10 数据集 构建一个卷积神经网络进行图像分类。


卷积层、池化层与全连接层

1. 卷积层(Convolutional Layer)

卷积层是 CNN 的核心组件,用于提取图像的局部特征。其工作原理如下:

  • 使用多个滤波器(kernels)对输入图像进行滑动窗口操作。
  • 每个滤波器生成一个特征图(Feature Map),表示特定模式的存在(如边缘、纹理)。

公式:
Output = ∑ i , j ( W i , j ⋅ X i , j ) + b \text{Output} = \sum_{i,j} (W_{i,j} \cdot X_{i,j}) + b Output=i,j(Wi,jXi,j)+b
其中:

  • W 是滤波器权重。 W 是滤波器权重。 W是滤波器权重。
  • X 是输入图像的局部区域。 X 是输入图像的局部区域。 X是输入图像的局部区域。
  • b 是偏置。 b 是偏置。 b是偏置。

图1:卷积层示意图
(图片描述:第一列为输入图像,第二列为卷积操作后的特征图,展示了不同滤波器如何捕捉边缘和纹理特征。)
在这里插入图片描述

2. 池化层(Pooling Layer)

池化层用于降低特征图的空间维度,减少计算量并增强模型的鲁棒性。常用方法包括:

  • 最大池化(Max Pooling):取局部区域的最大值。
  • 平均池化(Average Pooling):取局部区域的平均值。

图2:池化层示意图
(图片描述:左侧为输入特征图,右侧为经过最大池化操作后的降维特征图,展示了空间尺寸减小的过程。)
在这里插入图片描述

3. 全连接层(Fully Connected Layer)

全连接层将所有特征展平为一维向量,并通过线性变换生成最终的分类结果。通常位于 CNN 的最后几层。


CNN 在图像识别中的优势

CNN 在图像识别中具有以下优势:

  1. 参数共享:卷积层的滤波器在整个图像上共享权重,减少了参数数量。
  2. 稀疏连接:每个神经元仅与局部区域相连,降低了计算复杂度。
  3. 自动特征提取:通过多层卷积和池化操作,CNN 能够自动学习从低级到高级的特征。

使用预训练模型进行迁移学习

迁移学习是一种高效的深度学习技术,利用预训练模型(如 VGG16、ResNet)在新任务上的表现。通过加载预训练权重,我们可以在小数据集上快速构建高性能模型。


数据增强技术

数据增强通过对原始数据进行随机变换(如旋转、翻转、缩放等),生成更多的训练样本,从而提高模型的泛化能力。这是解决小数据集问题的有效方法。


实践部分:使用 CNN 对 CIFAR-10 数据集进行图像分类

数据集简介

CIFAR-10 数据集包含 60,000 张 32x32 像素的彩色图像,分为 10 个类别(飞机、汽车、鸟、猫等)。目标是构建一个卷积神经网络模型,能够准确分类这些图像。

完整代码

import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.preprocessing.image import ImageDataGenerator

# 加载 CIFAR-10 数据集
(X_train, y_train), (X_test, y_test) = cifar10.load_data()

# 数据预处理
X_train = X_train.astype('float32') / 255.0  # 归一化到 [0, 1]
X_test = X_test.astype('float32') / 255.0
y_train = to_categorical(y_train, 10)  # 将标签转换为 one-hot 编码
y_test = to_categorical(y_test, 10)

# 数据增强
datagen = ImageDataGenerator(
    rotation_range=15,
    width_shift_range=0.1,
    height_shift_range=0.1,
    horizontal_flip=True
)
datagen.fit(X_train)

# 构建 CNN 模型
model = Sequential([
    Conv2D(32, (3, 3), activation='relu', padding='same', input_shape=(32, 32, 3)),
    MaxPooling2D((2, 2)),
    Conv2D(64, (3, 3), activation='relu', padding='same'),
    MaxPooling2D((2, 2)),
    Conv2D(128, (3, 3), activation='relu', padding='same'),
    MaxPooling2D((2, 2)),
    Flatten(),
    Dense(128, activation='relu'),
    Dropout(0.5),
    Dense(10, activation='softmax')
])

# 编译模型
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

# 训练模型
history = model.fit(datagen.flow(X_train, y_train, batch_size=64),
                    epochs=20,
                    validation_data=(X_test, y_test))

# 评估模型
test_loss, test_accuracy = model.evaluate(X_test, y_test)
print(f"Test Accuracy: {test_accuracy:.2f}")

# 绘制训练过程中的损失和准确率曲线
plt.figure(figsize=(12, 5))

# 损失曲线
plt.subplot(1, 2, 1)
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.title('Loss Curve', fontsize=16)
plt.xlabel('Epochs', fontsize=12)
plt.ylabel('Loss', fontsize=12)
plt.legend()
plt.grid()

# 准确率曲线
plt.subplot(1, 2, 2)
plt.plot(history.history['accuracy'], label='Training Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.title('Accuracy Curve', fontsize=16)
plt.xlabel('Epochs', fontsize=12)
plt.ylabel('Accuracy', fontsize=12)
plt.legend()
plt.grid()

plt.show()

运行结果

输出结果
Test Accuracy: 0.78
训练过程可视化

图3:损失与准确率曲线
(图片描述:左侧子图展示了训练和验证损失随 epoch 的变化,右侧子图展示了训练和验证准确率的变化,两条曲线均趋于平稳。)
在这里插入图片描述

数据增强效果

图4:数据增强示例
(图片描述:一组原始图像及其经过旋转、翻转、缩放等变换后的增强图像,展示了数据增强技术的效果。)
在这里插入图片描述


总结

本文介绍了卷积神经网络的基本结构、CNN 在图像识别中的优势以及数据增强技术,并通过实践部分展示了如何使用 TensorFlow/Keras 构建一个 CNN 模型来解决 CIFAR-10 图像分类问题。希望这篇文章能帮助你更好地理解 CNN 的基础知识!


下集预告: 机器学习实战(11):时间序列预测——循环神经网络(RNN)与 LSTM

参考资料

  • TensorFlow 文档: https://www.tensorflow.org/
  • CIFAR-10 数据集: https://www.cs.toronto.edu/~kriz/cifar.html

http://www.kler.cn/a/556415.html

相关文章:

  • Python连接MySQL数据库完全指南
  • 【Linux】命名管道------Linux进程间通信的桥梁
  • AI时代前端工程师的自主学习:挑战与机遇
  • MySQL 5.7优化
  • MySQL(1)基础篇
  • C语言预处理学习笔记
  • Web入侵实战分析-常见web攻击类应急处置实验2
  • Test the complete case
  • 区块链中的递归长度前缀(RLP)序列化详解
  • 黑马点评_登录模块
  • 雷军推荐:WPS 与 Pastemate 联用,效率飞升新高度
  • 线段树【C语言】【C++】
  • pycharm 调试 debug 进入 remote_sources
  • 【Vue3 项目中父子组件之间如何互相传值、传递方法】
  • uni-app(位置1)
  • 深蕾科技智能多媒体SoC产品助力“DataEye剧查查之夜”微短剧盛会
  • Spring Boot (maven)分页4.0.1版本 专业版- 改
  • 如何连接别人的redis服务器吗?
  • 同ip访问不同网页的效果
  • 【推荐项目】009-学校宿舍管理系统