侬会垃圾分类了伐?

640?wx_fmt=gif

当北京的同学还在嘲笑魔都同学需要垃圾分类的梗的时候,万万没想到,全国其他49个省市都将会进行垃圾分类的规定。北京的小朋友们,颤抖吧。

01

请问瓜子皮是干垃圾还是湿垃圾?

点击空白处查看答案

不论干的还是湿的,都是湿垃圾

02

请问蟑螂捕捉小屋是干垃圾还是湿垃圾?

点击空白处查看答案

蟑螂屋用完,纸盒是可回收,蟑螂是湿垃圾

03

请问我的毕业论文该扔到哪个垃圾里?

点击空白处查看答案

我的是学术垃圾,不知道你的呢?

这么多要分类的垃圾,断水流大师兄都要崩溃了。

640?wx_fmt=png

还好现在推出了垃圾分类的应用,只要拍一拍,就知道啦。

但是问题来了,到底程序是怎么知道我拍的照片是什么东西啊?这个就牵扯到一个重要的人工智能领域:CV计算机视觉。

让软件认识图片里的内容,包括人像识别,体态识别,表情识别,数字识别等,都是通过图像分类来做的。

今天就跟着我们一起来看其中的一个实验,基于百度深度学习框架“飞桨”的经典数字识别。

背景介绍

当我们学习编程的时候,编写的第一个程序一般是实现打印"Hello World"。而机器学习(或深度学习)的入门教程,一般都是 MNIST 数据库上的手写识别问题。原因是手写识别属于典型的图像分类问题,比较简单,同时MNIST数据集也很完备。MNIST数据集作为一个简单的计算机视觉数据集,包含一系列如图1所示的手写数字图片和对应的标签。图片是28x28的像素矩阵,标签则对应着0~9的10个数字。每张图片都经过了大小归一化和居中处理。

640?wx_fmt=png

MNIST数据集是从 NIST 的Special Database 3(SD­3)和Special Database 1(SD­1)构建而来。由于SD­3是由美国人口调查局的员工进行标注,SD­1是由美国高中生进行标注,因此SD­3比SD­1更干净也更容易识别。Yann LeCun等人从SD­1和SD­3中各取一半作为MNIST的训练集(60000条数据)和测试集(10000条数据),其中训练集来自250位不同的标注员,此外还保证了训练集和测试集的标注员是不完全相同的。

Yann LeCun早先在手写字符识别上做了很多研究,并在研究过程中提出了卷积神经网络(Convolutional Neural Network),大幅度地提高了手写字符的识别能力,也因此成为了深度学习领域的奠基人之一。如今的深度学习领域,卷积神经网络占据了至关重要的地位,从最早Yann LeCun提出的简单LeNet,到如今ImageNet大赛上的优胜模型VGGNet、GoogLeNet、ResNet等(请参见图像分类 教程),人们在图像分类领域,利用卷积神经网络得到了一系列惊人的结果。

有很多算法在MNIST上进行实验。1998年,LeCun分别用单层线性分类器、多层感知器(Multilayer Perceptron, MLP)和多层卷积神经网络LeNet进行实验,使得测试集上的误差不断下降(从12%下降到0.7%)[1]。此后,科学家们又基于K近邻(K­Nearest Neighbors)算法[2]、支持向量机(SVM)[3]、神经网络[4­7]和Boosting方法[8]等做了大量实验,并采用多种预处理方法(如去除歪曲、去噪、模糊等)来提高识别的准确率。

本教程中,我们从简单的模型Softmax回归开始,带大家入门手写字符识别,并逐步进行模型优化。

模型概览

基于MNIST数据训练一个分类器,在介绍本教程使用的三个基本图像分类网络前,我们先给出一些定义:

X是输入:MNIST图片是28*28的二维图像,为了进行计算,我们将其转化为784维向量,即

640?wx_fmt=png

Y是输出:分类器的输出是10类数字(0-­9),即

640?wx_fmt=png

每一维Yi代表图片分类为第i类数字的概率。

L是图片的真实标签:

640?wx_fmt=png

也是10维,但只有一维为1,其他都为0。

Softmax回归(Softmax Regression)

最简单的Softmax回归模型是先将输入层经过一个全连接层得到的特征,然后直接通过softmax 函数进行多分类[9]。

