原文链接:https://hackernoon.com/supervised-deep-learning-in-image-classification-for-noobs-part-1-9f831b6d430d
【AI100 导读】在本系列中,你将会学习如何利用深度学习解决那些比较简单的问题。在解决问题的过程中,你不仅会学到深度学习中的某一种类型,也可以在 Keras 和 Tensorflow 这两种著名的深度学习程序库中编写代码。本文为本系列的第一部分,主要内容是谈论 basics 和 gotchas 中的深度学习。
深度学习的势头已经持续一段时间了,最近人们已经将深度学习运用到了各种不同的领域中。
在本系列中,你将会学习如何利用深度学习解决那些比较简单的问题,即在图像中检测一个单独的物体(如猫或狗等)。在解决问题的过程中,你不仅会学到深度学习中的某一种类型,也可以在 Keras 和 Tensorflow 这两种著名的深度学习程序库中编写代码。在此,我不打算谈论深度学习背后的数学知识。本系列总共由两部分组成:第一部分谈论 basics 和 gotchas 中的深度学习;第二部分我们将看看如何在 Keras 中创建自己的模型。
那么什么是深度学习?为什么称作深度?系统是否真的在学习?
先讲一段小历史。深度学习其实是神经网络比较酷的另一种叫法,而神经网络自上世纪60年代起便已出现。如果你不了解什么是神经网络,无需为其所困,稍后我会在本文中做出解释。
大约在2006年,一位非常出色的名叫 Geoffrey Hinton 的家伙和其他人一起发表了一篇论文。在这篇论文中,他们运用了神经网络中的某一类型,十分有意思。2012年,Hinton 的两个学生赢得一场比赛(即 ILSVRC,Large Scale Visual Recognition Challenge——大规模的视觉识别挑战),而且比赛成绩是第二名的两倍好。这向全世界表明了,Hinton 的工作成果可以解决非常有趣的问题。
我们正在努力解决图像分类的难题。在分类的过程中,我们试图获取图像并尽力了解图像内容的含义。当前范围将解决方案限制到了仅对含一种类型的物体图像进行处理,图像将是猫或狗。为了简单起见,我们目前不会对狗坐在车里的图像进行分类。
在神经网络中,存在n个神经元,这些神经元以线性的方式彼此互连。输入的图像将会从输入端开始传输,而后经由网络进行分类,最后将分好的类输出。网络训练其实就是将大量类型不一的图像作为输入,使其输出时在归好类的情况下分别贴上不同的标签。
卷积神经网络横截面的基本图像
神经网络如同简单的数学公式,如下所示:
x * w = y
假设 x 是你的输入图像,y 是神经网络分类后的输出。x 是常数,因为只有一组固定的图像;而神经网络的目的是为了得到某种输出结果。因此,我们只能改变 w,在此我们将 w 称为单神经元层的权重。训练过程包括两部分:正向传递和反向传播。在正向传递中,我们将图像作为输入(x)提供给网络,然后网络生成一些 y’ 输出类。y’ 与 y 的接近程度就是网络的误差。在反向传播中,网络试图通过调整权重 w 来减少误差,大量 lingo 会调用 w 作为其超参数、内核或是过滤器。神经网络的问题在于,某一层的所有数据会毫无保留的传递到下一层,而且所有层都是这样的情况。为解决这个问题,我们将用到卷积神经网络。那什么是卷积?请看下面的介绍。
神经网络是完全连接的,这意味着一个神经元层能将整个数据集传递到下一层,下一层将处理全部的数据……这适用于简单的图像,如 8x8 或 36x36 的图像,但实际图像通常有 1024x768 那么大,这时计算量将非常巨大。图像在本质上是静止的,这意味着图像某一部分的数值统计与任何其它部分都相同。因此在某一个区域中学习到的特征可以在另一个区域中进行类似的模型匹配。
在一个大图像中,我们只截取其中的一小部分,并使其通过大图像的所有点。当通过任意一点时,我们都可以将其看做是一个独立的小区间。你可以这样去想象,对于下一层神经元而言,一大盒的数据变成了现在变成了一小盒。这有助于加快计算速度但同时又不会损失数据的精度。通过大图像的每个小区间都会转化成小的过滤器,随后会在反向传播数据的基础上得以配置(我们稍后会介绍)。
接下来是池化。池化只是图像的下采样,再次帮助处理器更快地处理东西。当下我们可以运用的池化技术有很多。其中一个就是最大池,我们通常会取其中一部分特征的最大像素值,而后求出池化的算数平均数、众数和中位数。请注意,此处我们要计算得出的,并不是最大像素,而是算数平均数、众数和中位数。池化使得网络在形状、大小和尺寸上不发生改变。通常来说,最大池是最重要的。
最大池化的一个简单示例,其中我们在每个彩色正方形中取最大像素值。
单个神经元表现为线性分类器,神经元有能够在输入数据的某些连续部分开启或关闭的性能,我们把这一属性称为激活。激活函数在本质上是数学函数,其行为表现与阀门非常类似。我们假设当压力足够大时阀门便会打开,就如同压力锅的作用原理一样。让激活函数变为真值的数据,会将神经元标记为激活状态。基于神经网络中的所有被激活的神经元,我们对一个图像进行分类。目前我们有很多可用的激活函数,但 ReLu 是其中最为有名的。至于为什么会选择 ReLu,在此不做赘述,不过我会很快写另外一篇谈论不同激活函数的文章。
反向传播是我们能尝试将误差降低的过程。这里所说的误差指的是 y 与 y’ 之间的差。这会帮助 w 适应那些我们所提供给网络的数据集。我们会利用渐变下降过程执行反向传播,努力将 y 与 y’ 之间的误差值缩小到零。
上面提到的文献对于 CNNs(卷积神经网络)的应用来说已经足够了。当你在实施阶段遇到困难时,可以阅读更多与该特定主题有关的信息。
本文作者 Debarko De 是一名计算机科学工程师,目前在 Practo 工作。在这之前曾在 Facebook 上班,先后从事平台游戏和手机游戏的工作。
微信:Major-2016
网友评论