基于cifar-10数据集进行深度学习练手

        现在已经开始对点云的学习,回头复习之前学习的2D的学习并做个记录留个学过的痕迹免得后期自己忘记学过的东西。本文基于cifar-10进行多分类网络架构的研究,将从激活函数、网络主干、数据增强等方面进行对比实验。代码下载链接:(3条消息) 基于cifar-10数据集进行深度学习练手代码-Python文档类资源-CSDN文库

cifar-10数据集

CIFAR-10 数据集由 60000张 32x32 彩色图像组成,一共分为10类,其中每类包含 6000 张图像(5000张训练图片和1000张测试图片组成)

数据集组成如下:

         将采用的主干网络有:普通net-5,vgg16。进行了如下几个方面的工作,对Relu激活函数和Mish激活函数进行对比实验、增加网络层数对训练结果的影响、利用ResNet网络对原始网络进行优化、利用数据增强技术对训练图片进行处理、研究BacthSize大小值对Gpu利用率的影响以及学习率大小对测试集精度的作用。

2.3  模型的选择

激活函数

早期人们在深度学习的工作中常常采用Sigmoid这类饱和激活函数(Saturated Neurons)。但是在使用过程中发现,该函数极容易导致梯度消失的问题。而饱和神经元会使得梯度消失问题雪上加霜,当Sigmoid的值特别大或特别小的时候,即使从上一步得到梯度较大,也无法得到有效的更新。所以本文最开始采用的Relu激活函数,该函数的提出就是为了解决梯度消失问题。

Relu的梯度只可以取两个值:0或1,当输入小于0时,梯度为0;当输入大于0时,梯度为1。好处就是:ReLU的梯度的连乘不会收敛到0,连乘的结果也只可以取两个值:0或1 。如果值为1,梯度保持值不变进行前向传播;如果值为0 ,梯度从该位置停止前向传播。即

f(x)=max(0,x)

 激活函数如图2.1

2.1Relu激活函数

        在实验的过程中为了进一步提高测试集的进度,我注意到Diganta Misra的一篇题为“Mish: A Self Regularized Non-Monotonic Neural Activation Function”的新论文,该篇中介绍了一个新的深度学习激活函数,该函数在最终准确度上比Swish(+.494%)和ReLU(+ 1.671%)都有提高。

Mish激活函数公式:

Mish=x*tanh(ln(1+e^x ))

激活函数图如下

2.2mish激活函数

Mish激活函数在Relu的基础上优化而来,继承了Relu非饱和的特点,因此可以保证训练的过程中不会有梯度消失的问题。但是Miah函数在设计上不具备单调性,这使得训练过程中,在很小负值输入的同时具备提高训练的表现力和梯度保留量。此外,相比于Relu函数,Mish函数在0点具备光滑的特性,这使得在求解和模型泛化性的方面表现得更加的优良。

损失函数

由于cifar-10数据集属于多分类,所以本文所有实验均使用交叉熵函数,单个交叉熵函数如下

L= -[ylogy ̂+(1-y)log(1-y ̂ )]

通过公式可知当y=1时,L=-logy ,在下图中,横坐标是预测输出,纵坐标是交叉熵损失函数 L。显然,预测输出越接近真实样本标签 1,损失函数 L 越小;预测输出越接近 0,L 越大。因此,函数的变化趋势完全符合实际需要的情况。当y=0时,同样,预测输出越接近真实样本标签 0,损失函数 L 越小;预测函数越接近 1,L 越大。函数的变化趋势也完全符合实际需要的情况。从下面两种图,可以帮助我们对交叉熵损失函数有更直观的理解。无论真实样本标签 y 是 0 还是 1,L 都表征了预测输出与 y 的差距。

2.3交叉熵函数的两种结果

优化器的选择

