XiaotingCheng 2018-11-28
点击上方关注,All in AI中国
在过去的几年里,计算机视觉领域取得了巨大的进步。卷积神经网络极大地提高了图像识别模型的准确性,在现实世界中有很多应用。在本文中,我将介绍它们的工作原理,一些实际的应用程序,以及如何使用Python和Keras编写一个应用程序。
对于我们大多数人来说,视觉为我们日常生活的一部分。我们用眼睛来寻找通往我们周围世界的"路"。我们用它们来交流和理解。我可能不需要告诉你视力是非常重要的,这因为这是毋庸置疑的。
但是如果我让你解释一下视觉是如何起作用的呢?我们如何理解我们的眼睛在试图向我们解释什么?大脑就像一台超级复杂的计算机,经过了数百万年的自然发展,我们已经非常擅长识别各种模式和对象。
许多技术都是基于自然机制的。以相机为例。快门控制光线的数量,类似于我们的瞳孔。相机和眼睛中的镜头对图像进行聚焦并反转图像。摄像机和眼睛都有一些方法来感知光线并将其转换为可以理解的信号。
但显然,我们并不只是用胳膊和腿移动相机。我们目前拥有的相机显然无法完全理解他们正在拍摄的照片。对于相机和计算机来说,图片只是数组中的一堆数字。
来自MNIST数据集的数字8表示为一个数组
那么我们怎么能创建一个程序来告诉我们狗是狗还是猫是猫?这是我们试图用计算机视觉解决的问题。
神经网络如何工作
人工神经网络(ANN)是松散地基于人类大脑的程序。神经网络由许多连接的神经元组成。其中一些神经网络可以拥有数百万个节点和数十亿个连接!
神经元基本上是一个接收输入并返回输出的函数。
人工神经元模仿生物神经元
神经元本身不能做什么。但是当你将大量神经元连接在一起时,乐趣就开始了。神经网络的不同层/结构让你可以做很多很酷的事情。
你可以得到这样的东西!
每个神经元通常与某种重量相关。基本上,当一个连接比另一个连接更重要时。假设我们有一个网络,想要告诉你图片是否是热狗。然后,我们希望包含热狗特征的神经元比普通狗的特征更重要。
通过对数据集的训练来学习神经网络的权重。它将运行多次,通过反向传播相对于损失函数来改变其权重。神经网络基本上通过测试数据,进行预测,然后看看它是多么错误。然后它取得这个分数,使自己稍微更准确。通过这个过程,神经网络可以学习提高其预测的准确性。
我不会在本文中介绍反向传播损失函数,但是有很多这样的优秀资源可以涵盖这些主题!(https://medium.com/datathings/neural-networks-and-backpropagation-explained-in-a-simple-way-f540a3611f5e)
卷积神经网络(CNN)是一种特殊类型的神经网络。它们在应用于图像数据集时表现非常好。
卷积神经网络
卷积神经网络图
正如我之前提到的,图片被计算机视为数组中的一堆数字。CNN的不同层将函数应用于这些数组中,以从图像中提取各种特征并降低图像的复杂性。
让我们来看看在探测器上训练CNN所涉及的一些步骤。
首先,我们用随机权重初始化CNN。这基本上意味着网络完全是在进行预测。一旦做出预测,它将检查使用损失函数的错误程度,然后更新其权重以便下次做出更好的预测。
CNN包含称为卷积层和池化层的层。你可以尽情的想象在卷积层中它们是如何发生的。
假装你有一张照片和一个放大镜。将放大镜放在图片的左上角,然后查找特定的特征。记下它是否存在。通过缓慢移动图像重复此过程。
可视化卷积层中的特征提取
卷积层创建了一系列的特征映射。
对于用于描述动物或面部等不同图像的CNN。第一个卷积层寻找的特征可以是对象的不同边缘。这就像制作图片中不同边缘的列表一样。然后将该列表传递给另一个卷积层,它执行类似的操作,只是它在图像中寻找更大的形状。可能是动物的腿或脸上的眼睛。最终,这些特征由完全连接的层接收,该层对图像进行分类。
池层也与卷积层一起使用。这需要另一个放大镜,但它不寻找特性。相反,它需要一个区域中的最大值来降低图像的复杂性。
这很有用,因为大多数图像都很大。它们具有大量的像素,这使得处理器难以处理它们。池化让我们可以减少图像的大小,同时仍然保留大部分重要信息。池化也用于防止过度拟合,防止模型在识别我们训练的数据方面变得过于擅长,而不能很好的用于我们所给出的示例中。
线性数据集上过度拟合的示例
正如你在图片中看到的,该图中的数据可以用线性线表示。蓝色的模型显然会"击中"所有数据点,但如果我们试图让它预测其他东西,那么它将无法实现。就我们的CNN而言,这可能意味着它对我们训练过的图像会非常准确,但却无法对其他图片给出正确的预测。
最后,我们将CNN的结构扁平化为一个超长特征。我们基本上只是将所有数据放在一起,这样我们就可以将它传递给完全连接的层来进行预测。
为什么神经网更好?
假装我们没有使用神经网络。我们如何处理这个问题?假设我们正在尝试编写一个识别猫的程序。我们可以尝试通过寻找某些形状来代表猫。
猫形状来自计算机视觉专家李飞飞的TED演讲
看起来很简单吧?但等一下。并非所有的猫都像这样。我们需要添加更多形状。
来自计算机视觉专家李飞飞的TED演讲的更多猫形状
到目前为止,应该很清楚的是,只告诉计算机寻找某些形状是行不通的。猫有各种形状和大小。这假设我们只是在寻找猫。如果我们想要一个可以对各种图片进行分类的程序怎么办?
这就是为什么使用神经网络要好得多。你可以让计算机设置自己的规则。通过使用高度先进的算法,神经网络可以对高精度对图像进行分类。有些模型已经在这项任务中击败了人类!
我们应用计算机视觉的一些非常酷的方法
随着算法变得更有效,硬件变得更强大,我们可以用更接近科幻领域的神经网络来完成任务。但这并不意味着我们现在没有用这项技术做很多很酷的事情!
零售
你可能在新闻中听说过它。Amazon Go,电子商务巨头的无收银杂货店。你走进来,拿起一些东西,然后走出去。系统会自动向你收取所需的费用。覆盖天花板的相机可以记录你拾取的物品。虽然系统不完美,而且容易遭到入店行窃。看看这个想法在未来几年如何发展将会非常有趣。
自动驾驶汽车
在我看来,自动驾驶汽车是目前正在开展的一些最酷的事情。 Waymo原本是谷歌的自动驾驶汽车项目,优步和特斯拉是目前正在开发一些可以自动驾驶汽车的公司。
Waymo的自动驾驶汽车车队已经覆盖了超过1000万英里的道路!平均每年行驶约12,000英里。总共来说,这是超过800年的驾驶经验!
Waymo的自动驾驶汽车之一
医疗保健
在医疗保健领域,CNN被用于识别许多不同类型的疾病。通过对癌症或其他医疗条件的某些数据集进行训练,神经网络可以确定高准确率的问题是否有问题!通过神经网络提取功能并在数据中查找模式,它可以利用图片中的信息,这是我们从未想过的!
用Keras创建卷积神经网络
现在我们了解了CNN应该如何运作的一些直觉。我们可以使用用Python编写的高级API,Keras创建一个。Keras将帮助我们编写易于理解和超级可读的代码。
你可以首先在命令界面中安装Anaconda并运行conda install keras。然后你可以使用Jupyter笔记本开始用Python编程。如果你想在云中运行所有内容,也可以使用Google的Colaboratory。(https://colab.research.google.com/drive/1oSE2zRroFcjZkBrrWv-p0tnWR7_yOYrH)
我们将使用属于Keras库的MNIST数据集。它包含60,000个训练示例和10,000个手写数字测试示例。让我们开始吧!
MNIST数据集中的前几个训练示例
首先,我们想要从Keras库导入我们需要的所有东西。这包括Sequential模型,这意味着我们可以通过添加图层来轻松构建模型。接下来我们将导入Conv2D(Convolution2D),MaxPooling2D,Flatten和Dense图层。前3个是不言自明的,致密层帮助我们构建完全连接的层。
我们需要Keras Utils来帮助我们对数据进行编码,以确保它与我们的其他模型兼容。最后,我们将导入将用于训练模型的MNIST数据集。
导入数据集后,我们需要将其分解为训练数据和测试数据。训练数据是我们要教给神经网络的东西。我们将使用测试数据来衡量准确度。我们将重新调整数据以匹配TensorFlow后端所需的格式。接下来,我们将对数据进行标准化,以使值的范围保持在0到1左右,并对MNIST标签进行分类编码。
现在我们可以开始构建我们的模型。我们首先创建一个顺序模型,它是一个线性的图层堆栈。正如你在下面的代码中看到的,这使我们可以非常轻松地向模型添加更多图层。
在我们完成模型构建之后,我们将编译它。该模型使用Adam优化器,它是一种用于调整权重的梯度下降算法。我们的模型使用的损失函数是分类交叉熵,它告诉我们的模型我们离结果有多远。 metrics参数用于定义如何评估性能。它类似于损失函数,但在实际训练过程中不会使用。
我们将在训练集上拟合或训练我们的模型。批量大小决定了每次迭代时我们将考虑的图像数量。时期数决定了模型迭代整个集合的次数。在一定数量的迭代之后,该模型将基本上停止改进。验证数据确定模型在每个时期之后如何评估其损失。
最后,我们将打印出我们模型的准确程度。最终结果应介于98%和99%之间。
你可以在我的GitHub上找到完整的代码(https://github.com/uyxela/mnist-keras),也可以在Google Colaboratory上运行。
关键要点