【人工智能项目】CIFAR10识别实验及分析

【人工智能项目】CIFAR10识别实验及分析

在这里插入图片描述
本次分享的是当时接的一个实验报告的活儿,那么话不多说 ,走起来瓷!!!

一、 数据预处理

1.1 实验环境

本实验采用的软硬件实验环境如表所示:
在这里插入图片描述
在Windows操作系统下,采用基于Tensorflow的Keras的深度学习框架,对MNIST进行训练和测试。

采用keras的深度学习框架,keras是一个专为简单的神经网络组装而设计的Python库,具有大量预先包装的网络类型,包括二维和三维风格的卷积网络、短期和长期的网络以及更广泛的一般网络。使用keras构建网络是直接的,keras在其Api设计中使用的语义是面向层次的,网络组建相对直观,所以本次选用Keras人工智能框架,其专注于用户友好,模块化和可扩展性。

1.2 实验数据集CIFAR10介绍

CIFAR-10数据集由10个类的60000个32x32彩色图像组成,每个类有6000个图像。有50000个训练图像和10000个测试图像。

数据集分为五个训练批次和一个测试批次,每个批次有10000个图像。测试批次包含来自每个类别的恰好1000个随机选择的图像。训练批次以随机顺序包含剩余图像,但一些训练批次可能包含来自一个类别的图像比另一个更多。总体来说,五个训练集之和包含来自每个类的正好5000张图像。
以下是数据集中的类,以及来自每个类的10个随机图像:
在这里插入图片描述

1.3 数据预处理

数据预处理阶段对图像进行归一化处理,我们将图片中的这些值缩小到 0 到 1 之间,然后将其馈送到神经网络模型。为此,将图像组件的数据类型从整数转换为浮点数,然后除以 255。这样更容易训练,以下是预处理图像的函数:务必要以相同的方式对训练集和测试集进行预处理:

之后对标签进行one-hot编码处理:将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点;机器学习算法中,特征之间距离的计算或相似度的常用计算方法都是基于欧式空间的;将离散型特征使用one-hot编码,会让特征之间的距离计算更加合理。

1.4 数据预处理核心代码

(1) 加载数据集
# 加载数据集
cifar10 = tf.keras.datasets.cifar10
(train_images, train_labels), (test_images, test_labels) = cifar10.load_data()
(2) 数据集展示
#显示训练集中的前 25 张图像,并在每张图像下显示类别名称。验证确保数据格式正确无误,然后我们就可以开始构建和训练网络了。
plt.figure(figsize=(10,10))
for i in range(25):
    ## 在当前图下生成子图 5*5个图
    plt.subplot(5,5,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)
    plt.imshow(train_images[i], cmap=plt.cm.binary)
    #显示 当前图片的类别
plt.xlabel(train_labels[i])
(3) 数据归一化
train_images = train_images / 255.0
test_images = test_images / 255.0

二、模型构建

模型搭建采用VGG16的形式,进行搭建。并搭建了一个建议的MLP感知器模型与之对比模型效果,

2.1 模型代码

(1)MLP感知器
# Build MLP
model = Sequential()

model.add(Dense(units=256,
                input_dim=784,
                kernel_initializer='normal',
                activation='relu'))
model.add(Dense(units=128,
                kernel_initializer='normal',
                activation='relu'))
model.add(Dense(units=64,
                kernel_initializer='normal',
                activation='relu'))
model.add(Dense(units=10,
                kernel_initializer='normal',
                activation='softmax'))

model.summary()
(2)CNN卷积神经网络
# 搭建VGG16
#layer1 32*32*3
model = Sequential()
model.add(Conv2D(64, (3, 3), padding='same',
input_shape=(32,32,3)))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(Dropout(0.3))

#layer2 32*32*64
model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2),strides=(2,2),padding='same')  )

