手把手搭建一个【卷积神经网络】

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,1000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: 本文介绍卷积神经网络的入门案例,通过搭建和训练一个模型,来对10种常见的物体进行识别分类;

 前言

本文介绍卷积神经网络的入门案例,通过搭建和训练一个模型,来对10种常见的物体进行识别分类;使用到CIFAR10数据集,它包含10 类,即:“飞机”,“汽车”,“鸟”,“猫”,“鹿”, “狗”,“青蛙”,“马”,“船”,“卡车” ;共 60000 张彩色图片;通过搭建和训练卷积神经网络模型,对图像进行分类,能识别出图像是“汽车”,或“鸟”,还是其它。


思路流程

    1. 导入 CIFAR10 数据集
    2. 探索集数据,并进行数据预处理
    3. 构建模型(搭建神经网络结构、编译模型)
    4. 训练模型(把数据输入模型、评估准确性、作出预测、验证预测)  
    5. 使用训练好的模型


    一、导入 CIFAR10 数据集

    使用到CIFAR10数据集,它包含10 类,即:“飞机”,“汽车”,“鸟”,“猫”,“鹿”, “狗”,“青蛙”,“马”,“船”,“卡车” ;共 60000 张彩色图片;

    此数据集中 50000 个样例被作为训练集(每张图片对于一个标签),剩余 10000 个样例作为测试集(每张图片也对于一个标签)。类别之间相互独立,不存在重叠的部分。使用以下代码完成数据集导入:

    (train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()

    image.gif


    二、探索集数据,并进行数据预处理

    将测试集的前 30 张图片和类名打印出来

    class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer',
                   'dog', 'frog', 'horse', 'ship', 'truck']
    plt.figure(figsize=(10,10))
    for i in range(30):
        plt.subplot(5,6,i+1)
        plt.xticks([])
        plt.yticks([])
        plt.grid(False)
        plt.imshow(train_images[i], cmap=plt.cm.binary)
        # 由于 CIFAR 的标签是 array, 因此需要额外的索引(index)。
        plt.xlabel(class_names[train_labels[i][0]])
    plt.show()

    image.gif

    打印出来的效果是这样的:

    image.gif

    数据集预处理

    下面进行数据集预处理,将像素的值标准化至0到1的区间内:

    # 将像素的值标准化至0到1的区间内。
    train_images, test_images = train_images / 255.0, test_images / 255.0

    image.gif

    为什么是除以255呢?由于图片的像素范围是0~255,我们把它变成0~1的范围,于是每张图像(训练集、测试集)都除以255。


    三、构建模型

    常见卷积神经网络(CNN),主要由几个 卷积层Conv2D 和 池化层MaxPooling2D 层组成。卷积层池化层的叠加实现对输入数据的特征提取,最后连接全连接层实现分类。

    1)特征提取——卷积层池化层

    CNN 的输入是张量 (Tensor) 形式的 (image_height, image_width, color_channels),包含了图像高度、宽度及颜色信息。通常图像使用 RGB 色彩模式,color_channels(R,G,B) 分别对应 RGB 的三个颜色通道,即:image_height 和 image_width 根据图像的像素高度、宽度决定;color_channels是3,对应RGB的3通道。

    CIFAR 数据集中的图片,形状是 (32, 32, 3),我们可以在声明第一层时将形状赋值给参数 input_shape

    model = models.Sequential()
    model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Conv2D(64, (3, 3), activation='relu'))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Conv2D(64, (3, 3), activation='relu'))

    image.gif

    查看一下网络模型:tf.keras.utils.plot_model(model)

    image.gif

    在上面的模型种每个 Conv2D 和 MaxPooling2D 层的输出都是一个三维的张量 (Tensor),其形状描述了 (height, width, channels)。越深的层中,宽度和高度都会收缩。

    2)实现分类——全连接层

    Dense 层等同于全连接 (Full Connected) 层,通过上面的卷积层和池化层,我们已经提取到图像的特征了,下面通过搭建Dense 层实现分类。

    Dense 层的输入为向量(一维),但前面层的输出是3维的张量 (Tensor) 即:(4, 4, 64)。因此您需要将三维张量展开 (Flatten) 到1维,之后再传入一个或多个 Dense 层。

    model.add(layers.Flatten())
    model.add(layers.Dense(64, activation='relu'))
    model.add(layers.Dense(10))

    image.gif

    CIFAR 数据集有 10 个类,因此您最终的 Dense 层需要 10 个输出及一个 softmax 激活函数。

    查看完整的 CNN 结构:tf.keras.utils.plot_model(model)

    image.gif

    或者用这样方式看看:model.summary()

    image.gif

    可以看出,在被传入两个 Dense 层之前,通过Flatten层处理后,形状为 (4, 4, 64) 的输出被展平成了形状为 (1024) 的向量。

    3)编译模型

    主要是为模型选择损失函数loss、优化器 optimizer、衡量指标metrics(通常用准确度accuracy 来衡量的)

    model.compile(optimizer='adam',
                  loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
                  metrics=['accuracy'])

    image.gif


    四、训练模型

    这里我们输入准备好的训练集数据(包括图像、对应的标签),测试集的数据(包括图像、对应的标签),模型一共训练10次

    history = model.fit(train_images, train_labels, epochs=10, 
                        validation_data=(test_images, test_labels))

    image.gif

    下图是训练过程的截图:

    image.gif编辑

    通常loss越小越好,对了解释下什么是loss;简单来说是 模型预测值 和 真实值 的相差的值,反映模型预测的结果和真实值的相差程度;

    通常准确度accuracy 越高,模型效果越好。

    评估模型

    plt.plot(history.history['accuracy'], label='accuracy')
    plt.plot(history.history['val_accuracy'], label = 'val_accuracy')
    plt.xlabel('Epoch')
    plt.ylabel('Accuracy')
    plt.ylim([0.5, 1])
    plt.legend(loc='lower right')
    plt.show()
    test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2)
    print("测试集的准确度", test_acc)

    image.gif

    看看效果:

    image.gif


    五、使用模型

    通常使用 model.predict( )  函数进行预测。

    完成代码:

    import tensorflow as tf
    from tensorflow.keras import datasets, layers, models
    import matplotlib.pyplot as plt
    # 导入 CIFAR10 数据集
    (train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
    # 将测试集的前 30 张图片和类名打印出来
    class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer',
                   'dog', 'frog', 'horse', 'ship', 'truck']
    plt.figure(figsize=(10,10))
    for i in range(30):
        plt.subplot(5,6,i+1)
        plt.xticks([])
        plt.yticks([])
        plt.grid(False)
        plt.imshow(train_images[i], cmap=plt.cm.binary)
        # 由于 CIFAR 的标签是 array, 因此需要额外的索引(index)。
        plt.xlabel(class_names[train_labels[i][0]])
    plt.show()
    # 下面进行数据集预处理,将像素的值标准化至0到1的区间内:
    train_images, test_images = train_images / 255.0, test_images / 255.0
    # 构建模型
    # 1)特征提取——卷积层与池化层
    model = models.Sequential()
    model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Conv2D(64, (3, 3), activation='relu'))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Conv2D(64, (3, 3), activation='relu'))
    # 2)实现分类——全连接层
    model.add(layers.Flatten())
    model.add(layers.Dense(64, activation='relu'))
    model.add(layers.Dense(10))
    # 3)编译模型
    model.compile(optimizer='adam',
                  loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
                  metrics=['accuracy'])
    # 训练模型
    history = model.fit(train_images, train_labels, epochs=10, 
                        validation_data=(test_images, test_labels))
    # 评估模型
    plt.plot(history.history['accuracy'], label='accuracy')
    plt.plot(history.history['val_accuracy'], label = 'val_accuracy')
    plt.xlabel('Epoch')
    plt.ylabel('Accuracy')
    plt.ylim([0.5, 1])
    plt.legend(loc='lower right')
    plt.show()
    test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2)
    print("测试集的准确度", test_acc)

    image.gif

    参考:一篇文章“简单”认识《卷积神经网络》(更新版)

    卷积神经网络(Convolutional Neural Network, CNN)  |  TensorFlow Core


    相关文章
    |
    2月前
    |
    机器学习/深度学习 PyTorch TensorFlow
    卷积神经网络深度解析:从基础原理到实战应用的完整指南
    蒋星熠Jaxonic,深度学习探索者。深耕TensorFlow与PyTorch,分享框架对比、性能优化与实战经验,助力技术进阶。
    |
    3月前
    |
    机器学习/深度学习 人工智能 算法
    卷积神经网络深度解析:从基础原理到实战应用的完整指南
    蒋星熠Jaxonic带你深入卷积神经网络(CNN)核心技术,从生物启发到数学原理,详解ResNet、注意力机制与模型优化,探索视觉智能的演进之路。
    414 11
    |
    6月前
    |
    机器学习/深度学习 算法 数据安全/隐私保护
    基于PSO粒子群优化TCN-LSTM时间卷积神经网络时间序列预测算法matlab仿真
    本内容展示了一种基于粒子群优化(PSO)与时间卷积神经网络(TCN)的时间序列预测方法。通过 MATLAB2022a 实现,完整程序运行无水印,核心代码附详细中文注释及操作视频。算法利用 PSO 优化 TCN 的超参数(如卷积核大小、层数等),提升非线性时间序列预测性能。TCN 结构包含因果卷积层与残差连接,结合 LSTM 构建混合模型,经多次迭代选择最优超参数,最终实现更准确可靠的预测效果,适用于金融、气象等领域。
    |
    3月前
    |
    机器学习/深度学习 传感器 数据采集
    【故障识别】基于CNN-SVM卷积神经网络结合支持向量机的数据分类预测研究(Matlab代码实现)
    【故障识别】基于CNN-SVM卷积神经网络结合支持向量机的数据分类预测研究(Matlab代码实现)
    248 0
    |
    5月前
    |
    机器学习/深度学习 人工智能 PyTorch
    零基础入门CNN:聚AI卷积神经网络核心原理与工业级实战指南
    卷积神经网络(CNN)通过局部感知和权值共享两大特性,成为计算机视觉的核心技术。本文详解CNN的卷积操作、架构设计、超参数调优及感受野计算,结合代码示例展示其在图像分类、目标检测等领域的应用价值。
    303 7
    |
    7月前
    |
    机器学习/深度学习 算法 数据安全/隐私保护
    基于PSO粒子群优化TCN时间卷积神经网络时间序列预测算法matlab仿真
    本内容介绍了一种基于PSO(粒子群优化)改进TCN(时间卷积神经网络)的时间序列预测方法。使用Matlab2022a运行,完整程序无水印,附带核心代码中文注释及操作视频。TCN通过因果卷积层与残差连接处理序列数据,PSO优化其卷积核权重等参数以降低预测误差。算法中,粒子根据个体与全局最优位置更新速度和位置,逐步逼近最佳参数组合,提升预测性能。
    |
    6月前
    |
    机器学习/深度学习 数据采集 监控
    基于CNN卷积神经网络和GEI步态能量提取的步态识别算法matlab仿真,对比不同角度下的步态识别性能
    本项目基于CNN卷积神经网络与GEI步态能量提取技术,实现高效步态识别。算法使用不同角度(0°、45°、90°)的步态数据库进行训练与测试,评估模型在多角度下的识别性能。核心流程包括步态图像采集、GEI特征提取、数据预处理及CNN模型训练与评估。通过ReLU等激活函数引入非线性,提升模型表达能力。项目代码兼容Matlab2022a/2024b,提供完整中文注释与操作视频,助力研究与应用开发。
    |
    6月前
    |
    机器学习/深度学习 算法 数据安全/隐私保护
    基于WOA鲸鱼优化的TCN-GRU时间卷积神经网络时间序列预测算法matlab仿真
    本内容包含时间序列预测算法的相关资料,涵盖以下几个方面:1. 算法运行效果预览(无水印);2. 运行环境为Matlab 2022a/2024b;3. 提供部分核心程序,完整版含中文注释及操作视频;4. 理论概述:结合时间卷积神经网络(TCN)与鲸鱼优化算法(WOA),优化TCN超参数以提升非线性时间序列预测性能。通过因果卷积层与残差连接构建TCN模型,并用WOA调整卷积核大小、层数等参数,实现精准预测。适用于金融、气象等领域决策支持。
    |
    6月前
    |
    机器学习/深度学习 数据采集 并行计算
    基于WOA鲸鱼优化的TCN时间卷积神经网络时间序列预测算法matlab仿真
    本内容介绍了一种基于TCN(Temporal Convolutional Network)与WOA(Whale Optimization Algorithm)的时间序列预测算法。TCN通过扩张卷积捕捉时间序列长距离依赖关系,结合批归一化和激活函数提取特征;WOA用于优化TCN网络参数,提高预测精度。算法流程包括数据归一化、种群初始化、适应度计算及参数更新等步骤。程序基于Matlab2022a/2024b开发,完整版含详细中文注释与操作视频,运行效果无水印展示。适用于函数优化、机器学习调参及工程设计等领域复杂任务。
    |
    6月前
    |
    机器学习/深度学习 算法 数据安全/隐私保护
    基于PSO粒子群优化TCN-GRU时间卷积神经网络时间序列预测算法matlab仿真
    本内容涵盖基于粒子群优化(PSO)与时间卷积神经网络(TCN)的时间序列预测算法。完整程序运行效果无水印,适用于Matlab2022a版本。核心代码配有详细中文注释及操作视频。理论部分阐述了传统方法(如ARIMA)在非线性预测中的局限性,以及TCN结合PSO优化超参数的优势。模型由因果卷积层和残差连接组成,通过迭代训练与评估选择最优超参数,最终实现高精度预测,广泛应用于金融、气象等领域。