基于cifar10数据集CNN卷积网络的实现

简介: 基于cifar10数据集CNN卷积网络的实现

1.CNN简介

CNN是卷积神经网络的简称,是深度学习的算法之一,目前在图像的分割领域有着广泛的应用。因为卷积神经网络概念很多可以参考如下的博客:

1、CNN笔记:通俗理解卷积神经网络:https://blog.csdn.net/v_JULY_v/article/details/51812459

2、卷积神经网络(CNN)详解https://zhuanlan.zhihu.com/p/47184529


2.环境配置

采用Anaconda3配置的python环境,选择TensorFlow-CPU2.1版本(本人TensorFlow-GPU测试不成功),需要额外导入matplotlib库。具体可以参照:【北京大学】Tensorflow2.0

项目工程文件


3. 数据集准备

这里我们使用cifar10数据集,下面对cifar10数据集做个简单介绍,参考博客为:https://blog.csdn.net/DaVinciL/article/details/78793067

3.1 CIFAR-10数据集

CIFAR-10数据集由10类32x32的彩色图片组成,一共包含60000张图片,每一类包含6000图片。其中50000张图片作为训练集,10000张图片作为测试集。CIFAR-10数据集被划分成了5个训练的batch和1个测试的batch,每个batch均包含10000张图片。测试集batch的图片是从每个类别中随机挑选的1000张图片组成的,训练集batch以随机的顺序包含剩下的50000张图片。不过一些训练集batch可能出现包含某一类图片比其他类的图片数量多的情况。训练集batch包含来自每一类的5000张图片,一共50000张训练图片。下图显示的是数据集的类,以及每一类中随机挑选的10张图片,如图 1 CIFAR-10数据集:

1.png


图 1 CIFAR-10数据集

3.2 tensorflow2.0下载

tensorflow2.0下载数据集准备,使用如下代码即可完成下载。

cifar10 = tf.keras.datasets.cifar10

但是需要科学上网,官方给出了多个CIFAR-10数据集的版本,如表格 1 CIFAR-10数据集的版本以下是链接:

表格 1 CIFAR-10数据集的版本

Version Size md5sum
CIFAR-10 python version 163 MB c58f30108f718f92721af3b95e74349a
CIFAR-10 Matlab version 175 MB 70270af85842c9e89bb428ec9976c926
CIFAR-10 binary version (suitable for C programs) 162MB c32a1d4ab5d03f1284b67883e8d87530

此处我们下载python版本。下载完成后,解压,放到我截图中的位置即可,如图 2 数据集路径。

2.png

图 2 数据集路径

4 tensenflow2.0中关于卷积相关函数简介

4.1 数据集加载函数

cifar10 = tf.keras.datasets.cifar10
(x_train,y_trian),(x_test,y_test) = cifar10.load_data()

这里我们使用tf中keras模块加载数据集,最后会返回两个元组,一个为训练集,一个为测试集,函数为load_data()

4.2 Conv2D

tf.keras.layers.Conv2D(
    filters, kernel_size, strides=(1, 1), padding='valid', data_format=None,
    dilation_rate=(1, 1), activation=None, use_bias=True,
    kernel_initializer='glorot_uniform', bias_initializer='zeros',
    kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None,
    kernel_constraint=None, bias_constraint=None, **kwargs
)

该函数将创建一个卷积核,这里我只使用filters(卷积核),kerel_size(卷积核大小),strides(步长),padding(全零填充,valid表示不使用全零填充,same表示使用全零填充)

4.3 BatchNormalization

tf.keras.layers.BatchNormalization(
    axis=-1, momentum=0.99, epsilon=0.001, center=True, scale=True,
    beta_initializer='zeros', gamma_initializer='ones',
    moving_mean_initializer='zeros', moving_variance_initializer='ones',
    beta_regularizer=None, gamma_regularizer=None, beta_constraint=None,
    gamma_constraint=None, renorm=False, renorm_clipping=None, renorm_momentum=0.99,
    fused=None, trainable=True, virtual_batch_size=None, adjustment=None, name=None,
    **kwargs
)

该函数为披标准化函数,作用为:加速收敛、控制过拟合,可以少用或不用Dropout和正则、降低网络对初始化权重不敏感、允许使用较大的学习率。

4.4 Activation

tf.keras.layers.Activation(
    activation, **kwargs
)


指定当前神经网络层激活函数,这里我们使用relu激活函数,

4.5 MaxPool2D

tf.keras.layers.MaxPool2D(
    pool_size=(2, 2), strides=None, padding='valid', data_format=None, **kwargs
)

最大池化函数,pool_size(池化层大小),strides(步长),padding(是否使用全零填充,valid表示不使用全零填充,same表示使用全零填充)

4.6 Dropout

tf.keras.layers.Dropout(
    rate, noise_shape=None, seed=None, **kwargs
)

该函数用来随机舍弃神经元,防止训练过程中出现过拟合情况,我们只用rate