#layer3 16*16*64
model.add(Conv2D(128, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(Dropout(0.4))

#layer4 16*16*128
model.add(Conv2D(128, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))

#layer5 8*8*128
model.add(Conv2D(256, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(Dropout(0.4))

#layer14 1*1*512
model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(BatchNormalization())

#layer15 512
model.add(Dense(512))
model.add(Activation('relu'))
model.add(BatchNormalization())

#layer16 512
model.add(Dropout(0.5))
model.add(Dense(10))
model.add(Activation('softmax'))
# 10
model.summary()

2.2 模型解释

模型训练过程中,我们用到VGG-5的卷积神经网络结构。
在这里插入图片描述

VGGNet是牛津大学计算机视觉组和Google DeepMind公司的研究员一起研发的深度卷积神经网络,并在2014年举办的ILSVRC中获得了定位任务第一名和分类任务第二名的好成绩。它继承了AlexNet的思路,一样由5个卷积层和3个全连接层组成。只不过在每个卷积层中进行2~4次连续卷积。

  • 在VGGNet中,卷积层使用的卷积核均为3x3,步长为1.卷积之后都要进行最大池化Max pooling,池化核为2x2,步长为2.
  • 所有的隐藏层都使用ReLU激活函数
  • 全连接层1,2使用Dropout来避免过拟合,概率为0.5

其多次重复使用同一大小的卷积核来提取更复杂和更具有表达性的特征。卷积核采用33的卷积,VGGNet拥有5段卷积,每一段内有2~3个卷积层,同时每段尾部都会连接一共最大池化层用来缩小图片尺寸。每段内的卷积核数量一样,越靠后的段的卷积核数量越多:64-128-256-512-512.其中经常出现多个完全一样的33的卷积层堆叠在一起的情况,这其实是非常有用的设计。两个3x3的卷积层串联相当于一个1个5x5的卷积层,即一个像素会跟周围55的像素产生关联,可以说感受野的大小为5x5.三个3x3的卷积层串联的效果则相当于1个7x7的卷积层。除此之外,3个串联的33的卷积层,拥有比1个7x7的卷积层更少的参数量,只有后者的一半。最重要的是,3个3x3的卷积层拥有比1个7x7的卷积层更多的非线性变换(前者可以使用三次ReLU激活函数,而后者只有一次),使得CNN对特征的学习能力更强。

总之在VGG16模型中:

  • 1.用多层的卷积层组合配以小尺寸的滤波器,能实现大尺寸滤波器的感受野的同时,还能使参数数量更少;
  • 2.表示层深度的增加,能有效提升模型的性能;
  • 3.模型融合的性能优于单模型的性能;
  • 4.训练期间分阶段降低学习率有助模型收敛;

三、结果和可视化

3.1 结果

初始参数设定好之后开始训练,每次训练需要微调参数以得到更好的训练结果,经过多次尝试,最终设定参数为:

  • 优化器:adam优化器
  • 训练轮数:30
  • 每次输入的数据量:256

VGG16的卷积神经网络对CIFAR数据集进行训练,并采用上述的模型参数,进行30轮训练,在训练集上达到了98%的准确率,在测试集上达到了81.8%的准确率。

为了更好的分析我们的结果,这里用混淆矩阵来评估我们的模型性能。在模型评估之前,先学习一些指标。

TP(True Positive):将正类预测为正类数,真实为0,预测也为0FN(False Negative):将正类预测为负类数,真实为0,预测为1FP(False Positive):将负类预测为正类数, 真实为1,预测为0。TN(True Negative):将负类预测为负类数,真实为1,预测也为1混淆矩阵定义及表示含义:

混淆矩阵是机器学习中总结分类模型预测结果的情形分析表,以矩阵形式将数据集中的记录按照真实的类别与分类模型预测的类别判断两个标准进行汇总。其中矩阵的行表示真实值,矩阵的列表示预测值,下面以本次案例为例,如下:
其在各类上的精准率和召回率如下图所示
在这里插入图片描述

在测试集上的准确率为
在这里插入图片描述
在测试集上的混淆矩阵如下图所示:
在这里插入图片描述

3.2 结果对比

并与四层全连接层模型进行对比,全连接层的模型结构如下:
在这里插入图片描述
其结果如下:
在这里插入图片描述
在这里插入图片描述

总之,从结果上来看,最后经过不断地参数调优最终训练出了一个分类正确率在80%左右的模型,并且通过实验证明了模型具有很强的鲁棒性。

四、课程收获与建议

本文通过对卷积神经网络的研究流程分析,提出了一套完整的卷积神经网络CIFAR10手写体识别流程并也将本文的数据集分类正确率提高到80%的水平;其次,本文构建的模型是具有普适性的,可以稍加改进就应用于不同的数据集进行特征提取及分类。再次,本文在构建模型的过程中综合考虑了计算资源和时间成本,构建的卷积神经网络模型在普通的个人笔记本上即可进行训练,此外还增加了MLP感知器作为对比,从结果中看出卷积神经网络效果更好。综合以上几点来看,本文的研究具有现实可应用性,具有可推广性,因而具有较高的实用价值!

在这里插入图片描述

  • 7
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mind_programmonkey

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值