主页 > Python结构 > 正文

依据PaddlePaddle的图片分类实战 | 深度学习根底使命教程系列

图画比较文字能够供给愈加生动、简略了解及更具艺术感的信息,图画分类是依据图画的语义信息将不同类别图画区别开来,是图画检测、图画切割、物体盯梢、行为剖析等其他高层视觉使命的根底。图画分类在安防、交通、互联网、医学等范畴有着广泛的运用。

  一般来说,图画分类通过手艺提取特征或特征学习办法对整个图画进行悉数描绘,然后运用分类器判别物体类别,因而怎么提取图画的特征至关重要。依据深度学习的图画分类办法,能够通过有监督或无监督的办法学习层次化的特征描绘,然后替代了手艺规划或挑选图画特征的作业。深度学习模型中的卷积神经网络(Convolution Neural Network, CNN) 直接运用图画像素信息作为输入,最大程度上保留了输入图画的一切信息,通过卷积操作进行特征的提取和高层笼统,模型输出直接是图画辨认的成果。这种依据"输入-输出"直接端到端的学习办法取得了非常好的作用。

  本教程首要介绍图画分类的深度学习模型,以及怎么运用PaddlePaddle在CIFAR10数据集上快速完结CNN模型。

  项目地址:http://paddlepaddle.org/documentation/docs/zh/1.3/beginners_guide/basics/image_classification/index.html

  依据ImageNet数据集练习的更多图画分类模型,及对应的预练习模型、finetune操作详情请参照Github:https://github.com/PaddlePaddle/models/blob/develop/PaddleCV/image_classification/README_cn.md

  作用展现

  图画分类包括通用图画分类、细粒度图画分类等。图1展现了通用图画分类作用,即模型能够正确辨认图画上的首要物体。

  图1. 通用图画分类展现

  图2展现了细粒度图画分类-花卉辨认的作用,要求模型能够正确辨认花的类别。

  图2. 细粒度图画分类展现

  一个好的模型既要对不同类别辨认正确,一起也应该能够对不同视角、光照、布景、变形或部分遮挡的图画正确辨认(这儿咱们共同称作图画扰动)。图3展现了一些图画的扰动,较好的模型会像聪明的人类相同能够正确辨认。

  图3. 扰动图片展现[7]

  模型概览

  CNN:传统CNN包括卷积层、全衔接层等组件,并选用softmax多类别分类器和多类穿插熵丢失函数,一个典型的卷积神经网络如图4所示,咱们先介绍用来结构CNN的常见组件。

  图4. CNN网络示例[5]

  • 卷积层(convolution layer): 履行卷积操作提取底层到高层的特征,发掘出图片部分相关性质和空间不变性质。

  • 池化层(pooling layer): 履行降采样操作。通过取卷积输出特征图中部分区块的最大值(max-pooling)或许均值(avg-pooling)。降采样也是图画处理中常见的一种操作,能够过滤掉一些不重要的高频信息。

  • 全衔接层(fully-connected layer,或许fc layer): 输入层到躲藏层的神经元是悉数衔接的。

  • 非线性改变: 卷积层、全衔接层后边一般都会接非线性改变函数,例如Sigmoid、Tanh、ReLu等来增强网络的表达才能,在CNN里最常运用的为ReLu激活函数。

  • Dropout [1] : 在模型练习阶段随机让一些隐层节点权重不作业,进步网络的泛化才能,必定程度上避免过拟合。

  接下来咱们首要介绍VGG,ResNet网络结构。

  VGG:牛津大学VGG(Visual Geometry Group)组在2014年ILSVRC提出的模型被称作VGG模型 [2] 。该模型比较以往模型进一步加宽和加深了网络结构,它的中心是五组卷积操作,每两组之间做Max-Pooling空间降维。同一组内选用屡次接连的3X3卷积,卷积核的数目由较浅组的64增多到最深组的512,同一组内的卷积核数目是相同的。卷积之后接两层全衔接层,之后是分类层。因为每组内卷积层的不同,有11、13、16、19层这几种模型,下图展现一个16层的网络结构。VGG模型结构相对简练,提出之后也有许多文章依据此模型进行研究,如在ImageNet上初次揭露超过人眼辨认的模型[4]便是学习VGG模型的结构。

  图5. 依据ImageNet的VGG16模型

  ResNet:ResNet(Residual Network) [3] 是2015年ImageNet图画分类、图画物体定位和图画物体检测竞赛的冠军。针对跟着网络练习加深导致准确度下降的问题,ResNet提出了残差学习办法来减轻练习深层网络的困难。在已有规划思路(BN, 小卷积核,全卷积网络)的根底上,引进了残差模块。每个残差模块包括两条途径,其间一条途径是输入特征的直连通路,另一条途径对该特征做两到三次卷积操作得到该特征的残差,终究再将两条途径上的特征相加。

  残差模块如图7所示,左面是根本模块衔接办法,由两个输出通道数相同的3x3卷积组成。右边是瓶颈模块(Bottleneck)衔接办法,之所以称为瓶颈,是因为上面的1x1卷积用来降维(图示例即256->64),下面的1x1卷积用来升维(图示例即64->256),这样中心3x3卷积的输入和输出通道数都较小(图示例即64->64)。

  图7. 残差模块

  数据预备

  因为ImageNet数据集较大,下载和练习较慢,为了便利咱们学习,咱们运用CIFAR10数据集。CIFAR10数据集包括60,000张32x32的五颜六色图片,10个类别,每个类包括6,000张。其间50,000张图片作为练习集,10000张作为测验集。图11从每个类别中随机抽取了10张图片,展现了一切的类别。

  图11. CIFAR10数据集[6]

  Paddle API供给了主动加载cifar数据集模块 paddle.dataset.cifar。

  通过输入python train.py,就能够开端练习模型了,以下末节将具体介绍train.py的相关内容。

  模型结构

  Paddle 初始化

  让咱们从导入 Paddle Fluid API 和辅佐模块开端。

  本教程中咱们供给了VGG和ResNet两个模型的装备。

  VGG

  首要介绍VGG模型结构,因为CIFAR10图片巨细和数量比较ImageNet数据小许多,因而这儿的模型针对CIFAR10数据做了必定的适配。卷积部分引进了BN和Dropout操作。 VGG中心模块的输入是数据层,vgg_bn_drop 界说了16层VGG结构,每层卷积后边引进BN层和Dropout层,具体的界说如下:

  首要界说了一组卷积网络,即conv_block。卷积核巨细为3x3,池化窗口巨细为2x2,窗口滑动巨细为2,groups决议每组VGG模块是几回接连的卷积操作,dropouts指定Dropout操作的概率。所运用的img_conv_group是在paddle.fluit.net中预界说的模块,由若干组 Conv->BN->ReLu->Dropout 和 一组 Pooling 组成。

  五组卷积操作,即 5个conv_block。 榜首、二组选用两次接连的卷积操作。第三、四、五组选用三次接连的卷积操作。每组终究一个卷积后边Dropout概率为0,即不运用Dropout操作。

  终究接两层512维的全衔接。

  在这儿,VGG网络首要提取高层特征,随后在全衔接层中将其映射到和类别维度巨细共同的向量上,终究通过Softmax办法核算图片划为每个类其他概率。

  ResNet

  ResNet模型的第1、3、4步和VGG模型相同,这儿不再介绍。首要介绍第2步即CIFAR10数据集上ResNet中心模块。

  先介绍resnet_cifar10中的一些根本函数,再介绍网络衔接进程。

  • conv_bn_layer : 带BN的卷积层。

  • shortcut : 残差模块的"直连"途径,"直连"实践分两种方式:残差模块输入和输出特征通道数不等时,选用1x1卷积的升维操作;残差模块输入和输出通道持平时,选用直连操作。

  • basicblock : 一个根底残差模块,即图9左面所示,由两组3x3卷积组成的途径和一条"直连"途径组成。

  • layer_warp : 一组残差模块,由若干个残差模块堆积而成。每组中榜首个残差模块滑动窗口巨细与其他能够不同,以用来削减特征图在笔直和水平方向的巨细。

