深度学习之全过程搭建卷积神经网络(CNN)

news2024/11/15 6:45:41

      大家好,我是带我去滑雪!

      本期将尝试使用CIFAR-10 数据集搭建卷积神经网络,该数据集由 10 个类别的 60000 张 32x32 彩色图像组成,每个类别有 6000 张图像。

       下面开始全过程搭建CNN识别彩色图片:

目录

 (1)导入Keras内置Cifar-10数据集和相关模块

(2)显示训练集对应测试集中的前9张图片

(3)数据预处理:特征数据进行归一化、标签数据进行独立热编码

(4)定义模型

(5)编译模型、训练模型

 (6)绘制训练集与验证集损失分数、准确度的趋势图

(7)评估模型与储存模型

(7)模型预测


(1)导入Keras内置Cifar-10数据集和相关模块

from keras.datasets import cifar10
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd 
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Flatten
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Dropout
from tensorflow.keras.utils import to_categorical

(X_train, Y_train), (X_test, Y_test) = cifar10.load_data()
print("X_train.shape: ", X_train.shape)
print("Y_train.shape: ", Y_train.shape)
print("X_test.shape: ", X_test.shape)
print("Y_test.shape: ", Y_test.shape)

输出结果:

Downloading data from https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
170498071/170498071 [==============================] - 2113s 12us/step
X_train.shape:  (50000, 32, 32, 3)
Y_train.shape:  (50000, 1)
X_test.shape:  (10000, 32, 32, 3)
Y_test.shape:  (10000, 1)

      训练集中有50000张,测试集中有10000张。标签值对应的图片类别如下:

标签值图片类别标签值图片类别
0飞机5
1汽车6青蛙
27
38
4鹿9卡车

(2)显示训练集对应测试集中的前9张图片

sub_plot= 330
for i in range(0, 9):
    ax = plt.subplot(sub_plot+i+1)
    ax.imshow(X_train[i], cmap="binary")
    ax.set_title("Label: " + str(Y_train[i]))
    ax.axis("off")
plt.subplots_adjust(hspace = .5)
  
plt.savefig("E:/工作/硕士/博客/博客34-深度学习之全过程搭建卷积神经网络(CNN)/squares1.png",
            bbox_inches ="tight",
            pad_inches = 1,
            transparent = True,
            facecolor ="w",
            edgecolor ='w',
            dpi=300,
            orientation ='landscape')

输出结果:

(3)数据预处理:特征数据进行归一化、标签数据进行独立热编码

        这里的特征数据选择归一化,而不是标准化的原因是数据是固定范围, 所以执行归一化, 从 0~255 转化为 0~1。

X_train = X_train.astype("float32") / 255
X_test = X_test.astype("float32") / 255
# One-hot编码
Y_train = to_categorical(Y_train)
Y_test = to_categorical(Y_test)

(4)定义模型

        模型设定两个卷积层和池化层,三个Dropout层、一个平坦化层,两个全连接层。在卷积层中激活函数使用ReLU函数,第一和第二个Dropout层比例为0.25,第三个Dropout层比例为0.5,第一个全连接层激活函数使用ReLU函数,第二个全连接层激活函数使用softmax函数。kernel_size表示卷积核大小,padding表示补零为相同尺寸(填充),strides表示填充步幅。最大池化层里面的pool_size=(2, 2)表示缩小比例。

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), padding="same",input_shape=X_train.shape[1:], activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, kernel_size=(3, 3), padding="same",activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512, activation="relu"))
model.add(Dropout(0.5))
model.add(Dense(10, activation="softmax"))
model.summary()   #显示模型信息

输出结果:

Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 conv2d (Conv2D)             (None, 32, 32, 32)        896       
                                                                 
 max_pooling2d (MaxPooling2D  (None, 16, 16, 32)       0         
 )                                                               
                                                                 
 dropout (Dropout)           (None, 16, 16, 32)        0         
                                                                 
 conv2d_1 (Conv2D)           (None, 16, 16, 64)        18496     
                                                                 
 max_pooling2d_1 (MaxPooling  (None, 8, 8, 64)         0         
 2D)                                                             
                                                                 
 dropout_1 (Dropout)         (None, 8, 8, 64)          0         
                                                                 
 flatten (Flatten)           (None, 4096)              0         
                                                                 
 dense (Dense)               (None, 512)               2097664   
                                                                 
 dropout_2 (Dropout)         (None, 512)               0         
                                                                 
 dense_1 (Dense)             (None, 10)                5130      
                                                                 
