• 【深度学习】基于tensorflow的小型物体识别训练(数据集:CIFAR-10)


    活动地址:CSDN21天学习挑战赛

    前言

    关于环境这里不再赘述,与【深度学习】从LeNet-5识别手写数字入门深度学习一文的环境一致。

    了解CIFAR-10数据集

    CIFAR-10 是由 Hinton 的学生 Alex Krizhevsky 和 Ilya Sutskever 整理的一个用于识别普适物体的小型数据集。一共包含 10 个类别的 RGB 彩色图 片:飞机( aircraft )、汽车( automobile )、鸟类( bird )、猫( cat )、鹿( deer )、狗( dog )、蛙类( frog )、马( horse )、船( ship )和卡车( truck )。图片的尺寸32×32 ,数据集中一共有 50000 张训练图片10000 张测试图片。 CIFAR-10 的图片样例如图所示。
    在这里插入图片描述

    CIFAR-10数据集与 MNIST 数据集的区别

    • CIFAR-10 是 3 通道的彩色 RGB 图像,而 MNIST 是灰度图像。
    • CIFAR-10 的图片尺寸为 32×32, MNIST 的图片尺寸为 28×28,比 MNIST 大一些。
    • 由于CIFAR-10中的图片都是现实世界中拍摄的,所以噪声会很大,而且各类物体的比例、特征、色彩等均不同,这大大增加了识别的难度。

    下载数据集

    官方下载地址(较慢)

    https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz

    使用tensorflow下载(推荐)

    默认下载在C:\Users\用户\.keras\datasets路径下。

    from tensorflow.keras import datasets
    
    # 下载数据集
    (train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
    
    • 1
    • 2
    • 3
    • 4

    使用迅雷(推荐)

    如果你和我一样使用代码下载还是一样的慢,就使用迅雷吧。
    在这里插入图片描述
    下载完成后将文件移动至C:\Users\用户\.keras\datasets路径下,并将压缩包名修改为下面图中同名,并解压。
    在这里插入图片描述

    采用CPU训练还是GPU训练

    一般来说有好的显卡(GPU)就使用GPU训练因为,那么对应的你就要下载tensorflow-gpu包。如果你的显卡较差或者没有足够资金入手一款好的显卡就可以使用CUP训练。

    区别

    (1)CPU主要用于串行运算;而GPU则是大规模并行运算。由于深度学习中样本量巨大,参数量也很大,所以GPU的作用就是加速网络运算。

    (2)CPU计算神经网络也是可以的,算出来的神经网络放到实际应用中效果也很好,只不过速度会很慢罢了。而目前GPU运算主要集中在矩阵乘法和卷积上,其他的逻辑运算速度并没有CPU快。

    使用CPU训练

    # 使用cpu训练
    import os
    
    os.environ["CUDA_VISIBLE_DEVICES"] = "-1"
    
    • 1
    • 2
    • 3
    • 4

    使用CPU训练时不会显示CPU型号。
    在这里插入图片描述

    使用GPU训练

    gpus = tf.config.list_physical_devices("GPU")
    
    if gpus:
        gpu0 = gpus[0]  # 如果有多个GPU,仅使用第0个GPU
        tf.config.experimental.set_memory_growth(gpu0, True)  # 设置GPU显存用量按需使用
        tf.config.set_visible_devices([gpu0], "GPU")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    使用GPU训练时会显示对应的GPU型号。
    在这里插入图片描述

    显示部分图片

    首先需要建立一个标签数组,然后绘制前20张,每行5个共四行

    from matplotlib import pyplot as plt
    
    class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
    
    plt.figure(figsize=(20, 10))
    for i in range(20):
        plt.subplot(4, 5, i + 1)
        plt.xticks([])
        plt.yticks([])
        plt.grid(False)
        plt.imshow(train_images[i], cmap=plt.cm.binary)
        plt.xlabel(class_names[train_labels[i][0]])
    plt.show()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    绘制结果:
    在这里插入图片描述

    建立CNN模型

    from tensorflow_core.python.keras import Input, Sequential
    from tensorflow_core.python.keras.layers import Conv2D, Activation, MaxPooling2D, Flatten, Dense
    
    
    def simple_CNN(input_shape=(32, 32, 3), num_classes=10):
        # 构建一个空的网络模型,它是一个线性堆叠模型,各神经网络层会被顺序添加,专业名称为序贯模型或线性堆叠模型
        model = Sequential()
    
        # 卷积层1 
        model.add(Conv2D(filters=32, kernel_size=(3, 3), activation='relu', input_shape=input_shape))
    
        # 最大池化层1
        model.add(MaxPooling2D((2, 2), strides=(2, 2), padding='same'))
    
        # 卷积层2
        model.add(Conv2D(filters=64, kernel_size=(3, 3), padding='same', activation='relu'))
    
        # 最大池化层2
        model.add(MaxPooling2D((2, 2), strides=(2, 2), padding='same'))
    
        # 卷积层3
        model.add(Conv2D(filters=64, kernel_size=(3, 3), padding='same', activation='relu'))
    
        # flatten层常用来将输入“压平”,即把多维的输入一维化,常用在从卷积层到全连接层的过渡。
        model.add(Flatten())
    
        # 全连接层 对特征进行提取
        model.add(Dense(units=64, activation='relu'))
    
        # 输出层
        model.add(Dense(10))
        return model
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    网络结构

    包含输入层的话总共9层。其中有三个卷积层,俩个最大池化层,一个flatten层,俩个全连接层。
    在这里插入图片描述

    参数量

    总共参数为319k,训练时间比LeNet-5较长。建议采用GPU训练。

    Total params: 319,178
    Trainable params: 319,178
    Non-trainable params: 0
    
    • 1
    • 2
    • 3

    训练模型

    训练模型,进行10轮,将模型保存到1.h5文件中。后期可以直接加载模型继续训练。

    from tensorflow_core.python.keras.models import load_model
    from Cnn import simple_CNN
    import tensorflow as tf
    
    
    def train(train_images, train_labels, test_images, test_labels):
        model = simple_CNN(train_images, train_labels) 
        model.summary()  # 打印网络结构
    
    
        model.compile(optimizer='adam',
                      loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
                      metrics=['accuracy'])
        model.save("1.h5")
        history = model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels))
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    训练结果:测试集acc为66.53%。后期可以增加轮数或者优化模型。
    在这里插入图片描述

  • 相关阅读:
    webrtc学习--webrtc桌面采集
    面试官:并发编程实战会吗?(线程控制操作详解)
    【进化计算】遗传算法求解gr48数据集
    微服务守护神-Sentinel-概念
    HDL_BITS 学习(9)
    【redis的基本数据类型】
    关于数据权限的设计
    026试用流程图框架jsPlumb和VueFlow,作为可视化编程实现参考
    如何使用 NestJS 构建 GraphQL API
    kubernetes二进制安装教程单master
  • 原文地址:https://blog.csdn.net/qq_45254369/article/details/126129116