输入层的数据X传到输出层,在激活操作之前,会乘以相应的权重W,并加上偏置b变量 ,具体如下:

640?wx_fmt=png

其中

640?wx_fmt=png

对于有N个类别的多分类问题,指定N个输出节点,N维结果向量经过softmax将归一化为N个[0,1]范围内的实数值,分别表示该样本属于这 个类别的概率。此处的Yi即对应该图片为数字i的预测概率。

在分类问题中,我们一般采用交叉熵代价损失函数(cross entropy loss),公式如下:

640?wx_fmt=png

图2为softmax回归的网络图,图中权重用蓝线表示、偏置用红线表示、+1代表偏置参数的系数为1。

640?wx_fmt=png

图2. softmax回归网络结构图

多层感知器(Multilayer Perceptron, MLP)

Softmax回归模型采用了最简单的两层神经网络,即只有输入层和输出层,因此其拟合能力有限。为了达到更好的识别效果,我们考虑在输入层和输出层中间加上若干个隐藏层[10]。

640?wx_fmt=png

图3为多层感知器的网络结构图,图中权重用蓝线表示、偏置用红线表示、+1代表偏置参数的系数为1。

640?wx_fmt=png

卷积神经网络(Convolutional Neural Network, CNN)

在多层感知器模型中,将图像展开成一维向量输入到网络中,忽略了图像的位置和结构信息,而卷积神经网络能够更好的利用图像的结构信息。LeNet­5是一个较简单的卷积神经网络。图4显示了其结构:输入的二维图像,先经过两次卷积层到池化层,再经过全连接层,最后使用softmax分类作为输出层。下面我们主要介绍卷积层和池化层。

640?wx_fmt=png

卷积层

卷积层是卷积神经网络的核心基石。在图像识别里我们提到的卷积是二维卷积,即离散二维滤波器(也称作卷积核)与二维图像做卷积操作,简单的讲是二维滤波器滑动到二维图像上所有位置,并在每个位置上与该像素点及其领域像素点做内积。卷积操作被广泛应用与图像处理领域,不同卷积核可以提取不同的特征,例如边沿、线性、角等特征。在深层卷积神经网络中,通过卷积操作可以提取出图像低级到复杂的特征。

640?wx_fmt=png

图5给出一个卷积计算过程的示例图,输入图像大小为 ,即大小的3通道(RGB,也称作深度)彩色图像。这个示例图中包含两(用K表示)组卷积核,即图中滤波器W0和W1 。在卷积计算中,通常对不同的输入通道采用不同的卷积核,如图示例中每组卷积核包含(D=3)个3*3 (用F*F表示)大小的卷积核。另外,这个示例中卷积核在图像的水平方向(W方向)和垂直方向(H方向)的滑动步长为2(用S表示);对输入图像周围各填充1(用P表示)个0,即图中输入层原始数据为蓝色部分,灰色部分是进行了大小为1的扩展,用0来进行扩展。经过卷积操作得到输出为 3*3*2(用H0*W0*K表示)大小的特征图,即3*3大小的2通道特征图,其中H0计算公式为:

640?wx_fmt=png

W0,同理。而输出特征图中的每个像素,是每组滤波器与输入图像每个特征图的内积再求和,再加上偏置B0 ,偏置通常对于每个输出特征图是共享的。输出特征图

640?wx_fmt=png

中的最后一个-2计算如图5右下角公式所示。

在卷积操作中卷积核是可学习的参数,经过上面示例介绍,每层卷积的参数大小为D*F*F*K在多层感知器模型中,神经元通常是全部连接,参数较多。而卷积层的参数较少,这也是由卷积层的主要特性即局部连接和共享权重所决定。

局部连接:每个神经元仅与输入神经元的一块区域连接,这块局部区域称作感受野(receptive field)。在图像卷积操作中,即神经元在空间维度(spatialdimension,即上图示例H和W所在的平面)是局部连接,但在深度上是全部连接。对于二维图像本身而言,也是局部像素关联较强。这种局部连接保证了学习后的过滤器能够对于局部的输入特征有最强的响应。局部连接的思想,也是受启发于生物学里面的视觉系统结构,视觉皮层的神经元就是局部接受信息的。