resnet_cifar10 的衔接结构首要有以下几个进程。

  底层输入衔接一层 conv_bn_layer,即带BN的卷积层。

  然后衔接3组残差模块即下面装备3组 layer_warp ,每组选用图 10 左面残差模块组成。

  终究对网络做均值池化并回来该层。

  留意:除榜首层卷积层和终究一层全衔接层之外,要求三组 layer_warp 总的含参层数能够被6整除,即 resnet_cifar10 的 depth 要满意

  Infererence装备

  网络输入界说为 data_layer (数据层),在图画分类中即为图画像素信息。CIFRAR10是RGB 3通道32x32巨细的五颜六色图,因而输入数据巨细为3072(3x32x32)。

  Train 装备

  然后咱们需求设置练习程序 train_network。它首要从推理程序中进行猜测。 在练习期间,它将从猜测中核算 avg_cost。 在有监督练习中需求输入图画对应的类别信息,相同通过fluid.layers.data来界说。练习中选用多类穿插熵作为丢失函数,并作为网络的输出,猜测阶段界说网络的输出为分类器得到的概率信息。

  留意: 练习程序应该回来一个数组,榜首个回来参数有必要是 avg_cost。练习器运用它来核算梯度。

  Optimizer 装备

  鄙人面的 Adam optimizer,learning_rate 是学习率,与网络的练习收敛速度有联系。

  def optimizer_program():

  return fluid.optimizer.Adam(learning_rate=0.001)

  练习模型

  Data Feeders 装备

  cifar.train10() 每次发生一条样本,在完结shuffle和batch之后,作为练习的输入。

  Trainer 程序的完结

  咱们需求为练习进程拟定一个main_program, 相同的,还需求为测验程序装备一个test_program。界说练习的 place ,并运用从前界说的优化器。

  练习主循环以及进程输出

  在接下来的主练习循环中,咱们将通过输出来来调查练习进程,或进行测验等。

  练习

  通过trainer_loop函数练习, 这儿咱们只进行了2个Epoch, 一般咱们在实践运用上会履行上百个以上Epoch

  留意: CPU,每个 Epoch 将花费大约15~20分钟。这部分或许需求一段时间。请随意修正代码,在GPU上运转测验,以进步练习速度。

  train_loop()

  一轮练习log示例如下所示,通过1个pass, 练习集上均匀 Accuracy 为0.59 ,测验集上均匀 Accuracy 为0.6 。