=================================================================
Total params: 2,122,186
Trainable params: 2,122,186
Non-trainable params: 0
_________________________________________________________________

上面各神经层的参数计算:

        第一个conv2d卷积层的输入层输出通道数为3,乘以滤波器的大小(3,3),再乘以滤波器数量32,再加上滤波器数的偏移量32,总数为3*(3*3)*32+32=896。

       第二个卷积层是64个滤波器,滤波器的大小(3,3),乘以上一层的通道数32(即特征数),加上64个偏移量,总数为32*(3*3)*64+64=18496。

       第一个全连接层,有512个神经元,而平坦层的输入为4096,偏移量为512个,故该层总参数个数为512*4096+512=2097664。

       最后输出层的全连接层有10个神经元,该层参数总量为512*10+10=5130。

       总参数共计896+18496+2097664+5130=2122186个。

(5)编译模型、训练模型

       在编译模型中,损失函数为categorical_crossentropy,优化器为adam,评估标准为准确度(accuracy)。在训练模型中,验证集为训练集的20%,训练周期为30次,批次尺寸为128。

# 编译模型
model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
# 训练模型
history = model.fit(X_train, Y_train, validation_split=0.2, epochs=30, batch_size=128, verbose=2)

输出结果:

313/313 - 29s - loss: 0.4474 - accuracy: 0.8385 - val_loss: 0.7614 - val_accuracy: 0.7583 - 29s/epoch - 92ms/step
Epoch 23/30
313/313 - 29s - loss: 0.4372 - accuracy: 0.8422 - val_loss: 0.7723 - val_accuracy: 0.7557 - 29s/epoch - 93ms/step
Epoch 24/30
313/313 - 29s - loss: 0.4292 - accuracy: 0.8477 - val_loss: 0.7678 - val_accuracy: 0.7592 - 29s/epoch - 94ms/step
Epoch 25/30
313/313 - 30s - loss: 0.4226 - accuracy: 0.8493 - val_loss: 0.7862 - val_accuracy: 0.7569 - 30s/epoch - 97ms/step
Epoch 26/30
313/313 - 30s - loss: 0.4174 - accuracy: 0.8492 - val_loss: 0.7757 - val_accuracy: 0.7571 - 30s/epoch - 94ms/step
Epoch 27/30
313/313 - 29s - loss: 0.4041 - accuracy: 0.8559 - val_loss: 0.7743 - val_accuracy: 0.7591 - 29s/epoch - 94ms/step
Epoch 28/30
313/313 - 31s - loss: 0.3896 - accuracy: 0.8595 - val_loss: 0.8050 - val_accuracy: 0.7561 - 31s/epoch - 98ms/step
Epoch 29/30
313/313 - 28s - loss: 0.3856 - accuracy: 0.8602 - val_loss: 0.7823 - val_accuracy: 0.7581 - 28s/epoch - 91ms/step
Epoch 30/30
313/313 - 28s - loss: 0.3784 - accuracy: 0.8633 - val_loss: 0.8150 - val_accuracy: 0.7506 - 28s/epoch - 91ms/step

 (6)绘制训练集与验证集损失分数、准确度的趋势图

# 显示训练和验证损失分数趋势图
loss = history.history["loss"]
epochs = range(1, len(loss)+1)
val_loss = history.history["val_loss"]
plt.plot(epochs, loss, "bo-", label="Training Loss")
plt.plot(epochs, val_loss, "ro--", label="Validation Loss")
plt.title("Training and Validation Loss")
plt.xlabel("Epochs")
plt.ylabel("Loss")
plt.legend()
plt.savefig("E:/工作/硕士/博客/博客34-深度学习之全过程搭建卷积神经网络(CNN)/squares2.png",
            bbox_inches ="tight",
            pad_inches = 1,
            transparent = True,
            facecolor ="w",
            edgecolor ='w',
            dpi=300,
            orientation ='landscape')

输出结果:

 # 显示训练和验证准确度趋势图  
acc = history.history["accuracy"]
epochs = range(1, len(acc)+1)
val_acc = history.history["val_accuracy"]
plt.plot(epochs, acc, "bo-", label="Training Acc")
plt.plot(epochs, val_acc, "ro--", label="Validation Acc")
plt.title("Training and Validation Accuracy")
plt.xlabel("Epochs")
plt.ylabel("Accuracy")
plt.legend()
plt.savefig("E:/工作/硕士/博客/博客34-深度学习之全过程搭建卷积神经网络(CNN)/squares3.png",
            bbox_inches ="tight",
            pad_inches = 1,
            transparent = True,
            facecolor ="w",
            edgecolor ='w',
            dpi=300,
            orientation ='landscape')

输出结果:

 

(7)评估模型与储存模型

print("\n在训练集和测试集上,模型评估中 ...")
loss, accuracy = model.evaluate(X_train, Y_train)
print("训练数据集的准确度  = {:.2f}".format(accuracy))
loss, accuracy = model.evaluate(X_test, Y_test)
print("测试数据集的准确度   = {:.2f}".format(accuracy))

输出结果:

在训练集和测试集上,模型评估中 ...
1563/1563 [==============================] - 11s 7ms/step - loss: 0.2559 - accuracy: 0.9352
训练数据集的准确度  = 0.94
313/313 [==============================] - 2s 7ms/step - loss: 0.8194 - accuracy: 0.7467
测试数据集的准确度   = 0.75

(7)模型预测

# 计算分类的预测值
print("\nPredicting ...")
predict=model.predict(X_test) 
Y_pred=np.argmax(predict,axis=1)
#重新加载Y_test
(X_train, Y_train), (X_test, Y_test) = cifar10.load_data()
 
#计算混淆矩阵
#显示混淆矩阵
tb = pd.crosstab(Y_test.astype(int).flatten(), 
                 Y_pred.astype(int),
                 rownames=["label"], colnames=["predict"])
print(tb)

输出结果:

Predicting ...
313/313 [==============================] - 2s 7ms/step
predict    0    1    2    3    4    5    6    7    8    9
label                                                    
0        811   17   37    8   14    2    9   13   62   27
1         23  876    2    5    1    3    6    2   25   57
2         61    7  673   46   75   44   48   20   18    8
3         31   18   97  546   49  122   59   35   24   19
4         36    4   71   68  695   27   38   46   12    3
5         20    5   58  191   36  596   19   50   16    9
6          8   12   54   44   29   23  808    4   16    2
7         23    4   40   33   44   40    1  799    3   13
8         53   31    8    5    5    3    3    7  868   17
9         39  104   10    8    0    6    1   13   24  795

#使用热力图显示混淆矩阵

import seaborn as sns
sns.heatmap(tb,cmap='pink',fmt='.20g',annot=True)
plt.tight_layout()
plt.savefig("E:/工作/硕士/博客/博客34-深度学习之全过程搭建卷积神经网络(CNN)/squares4.png",
            bbox_inches ="tight",
            pad_inches = 1,
            transparent = True,
            facecolor ="w",
            edgecolor ='w',
            dpi=300,
            orientation ='landscape')

输出结果:

#查看预测概率

#重新归一化
X_train = X_train.astype("float32") / 255
X_test = X_test.astype("float32") / 255
 
#选第10张图片
i = 10
img = X_test[i]
# 将图片转换成 4D 张量  
X_test_img = img.reshape(1, 32, 32, 3).astype("float32")
 
# 绘出图表的预测结果
plt.figure()
plt.subplot(1,2,1)
plt.title("Example of Image:" + str(Y_test[i]))
plt.imshow(img, cmap="binary")
plt.axis("off")
plt.savefig("E:/工作/硕士/博客/博客34-深度学习之全过程搭建卷积神经网络(CNN)/squares5.png",
            bbox_inches ="tight",
            pad_inches = 1,
            transparent = True,
            facecolor ="w",
            edgecolor ='w',
            dpi=300,
            orientation ='landscape')

输出结果:

 #预测结果的概率
print("Predicting ...")
probs = model.predict(X_test_img, batch_size=1)
plt.subplot(1,2,2)
plt.title("Probabilities for Each Image Class")
plt.bar(np.arange(10), probs.reshape(10), align="center")
plt.xticks(np.arange(10),np.arange(10).astype(str))plt.savefig("E:/工作/硕士/博客/博客34-深度学习之全过程搭建卷积神经网络(CNN)/squares6.png",
            bbox_inches ="tight",
            pad_inches = 1,
            transparent = True,
            facecolor ="w",
            edgecolor ='w',
            dpi=300,
            orientation ='landscape')

输出结果:

 

         第一个图为原始图像,第二图为各个类别的预测概率,经过预测90%以上的概率认为图像为第0类即为一个飞机。


更多优质内容持续发布中,请移步主页查看。

   点赞+关注,下次不迷路!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/547624.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】冯诺依曼与操作系统

目录 一、冯诺依曼结构体系1、冯诺依曼结构体系简介2、为什么要有内存呢? 二、操作系统1、操作系统如何对硬件进行管理?2、操作系统为什么要对软硬件进行管理? 一、冯诺依曼结构体系 1、冯诺依曼结构体系简介 在现实生活中,我们…

KEYSIGHT MSOS204A 2GHZ 4通道DSOS204A高清晰度示波器

KEYSIGHT是德DSOS204A/MSOS204A高清晰度示波器 附加功能: 2 GHz 带宽(可升级) 4 个模拟通道和 16 个数字通道 最大存储深度:800 Mpts(2 通道),400 Mpts(4 通道) 最大…

菱形继承、菱形虚拟继承、以及菱形虚拟继承的模型结构内部。

1. 单继承:一个子类只有一个直接父类。 多继承:一个子类有两个或以上直接父类。 菱形继承:菱形继承是多继承的一种特殊情况。 下面是代码和对象模型结构,可以看出菱形结构存在哪些问题,如下: #define _CR…

学习经验分享【30】Pycharm插件chatgpt,用来辅助编写代码

在Pycharm中发现ChatGPT插件,很好用,免费安全,大家可以作为编代码的辅助工作,也可用来玩GPT的接口。具体方法如下 实现效果如下: 更多精彩内容敬请持续关注。如果本博文对你有帮助的话,欢迎点赞、评论区留言…

BUUCTF-一叶障目 解析

打开文件发现一张png图片,里面没有内容,使用tweakpng打开 tweakpng报错 ,说明crc校验值对不上 有两种可能,一是crc值被修改,二是图片的宽高被修改(在ctf中多半是后者) 先尝试修改crc值为55900…

【王道·计算机网络】第五章 传输层