权重共享:计算同一个深度切片的神经元时采用的滤波器是共享的。例如图4中计算

640?wx_fmt=png

的每个每个神经元的滤波器均相同,都为W0,这样可以很大程度上减少参数。共享权重在一定程度上讲是有意义的,例如图片的底层边缘特征与特征在图中的具体位置无关。但是在一些场景中是无意的,比如输入的图片是人脸,眼睛和头发位于不同的位置,希望在不同的位置学到不同的特征 (参考斯坦福大学公开课)。请注意权重只是对于同一深度切片的神经元是共享的,在卷积层,通常采用多组卷积核提取不同特征,即对应不同深度切片的特征,不同深度切片的神经元权重是不共享。另外,偏重对同一深度切片的所有神经元都是共享的。

通过介绍卷积计算过程及其特性,可以看出卷积是线性操作,并具有平移不变性(shift­invariant),平移不变性即在图像每个位置执行相同的操作。卷积层的局部连接和权重共享使得需要学习的参数大大减小,这样也有利于训练较大卷积神经网络。

池化层

640?wx_fmt=png

池化是非线性下采样的一种形式,主要作用是通过减少网络的参数来减小计算量,并且能够在一定程度上控制过拟合。通常在卷积层的后面会加上一个池化层。池化包括最大池化、平均池化等。其中最大池化是用不重叠的矩形框将输入层分成不同的区域,对于每个矩形框的数取最大值作为输出层,如图6所示。

更详细的关于卷积神经网络的具体知识可以参考斯坦福大学公开课和图像分类教程。

常见激活函数介绍

sigmoid激活函数:

640?wx_fmt=png

tanh激活函数:

640?wx_fmt=png

实际上,tanh函数只是规模变化的sigmoid函数,将sigmoid函数值放大2倍之后再向下平移1个单位:tanh(x) = 2sigmoid(2x)-1 。

ReLU激活函数:

640?wx_fmt=png

更详细的介绍请参考维基百科激活函数。

数据介绍

PaddlePaddle在API中提供了自动加载MNIST数据的模块 paddle.dataset.mnist 。加载后的数据位于

 /home/username/.cache/paddle/dataset/mnist 下:

640?wx_fmt=png

Fluid API 概述

演示将使用最新的 Fluid API 。Fluid API是最新的 PaddlePaddle API。它在不牺牲性能的情况下简化了模型配置。

下面是快速的 Fluid API 概述。

1、inference_program :指定如何从数据输入中获得预测的函数。这是指定网络流的地方。

2、train_program :指定如何从 inference_program 和 标签值 中获取loss 的函数。这是指定损失计算的地方。

3、optimizer_func : “指定优化器配置的函数。优化器负责减少损失并驱动培训。Paddle 支持多种不同的优化器。

4、Trainer :PaddlePaddle Trainer 管理由 train_program 和 optimizer 指定的训练过程。通过 event_handler 回调函数,用户可以监控培训的进展。

5、Inferencer :Fluid inferencer 加载 inference_program 和由 Trainer 训练的参数。然后,它可以推断数据和返回预测。

在这个演示中,我们将深入了解它们。

配置说明

Program Functions 配置

我们需要设置“推理程序”函数。我们想用这个程序来演示三个不同的分类器,每个分类器都定义为 Python 函数。

我们需要将图像数据馈送到分类器。Paddle 为读取数据提供了一个特殊的层layer.data 层。

让我们创建一个数据层来读取图像并将其连接到分类网络。

Softmax回归:只通过一层简单的以softmax为激活函数的全连接层,就可以得到分类的结果。

多层感知器:下面代码实现了一个含有两个隐藏层(即全连接层)的多层感知器。其中两个隐藏层的激活函数均采用ReLU,输出层的激活函数用Softmax。

卷积神经网络LeNet­5:输入的二维图像,首先经过两次卷积层到池化层,再经过全连接层,最后使用以softmax为激活函数的全连接层作为输出层。

Train Program 配置

然后我们需要设置训练程序 train_program 。它首先从分类器中进行预测。在训练期间,它将从预测中计算 avg_cost 。

注意: 训练程序应该返回一个数组,第一个返回参数必须是 avg_cost 。训练器使用它来计算梯度。