图13是练习的分类错误率曲线图,运转到第200个pass后根本收敛,终究得到测验集上分类错误率为8.54%。

  图13. CIFAR10数据集上VGG模型的分类错误率

  运用模型

  能够运用练习好的模型对图片进行分类,下面程序展现了怎么加载现已练习好的网络和参数进行揣度。

  生成猜测输入数据

  dog.png 是一张小狗的图片. 咱们将它转化成 numpy 数组以满意feeder的格局.

  Inferencer 装备和猜测

  与练习进程相似,inferencer需求构建相应的进程。咱们从params_dirname 加载网络和通过练习的参数。 咱们能够简略地刺进前面界说的推理程序。 现在咱们预备做猜测。

  总结

  传统图画分类办法由多个阶段构成,结构较为杂乱,而端到端的CNN模型结构可一步到位,并且大幅度提升了分类准确率。本文咱们首要介绍VGG、GoogleNet、ResNet三个经典的模型;然后依据CIFAR10数据集,介绍怎么运用PaddlePaddle装备和练习CNN模型,尤其是VGG和ResNet模型;终究介绍怎么运用PaddlePaddle的API接口对图片进行猜测和特征提取。关于其他数据集比方ImageNet,装备和练习流程是相同的,请参照Github https://github.com/PaddlePaddle/models/blob/develop/PaddleCV/image_classification/README_cn.md。

  参考文献

  [1] G.E. Hinton, N. Srivastava, A. Krizhevsky, I. Sutskever, and R.R. Salakhutdinov. Improving neural networks by preventing co-adaptation of feature detectors. arXiv preprint arXiv:1207.0580, 2012.

  [2] K. Chatfield, K. Simonyan, A. Vedaldi, A. Zisserman. Return of the Devil in the Details: Delving Deep into Convolutional Nets. BMVC, 2014。

  [3] K. He, X. Zhang, S. Ren, J. Sun. Deep Residual Learning for Image Recognition. CVPR 2016.

  [4] He, K., Zhang, X., Ren, S., and Sun, J. Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification. ArXiv e-prints, February 2015.

  [5] http://deeplearning.net/tutorial/lenet.html

  [6] https://www.cs.toronto.edu/~kriz/cifar.html

  [7] http://cs231n.github.io/classification/


上一篇:Python后端架构演进
下一篇:依据PaddlePaddle的词向量实战 | 深度学习根底使命教程系列

PythonTab微信大众号:

Python技能交流合作群 ( 请勿加多个群 ):

群1: 87464755

群2: 333646237

群3: 318130924

群4: 385100854