在本文中所有实验均采用Momentum-SGD优化器(带动量的随机梯度下降),该优化器是在SGD的基础上,引入一阶动量,增加惯性。SGD的缺点是参数更新方向只依赖于当前batch计算出的梯度,因此十分的不稳定。为了抑制SGD的震荡,所以在梯度下降的过程中加入惯性。T时刻下降的方向,不是仅仅由当前点的梯度方向决定,而是之前所有的点共同的梯度累积决定的。如果和历史下降方向相同,动量使得当前梯度将被加强,反之,若是当前梯度方向与历史方向相反,则会减弱梯度下降的幅度。梯度振幅公式如下

v_(t+1)=ρv_t+∇f(x_t )

x_(t+1)=x_t-αv_(t+1)

数据增强

由于cifar-10数据集输入图像的大小只有32x32px,如果对图片进行填充和裁剪等数据增强的方法,会对图片的影响过大。所以实验中尽可能考虑不增减图片的纹理信息。所以我采用了根据概率对图片进行随机翻转和随机灰度化的数据增强方式。

主干网络

在主干网络设计上借鉴了一些主流的网络架构,并在已有的网络结构上设计了适合cifar-10数据集的网络架构。为了对比方便,简化了net-8的网络架构,从net-8设计了层数更少的net-5。此外还将vgg16做了相应的调整。

修改后的net-5网络主干图:

2.4net-5网络图

本网络由3个卷积层以及3个全连接层组成,每个卷积层后面紧跟着一个BacthNorm和Mish激活层。

Vgg16网络主干图:

2.5vgg16网络图

VGG16 由13个隐藏层加3个全连接层组成 其中13个隐藏层分别是: 2 层 3*3 的卷积层(激活函数为Relu,后接 2*2 最大池化层)。而本文相比于一般的vgg16,在全连接层处增加了一层,且全连接层处均使用了的Dropout用于降低过拟合的情况。此外还运用Mish激活函数代替Relu激活函数进行实验。

3实验

3.1Net-5上对比实验

该部分实验结果请查看Table1

数据增强前后实验

在此实验中,使用相同的框架,即net-5网络、Momentum-SGD优化器(每batch_size衰减为0.001,动量值为0.9)、Relu激活函数。并且所用参数均相同。学习率为0.005、batch_size大小为64。Epoch均为20次

  

在没有使用数据增强的网络上,尽管测试集收敛得更快,但是测试集上的准确率表现却不怎么样。在20个Epoch的情况下,训练的准确率达到百分之九十七,而测试集上的表现却只有百分之七十六左右,显然是过拟合的现象,而通过数据增强的网络在测试集上的准确率提高了2到3个百分点。

Net-5系列实验

    在Net-5主干网络上分别保持其他参数不变且同时都使用了数据增强做了如下不同激活函数和不同优化器函数的实验,实验数据如下图所示。

  

3.2两种不同优化器在net-5网络的结果

    在使用使用adam优化器的方法上,测试集结果没有显著的提升,甚至有所下降,这是和预期结果有差距的。是因为在调试程序时,对于adam优化器来说学习率大小不合适导致了小幅度的过拟合现象。但可以从上图中看出使用adam优化器提升了收敛速度。

  

3.3 两种不同激活函数的实验结果

    在使用了Mish激活函数后,模型在测试集上的准确率提高了1.5个百分点,和原论文中数据相差无几,因为Mish激活函数以无边界(即正值可以到达任何高度)避免了由于封顶而导致的饱和,而且理论上对负值的轻微允许使得模型获得了更好的梯度流。虽然对于模型来说计算更加复杂,时间花费更多,但是中和测试集上的表现,增加的这点时间是值得的。

Table1:net-5几种参数实验结果

主干网络

优化器

激活函数

数据增强

Test准确率

Train准确率

Net-5

SGD

Relu

76.56

97.92

Net-5

SGD

Relu

78.91

91.43

Net-5

SGD

Mish

80.41

93.17

Net-5

Adam

Relu

78.69

95.62

3.2Net-5与Vgg16对比实验

该部分实验结果请查看Table2

在这部分实验中主要针对其他环境相同,更换层数更深的Vgg16对cifar-10数据集分类准确率的影响。实验数据如下

  

  

3.4不同网络对模型准确率的影响

在Vgg16网络上准确率最高达到了86%,相比于Net-5提高了7-8个百分点。由于网络层数的提高,使得模型能获得更多的特征点,从而使得模型准确率得到大幅度的提高。从Vgg16的两种激活函数在模型的不同结果,进一步表现出Mish激活函数在零点附近的平滑性对于模型优化的好处。

Table2:两种模型结果

主干网络

优化器

激活函数

数据增强

Test准确率

Train准确率

Net-5

SGD

Relu

78.91

91.43

Net-5

SGD

Mish

80.41

93.17

Vgg16

SGD

Relu

86.55

95.42

Vgg16

SGD

Mish

87.67

96.39

3.3 应用ResNet实验

通过对上述实验中设计的VGG16网络架构进行添加残差层得到新的残差网络模型,新的网络模型在每个卷积后面分别加上一个残差层,两种链接方式如下图所示

3.5残差网络图

Net5_ResNet对比Net5

  

3.6 Net5_ResNet对比Net5结果图

    对原始Net5网络中每个卷积层后面添加了两个残差层,使得模型的各个方面都得到了显著的提升。测试集的准确率更靠近训练集的准确率。此外模型准确率提升了4个百分点。但是由于参数的增加也导致了收敛速度变得更慢。

Table3 Net5_ResNet对比Net5数据

主干网络

优化器

激活函数

数据增强

Test准确率

Train准确率

Net-5

SGD

Relu

78.91

91.43

Net-5_ResNet

SGD

Relu

82.96

91.26

VGG16_ResNet上两种激活函数实验

     

3.7利用残差网络修改VGG16 

通过对VGG16添加残差网络层进行多次实验发现,测试集数据的准确率峰值能达到88.46%左右。相较于原始VGG16模型而言并没有显著的提升。但是测试集准确率和训练集准确率在同步上升,有明显的降低VGG16过拟合的表现。残差网络没有明显提升模型准确率说明在未添加残差网络时的模型已经能很好的提取特征信息。如果想进一步提高模型准确率需要选择更加优秀的网络架构。

总结

