让你的电脑拥有“视力”,用卷积神经网络就可以!

频道:生活应用 日期: 浏览:35

本文为 AI 研习社编译的技术博客,原标题 :

如何借助卷积神经网络来教会一台计算机具备视觉能力 ,这是一个问题 ,这个问题涉及到诸多方面 ,包括技术细节 ,还有需要考虑的各种因素 ,例如数据处理方式 ,以及模型训练的具体流程 ,等等 。 。

作者 | Alex Yu

翻译 | zackary、chesc

校对 | 酱番梨       整理 | 菠萝妹

原文链接:

这条链接指向一篇关于如何运用卷积神经网络让计算机具备视觉能力的文章,其网址为https://towardsdatascience.com/how-to-teach-a-computer-to-see-with-convolutional-neural-networks-96c120827cd1 。

近些年来,计算机视觉范畴达成了颇为显著的进步,卷积神经网络显著地提高了图像识别模型的精准度,于日常生活里存在诸多运用,在此文本当中,我会阐述其运作原理,呈现一些实际运用实例,还会说明怎样凭借Python以及Keras去达成一个卷积神经网络。

图片来自Amanda Dalbjörn

对于多数人而言,视觉是日常生活一部分,我们借双眼探寻周遭世界开yunapp体育官网入口下载手机版,我们借双眼交流、理解,我不必向你讲视觉何等重要,视觉对我们这般关键,你甚至难想象无视觉时的状况。

不过,要是我叫你阐释你怎样“看见”的呢?我们怎样领会从我们眼睛传来的信息呢?首先,当你瞅着某样事物,接着......出现了啥情况?我们的大脑宛如一台历经数百万年自然进化的超级计算机。在辨别不同的模式与物体方面,我们已然变得颇为擅长。

大量技术是以自然机制为基础的,拿相机来举例,快门对光线量予以控制,好比我们眼睛当中的瞳孔,镜头与眼睛会聚焦以及翻转图像,相机跟眼睛借助一些途径感知光线并把它转变为能够被理解的信号。

图片来自Alfonso Reyes

但是,很明显,我们并非是那种长出腿与胳膊的行走相机。现有的相机没办法完全理解其所拍摄的图片。要是它们能够做到,那可就有点吓人了。对于相机以及计算机而言,一幅图片只是由一串串数字所组成的向量。

用矩阵表示的数字8,来自MNIST数据集

究竟我们要凭借何种办法去创建一个可用以辨别一只被拍摄下来的图像到底是狗还是猫的程序呢,这恰好是我们尝试运用计算机视觉去解决的问题。

也就是神经网络能够帮助我们解决的问题!

神经网络是如何工作的

人工神经网络,是一种程序,它基于人类大脑,神经网络由许多神经元组成,这些神经元相互联结,有一些神经网络存在数百万个节点也就是神经元,还有数十亿个联结!

对于一个神经元而言,它能够被视作是一个函数,此函数会接纳一个输入值,之后返回一个输出值。

人工神经元模仿生物学中的神经元

单个神经元自身无法有所作为,然而当众多神经元相互联结起来时,情况就变得饶有趣味得多,神经网络的各异结构能够使你达成诸多相当酷炫之事。

你可以得到类似的网络

每个神经元,都跟自身的“权重”存在联系,举个例子,我们有一个神经网络,它尝试分辨一张图片是不是热狗,那么我们就会期望,在神经网络里,含有热狗特征的神经元,比含有普通狗特征的神经元更为重要 。

神经网络的权重,是于数据集上经训练而得,它会运行多次开元ky888棋牌官方版,依据损失函数借反向传播变换各个权重,神经网络被输入测试数据,进而得到并分析结果,获取得分并令自身更准确,经此过程,一个神经网络能够学习并提升预测的准确度 。

关于反向传播过程以及损失函数的讲述我是不会的,不过存在着许多很棒的资源对它们进行了介绍,像这一篇就是,卷积神经网络是神经网络当中一种特别的类型 ,它们在图像数据集上所表现的是很好的 。

卷积神经网络

卷积神经网络图示

像我先前讲过的那样,计算机把图片视作矩阵里的一堆数字,CNN的不同层级将函数施加于这些矩阵,目的是从图像之中提取各类特征并且降低图像的复杂程度。

让我们一同瞧瞧,训练一个用来当作热狗检测器的卷积神经网络,所需要的那几个步骤哟。

首先,我们给卷积神经网络的权重赋予随机的初始值,这大体上意味着网络纯粹就是在作猜测,一旦网络做出了它的预测,它会用一个损失函数来评估自身的误差,接着更新自己的权重以便在下一次取得更好的结果。

一些层被包含在卷积神经网络之中,这是卷积层,那是池化层。你能够如此去想象,在卷积层里究竟发生了什么:

设想你存有一幅图片以及一个放大镜,把你的放大镜放置在图片左上角的正上方之处,你要去寻觅一个特别的特征,并且记录下你是否找到了,缓缓地移动你的放大镜,而后重复这个行为。

可视化卷积层中的特征提取

卷积层创造了一系列的特征映射。

对于卷积神经网络而言,它被用于描述不同图片,像动物或者面部这些,卷积神经网络寻觅的特征能够是目标的各异边缘,如同列出图片里各个边缘的列表那般,该列表会接着被传入具有相同功能的另一卷积层,只是这一层寻觅的是更大的特征,例如动物的一条腿或者面部的一只眼睛,最后,所有特征会被传入一个全连接层,它会对图像进行分类。

池化层会和卷积层一同运用,它好似另外一个放大镜,只是它并非去寻觅特征,而是选取区域当中的最大值用来降低图像的复杂度。

卷积神经网络里的池化

这具备实用性,缘由在于诸多图片尺寸较大,其像素数量过多,致使处理器进行计算时存在困难。池化可让我们达成缩减图片尺寸的目的,与此同时还留存了多数关键信息。池化亦被用以避免过拟合现象的发生。过拟合是指模型于训练数据方面展现良好开yun体育官网入口登录app,然而在其未曾见过的数据上却无法获取理想结果 。

在一个线性数据集上发生了过拟合

正如你所见到的,图之中存在能够以一根直线(黑色)加以表示的数据,用蓝色予以表示的模型与全部分数据点相匹配,然而当我们期望该模型对某些点做出预测之际,它却无法达成,回归到卷积神经网络情况里是,这意味着模型于其训练集之上会相当精确,可是针对其他并未处于训练集之中的图片,它却不能够给出正确的判定。

最后,我们把卷积神经网络弄成了一个特长的特征向量,我们大体上把数据凑一块儿,投进全连接层里去进行预测。

为什么神经网络更好?

倘若我们并未运用神经网络,那么我们会怎样去处理这个问题呢,比如说,我们正试图编写一个用于识别猫的程序,我们能够尝试凭借寻找某些形状来展现猫 。

来自计算机视觉专家李飞飞的TED演讲的猫的形状

貌似瞅着特别容易搞定吧,然而且慢,并非全部的猫咪皆是这般模样,假若你拥有一只正在舒展身体的猫该如何是好呢,我们得增添更多的形状。

来自计算机视觉专家李飞飞的TED演讲的更多猫形状。

迄今为止,应当很明晰,径直告知计算机寻觅某些形状行不通。猫具备各式各样的形状与大小。而且这仅是以我们仅寻觅猫为假设,要是我们想要一个能够对各类图片予以分类的程序呢 ?

这便是为何运用神经网络更具优势的缘由,您能够让计算机自行设定规则,借助运用极为先进的算法,神经网络能够以极高精度疯狂地对图像予以分类,有些模型已然在这个任务里战胜了人类!

我们应用计算机视觉的一些非常酷的方法

伴随着算法愈发具备效力,硬件变得越发强壮有力,我们能够借助神经网络去达成诸多任务,这差不多如同科幻小说那般。然而这并不表明我们当下未曾运用这项技术去做诸多精妙绝伦之事!

零售

你或许于新闻里听闻过它,电子商务巨擘的无人收款杂货店,即 Amazon Go。你步入其中,选取一些物品,而后离开。系统会自动化向你收取所需费用。布满天花板的相机会追踪你拿起的物品。然而系统并非完美无瑕,入店行窃之事或许极易发生。瞧瞧这个想法在未来数年怎样发展将会极具趣味。

自动驾驶汽车

依我看,自动驾驶汽车属于当下正进行的某些极为酷炫之事,Waymo起初是Google的自动驾驶汽车项目,Uber和Tesla当前正致力于研发一些能够自动导航道路的车辆。

Waymo的自动驾驶汽车形成的车队,已经有了超过1000万英里的行驶路程,它平均每年行驶的路程约为12,000英里。总的来讲 ,这是超过且等同于800年的驾驶里程!

Waymo的一辆自动驾驶汽车

医疗保健

在医疗保健范畴,CNN被运用来辨认诸多不同种类的疾病,借助对癌症或者别的医疗状况的某些数据集予以训练,神经网络能够以高准确率判定其是否患病,通过神经网络提取特征并在数据里查找模式,它能够利用某些我们从未思索过的图像信息!

用Keras创建卷积神经网络

目前我们要进一步凭借直观的方式以了解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之上运行。

关键要点

感激借由您去阅览我的头一篇文章,我于写作的进程当中收获到了许多范畴的事物,要是您对它怀有喜爱的情感,那么请:

网友留言(0)

评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。