请随意修改代码,测试 Softmax 回归 softmax_regression , MLP 和 卷积神经网络 convolutional neural network 分类器之间的不同结果。

Optimizer Function 配置

在下面的 Adam optimizer , learning_rate 是训练的速度,与网络的训练收敛速度有关系。

数据集 Feeders 配置

下一步,我们开始训练过程。paddle.dataset.mnist.train() 和paddle.dataset.mnist.test() 分别做训练和测试数据集。这两个函数各自返回一个reader——PaddlePaddle中的reader是一个Python函数,每次调用的时候返回一个Python yield generator。

下面 shuffle 是一个reader decorator,它接受一个reader A,返回另一个readerB。reader B 每次读入 buffer_size 条训练数据到一个buffer里,然后随机打乱其顺序,并且逐条输出。

batch 是一个特殊的decorator,它的输入是一个reader,输出是一个batchedreader。在PaddlePaddle里,一个reader每次yield一条训练数据,而一个batchedreader每次yield一个minibatch。

Trainer 配置

现在,我们需要配置 Trainer 。Trainer 需要接受训练程序 train_program ,place 和优化器 optimizer 。

Event Handler 配置

Fluid API 在训练期间为回调函数提供了一个钩子。用户能够通过机制监控培训进度。我们将在这里演示两个 event_handler 程序。请随意修改 Jupyter 笔记本 ,看看有什么不同。

event_handler 用来在训练过程中输出训练结果

开始训练

既然我们设置了 event_handler 和 data reader ,我们就可以开始训练模型了。

feed_order 用于将数据目录映射到 train_program

训练过程是完全自动的,event_handler里打印的日志类似如下所示:

训练之后,检查模型的预测准确度。用 MNIST 训练的时候,一般 softmax回归模型的分类准确率为约为 92.34%,多层感知器为97.66%,卷积神经网络可以达到99.20%。

应用模型可以使用训练好的模型对手写体数字图片进行分类,下面程序展示了如何使用fluid.contrib.inferencer.Inferencer 接口进行推断。

Inference 配置

Inference 需要一个 infer_func 和 param_path 来设置网络和经过训练的参数。

生成预测输入数据

infer_3.png 是数字 3 的一个示例图像。把它变成一个 numpy 数组以匹配数据馈送格式。

预测

现在我们准备做预测。

总结

本教程的softmax回归、多层感知器和卷积神经网络是最基础的深度学习模型,后续章节中复杂的神经网络都是从它们衍生出来的,因此这几个模型对之后的学习大有裨益。同时,我们也观察到从最简单的softmax回归变换到稍复杂的卷积神经网络的时候,MNIST数据集上的识别准确率有了大幅度的提升,原因是卷积层具有局部连接和共享权重的特性。在之后学习新模型的时候,希望大家也要深入到新模型相比原模型带来效果提升的关键之处。此外,本教程还介绍了PaddlePaddle模型搭建的基本流程,从dataprovider的编写、网络层的构建,到最后的训练和预测。对这个流程熟悉以后,大家就可以用自己的数据,定义自己的网络模型,并完成自己的训练和预测任务了。

如果小伙伴们想要练习实验,可以使用电脑点击链接,进行实际操作。

http://abcxueyuan.cloud.baidu.com/newlab/#/home

阅读推荐

  运维实践

智能运维架构 | 架构集成 | 网络判障 | 监控数据采集 | 监控报警 | 网络异常 | 分布式监控系统 | 数据可视化 | 单机房故障自愈 | TSDB数据存储 | 异常检测 | 流量异常检测 | 复杂异常检测 | 报警风暴 | 实时计算 | 故障诊断 | 日志监控 | 网络监控可视化 | HBase实践 | 多维度数据 | 容量管理

  运维产品

百度云BCM | 企业级运维平台 | 基础设施管理引擎 | 运维知识库 | 通告平台 | 百度名字服务 | 业务部署 | 数据配送 | 集群控制系统 | 外网监控 | 内网监控 | 部署变更 | 配置管理 | 站点监控

  精品推荐

AIOps全解析 | AIOps中的四大金刚 | 智能运维 | AIOps时代 | 运维演进

640?wx_fmt=jpeg

640?wx_fmt=gif

↓↓ 点击"阅读原文" 【了解更多精彩内容】 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值