总结:在搭建卷积神经网络过程中我们使用到了如下的口诀,CBAPD,分别对应tf函数为Conv2D,BatchNormalization,Activation,MaxPool2D,Dropout,请记住,卷积就是特征提取器,在下边的代码中我们会遵循CBAPD来实现一个卷积神经网络

5 基础卷积神经网络实现

这里我们要搭建一个这样结构的卷积神经网络,CBAPD,CBA,CBAPD,全连接层(12812810)

3.png

5.1 加载数据集

cifar10 = tf.keras.datasets.cifar10
(x_train,y_trian),(x_test,y_test) = cifar10.load_data()

5.2 归一化处理

运用归一化处理能够加快神经网络收敛速度

x_train,x_test = x_train/255.0,x_test/255.0

5.3 搭建卷积模型(重点)

这里我们不同于我之前的博客,我们使用类的方式来搭建CNN,随后的博客中也只需要更改3中的卷积模块即可实现功能。

这里我们指定一个类,继承自tf.keras.Model

class Baseline(Model):


然后弄一个初始化函数

def __init__(self):

再实现父类的init方法

super(Baseline,self).__init__()

完整代码如下

class Baseline(Model):
    def __init__(self):
        super(Baseline,self).__init__()
        self.c1 = Conv2D(filters=6,kernel_size=(5,5),padding="same")#卷积层
        self.b1 = BatchNormalization()#BN层
        self.a1 = Activation("relu")
        self.p1 = MaxPool2D(pool_size=(2,2),strides=2,padding="same")#池化层
        self.d1 = Dropout(0.2)
        self.c2 = Conv2D(filters=12,kernel_size=(5,5),padding="same")
        self.b2 = BatchNormalization()
        self.a2 = Activation("relu")
        self.c3 = Conv2D(filters=24,kernel_size=(5,5),padding="same")
        self.b3 = BatchNormalization()
        self.a3 = Activation("relu")
        self.p3 = MaxPool2D(pool_size=(2,2),strides=2,padding="same")
        self.d3 = Dropout(0.2)
        self.flatten = Flatten()
        self.f1 = Dense(128,activation="relu")
        self.d4 = Dropout(0.2)
        self.f2 = Dense(128,activation="relu")
        self.d5  =Dropout(0.2)
        self.f3 = Dense(10,activation="softmax")

结合CBAPD是不是显得很清晰呢,到这里我们完成了网络结构的搭建,现在我们还要过一遍前向传播

我们使用call函数来表示

def call(self,x):
    x = self.c1(x)
    x = self.b1(x)
    x = self.a1(x)
    x = self.p1(x)
    x = self.d1(x)
    x = self.c2(x)
    x = self.b2(x)
    x = self.a2(x)
    x = self.c3(x)
    x = self.b3(x)
    x = self.a3(x)
    x = self.p3(x)
    x = self.d3(x)
    x = self.flatten(x)
    x = self.f1(x)
    x = self.d4(x)
    x = self.f2(x)
    x = self.d5(x)
    y = self.f3(x)
    return y

5.4 训练过程参数配置

这里可以参考我之前的这篇博客,细节讲解全在里边了https://blog.csdn.net/JohnLeeK/article/details/106423634

5.4.1 指定学习率,优化器等

model.compile(optimizer = tf.keras.optimizers.Adam(
    learning_rate = 0.001,beta_1 = 0.9,beta_2 = 0.999#自定义动量,adam和学习率,也是为了提高准确率
),
              loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
              metrics = ["sparse_categorical_accuracy"]
              )

5.4.2 断点续训:

checkpoint_save = "./checkpoinCNNBase/Baseline.ckpt"
if os.path.exists(checkpoint_save+".index"):
    print("---------------load the model----------------------")
    model.load_weights(checkpoint_save)
cp_callback = tf.keras.callbacks.ModelCheckpoint(
    filepath = checkpoint_save,
    save_weights_only = True,
    save_best_only = True
)

5.4.3 将数据喂入神经网络

history = model.fit(
    x_train,y_trian,batch_size = 2048,epochs = 300,validation_data = (x_test,y_test),
    validation_freq = 1,callbacks = [cp_callback]
)

5.4.4 打印网络结构

model.summary()

5.4.5 保存权重

file = open("./cifar10_weights.txt","w")
for v in model.trainable_variables:
    file.write(str(v.name)+"\n")
    file.write(str(v.shape)+"\n")
    file.write(str(v.numpy())+"\n")
file.close()

5.4.6 绘制准确率和损失函数并保存

acc = history.history["sparse_categorical_accuracy"]
val_acc = history.history["val_sparse_categorical_accuracy"]
loss = history.history["loss"]
val_loss = history.history["val_loss"]
plt.subplot(1,2,1)
plt.plot(acc,label = "Training Acc")
plt.plot(val_acc,label = "Validation Acc")
plt.title("Training and Validation Acc")
plt.legend()
plt.subplot(1,2,2)
plt.plot(loss,label = "Training Loss")
plt.plot(val_loss,label = "Validation Loss")
plt.title("Trainning and Validation Loss")
plt.legend()
plt.savefig("./day4_cifar1_baseline")