尽管现在针对cifar-10数据集训练的准确率远高于我的实验结果,但是本文抱着学习的态度对cifar-10进行了重头开始的网络搭建。借助pytorch框架进行学习研究。在最开始搭建的net-5网络实现70%准确率的基础上逐步进行完善。在最后完善的模型上能达到90%的准确率,让我对深度学习有了全新的认知,并不是每一个先进的技术就一定适合自己的模型,一定要根据实验的实际情况对模型的各种参数进行选择。往往选择大于努力在实验的过程中也是如此。文中的数据以及图片均为自己用python实现,代码已附上

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: 使用TensorFlow进行深度学习CIFAR-10数据集的模型训练和识别可以遵循以下步骤: 1. 导入必要的库和CIFAR-10数据集:首先,需要导入TensorFlow和其他必要的库(例如numpy、matplotlib等),并下载CIFAR-10数据集。可以使用TensorFlow内置的数据集API或手动下载数据集。 2. 数据预处理:在将数据提供给模型之前,需要对数据进行预处理,例如将像素值归一化、对标签进行独热编码等。 3. 构建模型:可以使用TensorFlow的高级API(例如Keras)来构建深度学习模型。通常,使用卷积神经网络(CNN)来处理图像数据。可以根据任务的要求设计适当的网络结构。 4. 模型编译和训练:在将数据提供给模型之前,需要对数据进行预处理,例如将像素值归一化、对标签进行独热编码等。使用适当的优化器和损失函数来编译模型,并使用训练集训练模型。 5. 模型评估:在训练模型后,可以使用测试集对模型进行评估。可以计算准确率、损失函数值等指标。 6. 模型应用:在模型训练和评估后,可以使用模型进行预测。提供新的输入数据,模型将返回预测结果。 总之,使用TensorFlow进行CIFAR-10数据集深度学习模型训练和识别需要对数据进行预处理、构建CNN模型、编译和训练模型、评估模型以及应用模型进行预测。 ### 回答2: 深度学习是一种以神经网络为基础的机器学习方法,而TensorFlow是一个由谷歌公司开发的支持深度学习的开源框架。在TensorFlow框架下,使用卷积神经网络(Convolutional Neural Network,CNN)对CIFAR-10数据集进行分类是一个非常经典的任务。 CIFAR-10数据集包含了10个不同的分类标签,包括飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船和卡车,每类数据有5000个训练样本和1000个测试样本。因此,模型的训练可以使用训练集进行,而测试过程则基于测试集进行。 在构建CNN模型时,可以使用序列化API(Sequential API)或函数式API(Functional API)进行设计和开发。对于序列化API,可以选择将不同的深度网络层(如卷积层、池化层、全连接层等)按照顺序叠加组合。而对于函数式API,则允许具有多个输入和输出的复杂模型。典型的CNN模型包括卷积层、池化层和全连接层。 在模型训练过程中,常用的优化器是随机梯度下降(Stochastic gradient descent,SGD)。还可以使用其他优化算法,如动量法(Momentum),Adagrad和Adam。同时,在训练过程中,需要考虑过拟合的问题,采取常用的对策如正则化、dropout等。 在模型训练完成后,测试模型将是一个核心的任务。可以通过计算模型的精确性(accuracy)和损失函数(loss)来验证模型的准确性。而常用的评估指标还包括ROC曲线、AUC值等。 总之,TensorFlow的深度学习CIFAR-10数据集上的模型训练与识别任务是一个非常具有挑战性的任务。它需要深入理解神经网络的架构和特性,同时也需要熟悉常用的训练算法和评估指标。随着不断发展的人工智能技术和深度学习模型,TensorFlow在各个领域的应用前景非常广阔。 ### 回答3: TensorFlow是一个深度学习框架,广泛应用于研究和工业应用中。CIFAR10是一个广泛使用的图像分类数据集,由10个类别的60000张32x32像素图像组成。 TensorFlow提供了许多工具和API来训练和识别基于CIFAR10数据集的模型。 1. 准备数据 CIFAR10数据集可以从网上下载,通过使用Python编写脚本可以将其转换成可用于TensorFlow训练和识别的格式。例如,使用TensorFlow的数据输入库,可以将图像预处理,并将其转换为模型输入的batch格式。 2. 定义模型 可以使用TensorFlow构建各种类型的神经网络来训练CIFAR10数据集,如卷积神经网络(CNN)和循环神经网络(RNN)。TensorFlow提供的各种API可以方便地定义网络的结构和层,从而创建一个高效的图像分类器。 3. 训练模型 要训练模型,需要使用TensorFlow的优化器来计算和调整网络权重和偏置,以最小化损失函数。在训练期间,还需要定义一些指标来监控模型的性能和进度。可以使用TensorFlow提供的训练API,创建训练循环,并针对单个或多个GPU进行分布式训练。 4. 评估和测试模型 为确保神经网络在完全独立于训练数据的环境中运行良好,需要对其进行评估和测试。可以使用TensorFlow提供的API,对模型的准确性和性能进行评估。评估模型时,可以使用验证数据集,在训练过程中监控模型的泛化性能,避免过拟合。 5. 部署模型 一旦模型经过训练并通过评估,就可以使用TensorFlow的模型导出和转换工具,将其部署到生产环境中。TensorFlow支持将模型导出为TensorFlow Lite格式,以在移动设备上运行,并提供了Java,C++和Python等多种语言的API,便于将模型嵌入到应用程序中。 总之,TensorFlow提供了几种方法来训练和识别CIFAR10数据集上的模型。可以结合使用TensorFlow的API,优化器和分布式训练工具,以提高模型效率和性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ng_T

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

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

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

打赏作者

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

抵扣说明:

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

余额充值