一、传输层概述 传输层为应用层提供通信服务,使用网络层服务传输层的功能: 提供进程和进程之间的逻辑通信(网络层提供主机之间的逻辑通信)复用(发送发不同的应用进程)和分用(接收方正确的数据传…

【网络协议详解】——PPP协议(学习笔记)

目录 🕒 1. 数据链路层协议概述🕒 2. PPP协议分析🕘 2.1 概述🕘 2.2 工作流程🕘 2.3 帧格式 🕒 3. LCP协议🕘 3.1 概述🕘 3.2 报文格式🕘 3.3 报文种类🕤 3.3…

3年经验,面试测试岗只会功能测试开口要求18K,令我陷入沉思

由于朋友临时有事, 所以今天我代替朋友进行一次面试,公司需要招聘一位自动化测试工程师,我以很认真负责的态度完成这个过程, 大概近30分钟。 主要是技术面试, 在近30分钟内, 我与被面试者是以交流学习的方式…

STM32F407+LWIP+DP83848以太网驱动移植

最近有个项目上需要用到网络功能,于是开始移植网络相关代码。在移植的过程中感觉好难,网上找各种资料都没有和自己项目符合的,移植废了废了好的大劲。不过现在回头看看,其实移植很简单,主要是当时刚开始接触网络&#…

【数据分享】2020年我国地级市医疗资源空间分布数据(Shp格式/Excel格式)

医疗资源的配置情况直接反映了一个城市的发展水平,医疗资源相关数据也是经常使用到的数据! 我们发现学者刘海猛在科学数据银行(ScienceDB)平台上分享了2020年我国341个城市(地区、州、盟)的基础医疗资源数…

电脑安装软件时,如何避免捆绑安装?

在网络上非正规网站下载安装软件时,经常会遇到捆绑安装的情况。你明明下载了一个软件,电脑上却多出好几个。那么我们在安装软件时,如何才能避免捆绑安装呢? 什么是捆绑安装? 捆绑安装是指用户安装一个软件时&#xff…

Spring boot框架 JWT实现用户账户密码登录验证

目录 1、JWT定义 1、1 JWT工作流程 1、2 JWT优点 2、添加依赖项到pom.xml 3、创建用户实体类 4、实现认证服务 5、登录请求处理 6、生成JWT 1、JWT定义 JWT(JSON Web Token)是一种用于在网络应用间传递信息的安全传输方式。它是一种紧凑且自包含…

tolua源码分析(五)lua使用C#的enum

tolua源码分析(五)lua使用C#的enum 上一节我们讨论了C#类是如何注册到lua的过程,以及lua调用C#函数时底层所做的事情。在此基础之上,本节我们来看看C#的enum是如何注册到lua的,它和一般类的注册有哪些区别。 老规矩&a…

互联网医院资质代办|互联网医院牌照的申请流程

随着互联网技术的不断发展,互联网医疗已经逐渐成为人们关注的热点话题。而互联网医院作为互联网医疗的一种重要形式,也越来越受到社会各界的关注。若想开展互联网医院业务,则需要具备互联网医院牌照。那么互联网医院牌照的申请流程和需要的资…

算法——归并排序和计数排序

Ⅰ. 归并排序 1. 基本思想 归并排序( MERGE-SORT )是建立在归并操作上的一种有效的排序算法 , 该算法是采用分治法( Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;…

Python爬虫| 一文掌握XPath

本文概要 本篇文章主要介绍利用Python爬虫爬取付费文章,适合练习爬虫基础同学,文中描述和代码示例很详细,干货满满,感兴趣的小伙伴快来一起学习吧! 🌟🌟🌟个人简介🌟&…

公司来了个00后,我愿称之为卷王之王,卷的让人崩溃...

前几天我们公司一下子来了几个新人,看样子好像都是一些00后,这些年轻人是真能熬啊,本来我们几个老油子都是每天稍微加会班就打算下班走了,这几个新人一直不走,搞得我们也不好提前走。 2023年春招已经过去了&#xff0…

网络安全前景怎么样?怎么自学?看这一篇就够了

一、网络安全前景 网络安全行业细分岗位比较多,目前需求量比较大的几类网络安全岗位有渗透测试、安全运维、等保测评等,在岗位需求量和薪资待遇方面都比较可观。 这时很多人就会问,网络安全人才需求量这么大,进入行业的人就会越来…

【redis】案例--迷你版微信抢红包

系列文章目录 文章目录 系列文章目录前言在这里插入图片描述 一、业务描述二、需求分析三、架构设计关键点拆红包算法 二倍均值算法 图解 四、编码实现 RedPackageController整体思路:发红包代码进入拆分红包算法抢红包代码 五、多学一手 前言 一、业务描述 二、需求…

鲁棒优化入门(四)——超详细讲解:两阶段鲁棒优化以及列与约束生成算法(CCG)的matlab+yalmip代码实现

本文的主要参考文献: Zeng B , Zhao L . Solving Two-stage Robust Optimization Problems by A Constraint-and-Column Generation Method[J]. Operations Research Letters, 2013, 41(5):457-461. 1.两阶段鲁棒优化问题的引入 鲁棒优化是应对数据不确定性的一种优…