6 结果展示

训练结果如图 3 训练结果acc和loss可视化

4.png

图 3 训练结果acc和loss可视化

这里可以看到在经过300轮的训练之后我们的神经网络,对cifar10数据集的分类准确率能达到80%以上,但是我们还可以发现80%并不是最优的结果,从图中观察可以发现准确率曲线没有趋于平滑,还有上升的趋势,原因如下:

1.我训练次数偏少只训练了300轮,对于当前网络模型并未达到最优解

2.我并未对神经网络结构进行优化,卷积层数较少,特征提取能力较弱

3.全连接层偏少分类预测率较低

目录
相关文章
|
5天前
|
机器学习/深度学习 计算机视觉 Python
【YOLOv11改进 - 注意力机制】SimAM:轻量级注意力机制,解锁卷积神经网络新潜力
【YOLOv11改进 - 注意力机制】SimAM:轻量级注意力机制,解锁卷积神经网络新潜力本文提出了一种简单且高效的卷积神经网络(ConvNets)注意力模块——SimAM。与现有模块不同,SimAM通过优化能量函数推断特征图的3D注意力权重,无需添加额外参数。SimAM基于空间抑制理论设计,通过简单的解决方案实现高效计算,提升卷积神经网络的表征能力。代码已在Pytorch-SimAM开源。
【YOLOv11改进 - 注意力机制】SimAM:轻量级注意力机制,解锁卷积神经网络新潜力
|
1天前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
|
8天前
|
机器学习/深度学习 监控 自动驾驶
卷积神经网络有什么应用场景
【10月更文挑战第23天】卷积神经网络有什么应用场景
12 2
|
8天前
|
机器学习/深度学习 自然语言处理 算法
什么是卷积神经网络
【10月更文挑战第23天】什么是卷积神经网络
16 1
|
11天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
32 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
12天前
|
机器学习/深度学习 人工智能 自动驾驶
深度学习中的卷积神经网络(CNN)及其应用
【10月更文挑战第21天】本文旨在深入探讨深度学习领域的核心组成部分——卷积神经网络(CNN)。通过分析CNN的基本结构、工作原理以及在图像识别、语音处理等领域的广泛应用,我们不仅能够理解其背后的技术原理,还能把握其在现实世界问题解决中的强大能力。文章将用浅显的语言和生动的例子带领读者一步步走进CNN的世界,揭示这一技术如何改变我们的生活和工作方式。
|
1天前
|
机器学习/深度学习 人工智能 TensorFlow
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第32天】本文将介绍深度学习中的一个重要分支——卷积神经网络(CNN),以及其在图像识别领域的应用。我们将通过一个简单的代码示例,展示如何使用Python和TensorFlow库构建一个基本的CNN模型,并对其进行训练和测试。
|
7天前
|
机器学习/深度学习 自然语言处理 TensorFlow
深度学习中的卷积神经网络(CNN)及其应用
【10月更文挑战第26天】在这篇文章中,我们将深入探讨卷积神经网络(CNN)的基本原理、结构和应用。CNN是深度学习领域的一个重要分支,广泛应用于图像识别、语音处理等领域。我们将通过代码示例和实际应用案例,帮助读者更好地理解CNN的概念和应用。
|
9天前
|
机器学习/深度学习 算法 计算机视觉
深度学习与生活:如何利用卷积神经网络识别日常物品
【10月更文挑战第24天】在这篇文章中,我们将探索深度学习如何从理论走向实践,特别是卷积神经网络(CNN)在图像识别中的应用。通过一个简单的示例,我们将了解如何使用CNN来识别日常生活中的物体,如水果和家具。这不仅是对深度学习概念的一次直观体验,也是对技术如何融入日常生活的一次深刻反思。文章将引导读者思考技术背后的哲理,以及它如何影响我们的生活和思维方式。
|
4天前
|
存储 安全 算法
网络安全与信息安全:漏洞、加密技术及安全意识的重要性
如今的网络环境中,网络安全威胁日益严峻,面对此类问题,除了提升相关硬件的安全性、树立法律法规及行业准则,增强网民的网络安全意识的重要性也逐渐凸显。本文梳理了2000年以来有关网络安全意识的研究,综述范围为中国知网中篇名为“网络安全意识”的期刊、硕博论文、会议论文、报纸。网络安全意识的内涵是在“网络安全”“网络安全风险”等相关概念的发展中逐渐明确并丰富起来的,但到目前为止并未出现清晰的概念界定。此领域内的实证研究主要针对网络安全意识现状与问题,其研究对象主要是青少年。网络安全意识教育方面,很多学者总结了国外的成熟经验,但在具体运用上仍缺乏考虑我国的实际状况。 内容目录: 1 网络安全意识的相关