查看原文
其他

教你用Keras做图像识别!只会图像检测并不强力

2017-06-24 雷锋网字幕组 AI研习社

AI 研习社按:今天为大家带来硅谷深度学习网红 Siraj 的一则教学视频:如何从零开始构建一个图像分类器来对猫和狗进行分类。(内心OS:终于要开始图像部分了!)具体视频内容如下,Github 链接详见文末“阅读原文”。

https://v.qq.com/txp/iframe/player.html?vid=u0513e93upd&width=500&height=375&auto=0
为了照顾没有 WiFi 的小伙伴,我们特别提供了以下根据视频内容整理的文字版(hin 贴心有木有!):


  图像分类发展历史


在80年代和90年代初出现了一些不同的尝试,都用了类似的方法——根据图片的构成特征来给每张图片手动编码进行分类,但变量实在太多了——世界上没有相同的两片叶子。所以结果往往错的很离谱,因此图像分类被视为只有人类才能胜任的工作。


但1998年,一个叫Yann Lecun的研究者介绍了一个称为卷积神经网络(CNN)的模型,字符分类的正确率达到了99% ,打破了各项纪录。


2012年,一个叫Alex Krizhevsky的研究,用CNN参加了一年一度的ImageNet竞赛——这是计算机视觉领域的年度奥运——它对几千张图片的分类正确率达到了85%,创造了新记录。此后谷歌把CNN用于搜索中的图片识别,Facebook则把它用于自动标注,这些功能现在都很火。


  构建图像分类器


Step 1:收集数据

首先要从kaggle下载一个图像数据集,包括猫狗在内的1024张图片,每张都在自己的文件夹里,然后用Keras深度学习库进行演示——Keras是在TensorFlow之上的高级包装类,因为可以给每个层定义一个自己的代码行,使模型构建变得更加直观。


Step 2:建立模型

首先,要初始化训练数据和验证数据的变量,然后就可以构建模型了。要利用时序函数初始化这类模型,这个模型可以构造一个线性堆叠层,所以将每个层视为将数据馈送到下一个层的对象。另一类是图模型,它允许多个独立的输入和输出。



接下来添加第一层——卷积层。CNN的第一层总是卷积层,输入值是32×32×3像素数组。3指的是RGB值。该数组中的数值都为0到255,描述的是像素强度(灰度值),它是给出像素数组作为输入CNN就能给出它是某一类别的概率。可以把卷积层想象成一个手电筒,照在图像的左上方。手电筒滑过输入图像的所有区域。手电筒是我们的过滤器,其照射的区域是感受野(Receptive field)



过滤器也是数组。这些数字是某一特定层的权值。可以把过滤器当作一个特征识别器。当过滤器滑动或对输入进行卷积时,它的值与图像中的像素值相乘,这些被称为元素乘法。然后对每个区域的乘积求和。在覆盖图像的所有部分之后得到特征映射。



由于权值是随机初始化的,过滤器不能一开始就检测到具体特征,但在训练期间 CNN能让过滤器学习一些值。所以第一个过滤器会学习检测一些低级的特征,如曲线。因此,如果将过滤器放置在含有曲线的图像的一部分上,乘积和求和的结果值会相当大;但如果我们将其放在图像中没有曲线的部分,结果值则为零。这就是过滤器检测特征的方法。


接下来我们将通过ReLU(修正线性单元)激活层来传递此特征映射。ReLu也是一个非线性的操作,可以将特征映射中的所有负像素值用零代替。也可以用其他函数,但大多数情况下ReLu往往表现更好。



激活层增加了模型的非线性特征,这意味着神经网络能够学习比线性回归更复杂的函数。之后我们将初始化最大池化层。池化降低了每个特征映射的维数,但保留最重要的信息,这就降低了网络计算的复杂程度。


池化也有不同的方式,在这个例子中我们用的是最大值(Max)的方式。在我们画圈的窗口内,从修正的特征映射中挑出最大元素值,并且在该特征映射的每个区域上滑动此窗口挑出最大值。



所以一个经典的CNN架构看起来就像这样:三个卷积块后面跟着一个全连接层。已经初始化了前三层,这个过程基本上只能再重复两次。输出的特征映射就被馈送到下一个卷积层,而这一层的过滤器将会学习检测更多的抽象特征,如爪子和脚印。


我们将使用Dropout来防止过拟合。当训练过拟合时模型便无法预测新数据的标签,Dropout层可以drop out一组随机的激活函数,当数据传递至激活函数时将其置零。


为了准备数据的dropout,我们先将特征映射降成为一维,然后用密度函数初始化全连接层,并对该层应用修正线性单元(ReLu)。Dropout后再初始化一个全连接层,然后它会输出一个n维向量,n指的是类的数量,所以n是2,并且把n维向量用sigmoid函数变换一下,它就把数据变成了每个类的概率。



那么网络是怎么学习的呢?损失函数衡量的是目标输出与期望输出的差异。想要最小化损失函数,,要算出损失函数关于每一层权值的导数,计算出我们想要的网络更新的方向,将反向一层一层地传播损失,然后更新每个过滤器的权值,这样它们就能按照最小化损失函数的梯度方向进行修改。

使用编译方法来计算学习过程。这里把损失函数定义为二进制交叉熵,通常都用它定义二进制分类问题的损失函数,优化器是rmsprop——它是做梯度下降,因为这是一个分类问题,度量指标设置为accuracy。


Step 3:训练模型

最后写出拟合函数来训练模型,给出训练参数和验证数据以及每个样本的运行次数,然后保存权值,就可以在后面用我们训练过的模型了。


总体的准确率约为70%,和人的注意力差不多。如果给模型一张新的狗或猫的图片,它就差不多能正确预测。


预测改进的两个方法:

  • 可以用更多的图片

  • 用自己的网络来扩充现有的预训练网络,即迁移学习(transfer learning)。


总结本节课重点如下:

  • 卷积神经网络受到人类视觉皮层的启发,并且能实现最先进的图像分类;

  • CNN在每个卷积层上通过学习得到的过滤器,可以检测到越来越抽象的特征;

  • 可以用Keras和TensorFlow轻而易举地建造模型。

  雷锋字幕组志愿者

下列同学参与了本文 / 视频的译制工作!

如果您对我们的工作内容感兴趣,欢迎添加组长微信 “iIoveus2014” 加入字幕组~



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存