本文为 AI 研习社编译的技术博客,原标题 :
How To Teach A Computer To See With Convolutional Neural Networks
作者 | Alex Yu
翻译 | zackary、chesc
校对 | 酱番梨 整理 | 菠萝妹
原文链接:
https://towardsdatascience.com/how-to-teach-a-computer-to-see-with-convolutional-neural-networks-96c120827cd1
近年来,计算机视觉领域取得了很大的进展。卷积神经网络极大地提升了图像识别模型的精度,在生活中也有很多的应用。在这篇文章中,我将描述它的工作原理、一些实际应用,以及如何用Python和Keras是实现一个卷积神经网络。
图片来自Amanda Dalbjörn
对于大多数人来说,视觉是我们日常生活的一部分。我们使用双眼探索周围的世界。我们用双眼交流、理解。我无需告诉你视觉有多重要。视觉对我们来说如此关键,你甚至难以想象没有视觉时的情形。
但是,如果我让你解释你是如何“看见”的呢?我们是如何理解我们眼睛传来的信息的?首先,当你看着某样东西,然后......发生了什么?我们的大脑就像一台自然进化了数百万年的超级电脑。在识别不同的模式和物体上,我们已经变得十分在行。
许多技术都是基于自然机制的。用相机举个例子:快门控制光线的量,就像我们眼睛里的瞳孔,镜头和眼睛聚焦并翻转图像。相机和眼睛都通过一些方式感知光线并将它转化为可被理解的信号。
图片来自Alfonso Reyes
但是,很显然地,我们不是长出了腿和胳膊的行走相机。现有的相机并不能完全理解它们拍摄的图片。如果它们能做到的话那就有点吓人了。对于相机和计算机来说,一幅图片只是一串串数字组成的向量。
用矩阵表示的数字8,来自MNIST数据集
那么我们到底如何创建一个程序,来辨别一幅图片是狗还是猫呢?这正是我们试图用计算机视觉解决的问题。
也就是神经网络能够帮助我们解决的问题!
人工神经网络(Artificial Neural Networks)是一种基于人类大脑的程序。神经网络由许多个联结的神经元组成。有一些神经网络有数百万个节点(神经元)和数十亿个联结!
一个神经元可以看作是一个函数,它接受一个输入值,返回一个输出值。
人工神经元模仿生物学中的神经元
单个神经元本身不能做什么。但是当你把很多的神经元联结在一起的时候,事情就变得有趣多了。神经网络的不同结构能让你做许多很酷的事情。
你可以得到类似的网络
每个神经元都与自己的“权重”有联系。举个例子:我们有一个神经网络试图分辨一张图片是不是一个热狗。那么我们就会想要:在神经网络中,包含热狗的特征的神经元比包含普通狗的特征的神经元更重要。
神经网络的权重是通过在数据集上训练得到的。它会运行许多次,根据损失函数通过反向传播改变各个权重。可以说神经网络被输入测试数据,然后得到并分析结果,取得得分并使自己变得更加准确。通过这个过程,一个神经网络可以学习并提高预测的准确度。
我不会讲述反向传播过程和损失函数,但是有许多很棒的资源介绍了它们,例如这一篇。卷积神经网络(Convolutional Neural Networks)是神经网络的一种特别的类型。它们在图像数据集上表现的很好。
卷积神经网络图示
正如我之前提到的,计算机将图片看作矩阵中的一堆数字。CNN的不同层将函数应用于这些矩阵,以从图像中提取各种特征并降低图像的复杂度。
让我们一起看看训练一个用作热狗检测器的卷积神经网络所需的几个步骤吧。
首先,我们为卷积神经网络的权重赋予随机的初始值。这基本上意味着网络纯粹就是在猜测。一旦网络做出了它的预测,它将使用一个损失函数来评估自己的误差,并更新自己的权重以在下一次获得更好的结果。
卷积神经网络包含一些层:卷积层和池化层。你可以这样想象在卷积层里发生了什么:
想象你有一幅图片和一个放大镜。将你的放大镜放在图片左上角的正上方,你将寻找一个特别的特征并记下你有没有找到。慢慢地移动你的放大镜并重复这个操作。
可视化卷积层中的特征提取
卷积层创造了一系列的特征映射。
对于用来描述不同图片,比如动物或者面部,的卷积神经网络来说,卷积神经网络寻找的特征可以是目标的不同边缘。就像列出图片中各个边缘的列表,这个列表又被传入另一个相同功能的卷积层,只不过这一层寻找的是更大的特征,比如说动物的一条腿或者面部的一只眼睛。最终,所有的特征被传入一个全连接层,它会为图像分类。
池化层也与卷积层一起使用,它就像另一个放大镜,只不过它不寻找特征,而是取区域里的最大值以减少图像的复杂度。
卷积神经网络里的池化
这很实用,因为很多图片都很大,它们的像素数目太大,处理器计算起来很困难。池化使得我们能够减少图片的大小,同时还保留了大多数重要信息。池化也被用来防止过拟合。过拟合是指模型在训练数据上表现得很好,但是却不能在它从未见过的数据上获得好的结果。
在一个线性数据集上发生了过拟合
如你所见,图里的数据本可以用一条直线(黑色)表示。用蓝色表示的模型匹配了所有的数据点,但是如果我们想让这个模型预测一些点时,它却做不到。回到卷积神经网络,这意味着模型在它训练集上会十分准确,但是对于其他不在训练集里的图片,它却不能作出正确的判断。
最后,我们将卷积神经网络变成了一个很长的特征向量,我们基本上将数据放在一起,输入全连接层中以作出预测。
为什么神经网络更好?
假如我们没有使用神经网络,那么我们会如何处理这个问题?比方说,我们正在尝试编写一个识别猫的程序,我们可以尝试通过寻找某些形状来表示猫。
来自计算机视觉专家李飞飞的TED演讲的猫的形状
看起来很简单吧?但等一下。并非所有的猫都像这样。如果你有一只猫在伸懒腰怎么办?我们需要添加更多形状。
来自计算机视觉专家李飞飞的TED演讲的更多猫形状。
到目前为止,应该很清楚,直接告诉计算机寻找某些形状是行不通的。猫有各种形状和大小。并且这只是假设我们仅仅在寻找猫,如果我们想要一个可以对各种图片进行分类的程序怎么办?
这就是为什么使用神经网络要好得多的原因。您可以让计算机设置自己的规则。通过使用十分先进的算法,神经网络可以疯狂地高精度对图像进行分类。有些模型已经在这个任务中击败了人类!
我们应用计算机视觉的一些非常酷的方法
随着算法变得更有效,硬件变得更强大,我们可以用神经网络来完成很多任务,这几乎就像是科幻小说一样。但这并不意味着我们现在没有用这项技术做很多很酷的事情!
零售
你可能在新闻中听说过它,电子商务巨头的无人收款杂货店--Amazon Go。你走进来,拿起一些东西,然后走出去。系统会自动向您收取所需的费用。遍布天花板的相机可以跟踪您拾取的物品。然而系统不够完美,可能很容易发生入店行窃。看看这个想法在未来几年如何发展将会非常有趣。
自动驾驶汽车
在我看来,自动驾驶汽车是目前正在开展的一些最酷的事情。Waymo最初是Google的自动驾驶汽车项目,Uber和Tesla目前正在研发一些可以自动导航道路的车辆。
Waymo的自动驾驶汽车车队已经行驶了超过1000万英里的路程!平均每年行驶约12,000英里。总的来说,这是超过800年的驾驶!
Waymo的一辆自动驾驶汽车
医疗保健
在医疗保健领域,CNN被用于识别许多不同类型的疾病。通过对癌症或其他医疗条件的某些数据集进行训练,神经网络可以以高准确率确定其是否患病!通过神经网络提取特征并在数据中查找模式,它可以利用某些我们从未考虑过的图像信息!
现在我们进一步直观了解CNN应该怎么运作。我们可以在Python里使用Keras框架创建一个卷积神经网络,其中Keras是一个用Python编写的高级API。Keras可以帮助我们编写易于理解和可读性强的代码。
您可以首先安装Anaconda,再在命令界面中运行 conda install keras。然后你可以使用Jupyter Notebooks开始进行Python编程。如果您想在云中运行所有内容,也可以使用Google’s Colaboratory。
我们将在MNIST数据集上进行实验,这个数据集是Keras库的一部分。它包含60,000个手写数字的训练样本和10,000个测试样本。让我们开始吧!
MNIST数据集中的前几个训练样本
首先,我们想要从Keras库导入我们需要的所有包。这包括Sequential model,这意味着我们可以通过添加 layers 来轻松构建模型。接下来我们将导入Conv2D(Convolution2D),MaxPooling2D,Flatten和Dense 层。前3个是明显的,而Dense层会帮我们构建全连接层。
我们需要Keras Utils来帮助我们对数据进行编码,以确保它与我们模型的其他部分兼容。这使得我们不会把数字9看作比1更好 。最后,我们导入将用于训练模型的MNIST数据集。
导入数据集后,我们需要将其拆分为训练数据和测试数据。训练数据是我们要用神经网络进行学习的。测试数据是我们将用来衡量准确度的。我们将调整数据以匹配TensorFlow后端所需的格式。接下来,我们将对数据进行标准化,以使值的范围保持在0到1左右,并对MNIST标签进行分类编码。
非常棒!现在我们可以开始构建我们的模型。我们首先创建一个顺序模型,它是一个线性的layers堆栈。正如您在下面的代码中看到的,这使我们可以非常轻松地向模型添加更多层。
在我们完成模型构建之后,我们将编辑它。该模型使用Adam优化器,它是一种用于调整权重的梯度下降算法。我们的模型使用的损失函数是分类交叉熵,它告诉我们这个模型离结果有多远。metrics参数用于定义如何评估性能。它类似于损失函数,但在实际训练过程中不会使用。
我们将在训练集上 fit 或 train 我们的模型。batch size决定了每次迭代时我们将考虑的图像数量。epochs的数量决定了模型迭代整个数据集的次数。在一定次数的epochs之后,该模型将基本上停止改进。
verbose值决定模型是否会告诉我们模型的进度,validation_data决定模型在每次迭代之后如何评估其损失值。
最后,我们将打印出我们模型的准确度。最终结果应介于98%和99%之间。
您可以在我的Github上找到完整的代码,也可以在 Google Colaboratory上运行。
神经网络松散地基于我们的大脑解释信息的方式。
卷积神经网络特别适用于图像。
计算机视觉有很多真实世界的应用。
创建自己的神经网络实际上非常简单。
感谢您阅读我的第一篇文章!我在写作的过程中学到了很多东西。如果您喜欢它,请:
在 LinkedIn 添加我并跟随我的媒体更新我的历程
留下一些反馈或给我发电子邮件(alexjy@yahoo.com)
想要继续查看该篇文章相关链接和参考文献?
长按链接点击打开或点击底部【让你的电脑拥有“视力”,用卷积神经网络就可以!】:
https://ai.yanxishe.com/page/TextTranslation/1290
AI研习社每日更新精彩内容,观看更多精彩内容:雷锋网雷锋网雷锋网
一文带你读懂计算机视觉
等你来译: