卷积?神经?网络?教你从读懂词语开始了解计算机视觉识别...

卷积?神经?网络?教你从读懂词语开始了解计算机视觉识别最火模型_36氪 发表时间:2017-07-17(6天前)

点上方绿标即可收听朗读音频

双击文章内容从指定位置处朗读

大数据文摘作品编译 | 璐高宁樊恒岩田奥

简介

卷积神经网络听起来像一个奇怪组合这个名字涉及了生物学、数学还有一点计算机科学乱入但它却是计算机视觉领域最具影响的创新在2012年由于Alex Krizhevsky使用神经网络赢得了ImageNet挑战赛的冠军(这个比赛可被看作计算机视觉领域的奥运会)神经网络第一次崭露头角神经网络把分类误差从26%降低到15%这在当时是一个令人震惊的进步

从那以后大量公司在他们的核心业务中使用深度学习Facebook把神经网络用在自动标签算法上google把它用于相片搜索亚马逊把它用于产品推荐Pinterest把它用于房屋列表个性化Instagram把它用于搜索框架

然而神经网络经典且最常用的使用案例仍是图像处理就让我们一起来看看CNN(卷积神经网络)是如何在图像处理任务中实现图像分类的

问题描述

图像分类这项任务旨在把输入的图片分入某一特定类别(例如一只猫或者狗等)或者可能性最大的类别对我们人类而言图像识别的能力是我们从出生起就在学习的一项任务这项任务对于成年人来说更是不费吹灰之力无需多想我们就能迅速而准确地识别出我们所处的环境和我们周围的物体大多数时候当我们看到图片或者是周围的世界时甚至不用刻意观察我们就可以立刻描绘出场景的特征并给每个物体贴上标签这些迅速识别模式、归纳知识以及适应不同图像与环境的技能一直是机器难以拥有的

输入和输出

当电脑看见一张图像(把图像作为输入)它实际上看到的是一个由像素值组成的数组基于分辨率和图像的大小它会看到一个32 x 32 x 3的数组(3指的是RGB的值)假设我们有一张JPG格式、大小为480 x 480的彩色图片那么它对应的就是一个480 x 480 x 3的数组数组中的每一个数字都是介于0到255之间的这些数字代表像素在这一点的强度尽管这些数字对于人类做图像分类是毫无意义的它们却是电脑唯一能得到的输入信息计算机识别图像的基本思路是你把这个数组输入给电脑它就会输出一个数字代表该图像属于某一特定分类的概率(例如80%的概率是猫15%的概率是狗5%的概率是鸟)

计算机的任务

现在我们知道了问题所在以及输入和输出下面我们就该来思考一下怎么完成这个过程了我们希望计算机能够区分开我们输入的所有图像并且识别出其独特的特征比如哪些特征是狗特有的哪些是猫特有的这个过程也会在我们的大脑中下意识地进行当我们观察狗的图片时我们会在图片中寻找可识别的特征例如爪子或者4条腿这样我们就能将它正确地分类同样的通过寻找例如边缘和曲线之类的底层特征并通过一系列的卷积层建立一个更加抽象的概念电脑也能进行图像分类这是CNN工作原理的概览下面让我们来了解一下它工作的细节

与生物学的联系

首先讲一点背景知识当你刚听到卷积神经网络这一术语时你可能会想到神经学或者生物学没错就是这样!一定程度上CNN确实从视觉皮层的生物学中汲取了灵感视觉神经中有一个小分区中的细胞对特定视觉区域很敏感这个想法是从Hubel和Wiesel在1962年做的一个有趣的实验中扩展得来的实验显示大脑中的一些特别的神经细胞只会对特定方向的边缘做出反应例如一些神经元在看到垂直的边缘时会被激发而另外一些则会被水平或者斜对角边缘激发Hubel和Wiesel发现所有这些神经元都排列在一个圆柱构架中它们一起工作产生视觉感知系统中特定部件完成特定任务的想法(视觉皮层中的神经细胞寻找特定特征)对机器也适用它是CNN的基本原理

结构

回到细节上来CNN所需做的是拿到图像输入一系列卷积、非线性、池化(下采样)和完全连接的层中最终得到一个输出就像我们之前说的输出可以是能最好描述图的分类的一个单一结果或者一组分类的概率现在最难的部分即是理解每一层的工作原理首先让我们来看看最重要的部分

第一层(数学部分)

CNN的第一层通常是卷积层首先你需要记住卷基层的输入是什么如上所述输入是一个32 x 32 x 3的像素值数组现在解释卷积层的最好的方法就是想象一个手电筒正从图像的左上角照过我们假设这个手电筒的光覆盖了一个5 x 5的区域然后我们想象这个手电筒的光照过输入图像的所有区域在机器学习的术语中这个手电筒叫做过滤器(有时也被称作神经元或者内核)手电筒照过的区域称作感受域现在这个过滤器也是一个数组(其中的数字被称为权重或者参数)一个非常重要的注意事项是过滤器的深度要和输入的深度相同(这保证可以进行数学运算)所以这个过滤器的大小是5 x 5 x 3现在我们以滤器的第一个位置为例即图像左上角随着过滤器在输入图像上滑动或者进行卷积运算过滤器中的值会和图像上的原始值相乘(又称作计算点积)将这些乘积相加(从数学角度讲一共会有75个乘积)你就得到了一个数字记住这个数字只是过滤器在图像左上角时得到的结果现在我们在输入内容的每一个位置重复这一过程(下一步是把过滤器向右移动一个单位然后再右移一个单位以此类推)输入内容上的每一个特有位置都会产生一个值过滤器滑过所有位置后你会发现你得到了一个28 x 28 x 1的数组我们把它称作激活映射或特征映射你得到一个28 x 28数组的原因是5 x 5的过滤器在32 x 32的输入图像上有784个不同的位置这784个数字映射成了一个28 x 28的数组。 

(小注包含上图在内的本文的一些图片来自一本Michael Nielsen写的《神经网络和深度学习》强烈推荐。)

假设现在我们用两个而非一个5 x 5 x 3的过滤器那么我们的输出就变成了28 x 28 x 2的数组通过使用更多的过滤器我们能更好的保存空间维度数学上讲这就是卷积层上发生的事

第一层(任务概况)

让我们从更高层次来看卷积实际在做什么吧每一个过滤器都可以看做为一个特征标识器这里的特征是指直线、简单的颜色以及曲线之类的东西这些都是图片所共有的最简单特征我们的第一个过滤器是一个7 x 7 x 3的曲线检测器(为了简化这个问题在这里我们先忽略过滤器有3个单位深度这一事实只考虑过滤器和图片的最上层切片)曲线检测器有一定的像素结构在该结构中沿着曲线形状的区域将具有更高的数值

图片标题左- 过滤器的像素化表现右-可视化的曲线检测过滤器

现在让我们将这个数学问题可视化当我们对左上角的输入使用这个过滤器时这个区域的像素值和过滤器将进行乘法运算以下图为例我们将过滤器放在左上角

图片标题左-原始图右-可视化过滤器在图片上的位置

记住我们要做的是将过滤器的值与图片的原始像素值进行乘法运算

图片内容可视化的接受域 的像素值 * 过滤器的像素值

相乘和相加 = (50*30)+(50*30)+(50*30)+(20*30) +(50*30)=6600. (一个很大的数字!)

一般来说如果输入图片的形状与过滤器所表现的曲线相类似那么我们的乘积的和会是一个很大的数值现在我们尝试移动过滤器看看会发生什么

图片内容过滤器在图片上的位置 接受域的像素值*过滤器的像素值

相乘和加和 = 0

这个值相比上一个要低很多!这是因为图片中没有任何部分与曲线检测过滤器对应记住这个卷积层的输出是一个激活映射在这个只有一个过滤器(并且这个过滤器是曲线检测器)的卷积的案例中激活映射会显示出图片中那些与过滤器的曲线相类似的区域该示例中28 x 28 x 1的激活映射的左上角的值将为6600这个很高的值意味着输入中包含着某种类型的曲线激活了过滤器激活映射的右上角的值是0因为所输入的值并没有激活过滤器(或者更简单的说图片的右上角没有这样一个曲线)这仅仅是一个过滤器一个可以检测出向右外侧的曲线的过滤器我们可以拥有更多的过滤器如向左的曲线或者直线过滤器越多激活映射的深度越深我们从输入中取得的信息也就越多

免责声明在本节中的所描述的简化版的过滤器是为了说明一个卷积中所涉及到的数学问题在下图中你可以看到一个已经训练好的神经网络中第一个卷积层中过滤器可视化的一些示例但它们主要的想法还是一致的第一个卷积层中的过滤器对于输入的图片进行卷积当过滤器所代表的某个具体特征在输入中被发现时过滤器就会被“激活”(或者得到很高的值)

(提醒上面的图片来自于斯坦福大学Andrej Karpathy 和Justin Johnson任教的 CS 231N 课程如果想要更深入地了解CNN这门课是你的不二选择。)

更深入地了解神经网络

在传统的卷积神经网络架构中各个卷积层中穿插了其他的一些层我强烈鼓励大家去了解这些层的具体功能和效果但简单来说这些层提供了非线性和保留维度的功能从而提升神经网络的鲁棒性并能防止过度拟合一个经典的CNN架构如下

输入-> 卷积->激活-> 卷积->激活->池化->激活-> 卷积->激活->池化->全连接

神经网络的最后一层是很重要的一个层我们稍后会进行具体介绍让我们先回顾一下到目前为止我们所学的内容第一个卷积层上的过滤器是用来发现特征的通过这些过滤器可以发现低层次的特征例如边和曲线然而为了预测图片类型我们需要让神经网络识别出高层次的特征例如手、爪子或耳朵让我们思考一下神经网络中第一个卷积层的输出是什么?应该是一个28 x 28 x 3的体量(假设我们使用的是3个5 x 5 x 3的过滤器)

当我们进入另一个卷积层的时候第一个卷积层的输出就成为了第二个卷积层的输入接下来的步骤很难被可视化在第一层中输入是原始的图片然而当我们进入第二个卷积层的时候第一层的计算结果激活映射就成为了第二层的输入每个输入都描述了某些低层次特征在原始图片中出现的位置现在当你使用一组过滤器(让它通过第二个卷积层)时输入中被激活的部分就代表了高层次特征

这些特征可能是半圆形(由一条曲线和一条直线组成)或者方形(由几根直线组合而成)当你使用更深层的神经网络和更多的卷积层时你将得到更复杂特征的激活映射训练完神经网络后你会得到一些过滤器当图片中是手写字母时它们会被激活或者当识别到粉色时被激活等等如果你想进一步了解卷积网络中过滤器的可视化你可以参考Matt Zeiler 和 Rob Fergus一篇很优秀的研究报告你也可以在YouTube上看到Jason Yosinski做的一个很精彩的可视化展现视频还有一个有意思的事情是当你使用更深层的神经网络过滤器所覆盖的接受域会逐渐变大这意味着过滤器考虑了原始输入中更大范围的信息(换句话说这些过滤器对于更大范围的像素空间反应更敏感)

全连接网络层

既然我们已经可以检测到这些高层级的特征接下来我们就需要一个全连接网络层作为神经网络的结束层该层将之前层(卷积层、激活层或者池化层)的处理结果作为输入并输出一个N维的向量N是程序所选择的类别的数量例如你想做一个数字识别程序一共有10个数字那么N就是10这个N维向量中每一个数字表示了目标对象属于该类的概率值例如一个数字识别程序的结果向量是[0 .1 .1 .75 0 0 0 0 0 .05]它的意思就是这个图片有10%的可能性是1, 10%的可能性是2, 75%的可能性是3以及5%的可能性是9(注你也可以使用其他方式表示输出在这里我使用了Softmax回归模型的方法)全连接网络层的功能是通过分析前一层的输出(代表高层次特征的激活映射)决定哪些特征值和某一个特定的类别相关性最高

例如如果程序预测某张图像是一条狗它就会在代表一个爪子或四条腿等高级特征的激活映射中有较高的值类似的如果程序预测某张图像是一只鸟它就会在代表翅膀和喙等高级特征的激活映射中有很高的值本质上讲一个全连接层关注与特定类相关性最强、并且有特定权重的高层特征以便能在计算权重与前面一层乘积后得到不同类的正确概率

模型训练

现在我要说的是我之前故意没有提到一个话题它也可能是CNN最重要的部分阅读中你可能已经产生了许多疑问过滤器如何在第一个转换层知道它要寻找的边缘和曲线?完全连接层如何知道要查看什么激活映射?每个层中的过滤器的值要怎么确定?这些都是通过一个叫“反向传播”的训练过程实现的通过这一训练计算机可以正确调整其过滤值(或权重)

在讨论反向传播之前让我们先看一下使神经网络工作的条件在我们出生的那一刻我们的意识是一张白纸我们不知道猫、狗、鸟是什么类似地在卷积神经网络被训练之前权重或过滤值都是随机的过滤器不知道如何查找边缘和曲线在更高的层的过滤器不知道寻找爪子和喙随着年龄的增长我们的父母和老师给我们展示了不同的图片和图像并告诉我们相应的标签这个让图像和标签一一对应的想法就是CNN训练的过程

让我们回到反向传播假设我们有一个训练集它有数千张狗、猫和鸟的图像并且每一个图像都有一个正确的标签

反向传播可以分为4个不同的部分前向传递、损失函数、后向传递和权值更新在向前传递时你接受一个训练图像(它是一个32×32×3的数组)并通过整个网络传递它在我们的第一个训练示例中由于所有的权重或筛选值都是随机初始化的输出可能类似于[.1 .1 .1 .1 .1 .1 .1 .1 .1 .1]基本上是一个不优先考虑任何数字的输出以其当前的权重这一神经网络是无法查找那些低级的特征的因此也无法对图像作出合理的分类这就是反向传播损失函数的一部分记住我们现在使用的是训练数据此数据既有图像又有标签比方说输入的第一个训练图像是3图像的真实标签就是[ 0  0  0  1  0  0  0  0  0  0 ]损失函数可以有许多不同的定义方式一个常见的定义是MSE(均方误差)即½乘(实际值-预测值)的平方

假设变量L等于那个值可以想象第一张训练图像的损失将非常高现在让我们直观地思考这个问题我们想使得预测标签(ConvNet输出)与训练集的实际标签尽可能吻合(这意味着我们的网络预测是正确的)为了达到这一目标我们要尽量减少我们的损失让我们把这一问题看作是微积分中的一个优化问题——我们想找出哪些权重最直接地导致网络的损失(或错误)

现在我们要做的是在网络中进行反向传递它决定了哪些权重造成了最大的损失并找出调整它们的方法以减少损失一旦我们计算出这个导数(dL/dWW是权重)我们就可以进入最后一步即权重更新在这一步我们对过滤器的权重进行更新更新的方向即是我们刚才计算出的导数/梯度的反方向

学习率(Learning Rate)是由程序员选择的参数高学习率意味着在权重更新中采取更大的步骤因此该模型可能只需要较少的时间来收敛到最优的权重集上然而学习率过高可能导致跳跃过大而不够精确无法收敛至最佳点

正向传递、损失函数、后向传递和参数更新过程是一个训练迭代过程程序将重复这一过程为每一组训练图像(通常称为批处理)进行固定次数的迭代在我们完成最后一个训练示例中的参数更新后如果一切正常网络就已经得到了足够的训练即网络的权重得到了正确的调整

测试

最后为了检验我们的卷积神经网络是否有效我们需要一套不同的图像和标签(不能在训练和测试之间重复使用!)我们用训练过的卷积神经网络对图片标签作出预测再比较输出和这些图片的真实标签以检验我们的网络是否能正常工作

企业如何利用卷积神经网络

数据数据数据!相比其他竞争对手那些拥有海量数据的公司有着先天的优势你给网络提供的训练数据越多你可以做的训练迭代越多你能做的权重更新就越多而当你投入到生产中时对网络的调整就越好Facebook和Instagram可以使用数十亿用户当前的所有照片Pinterest可以使用其网站上的500亿个引脚的信息谷歌可以使用搜索数据亚马逊可以使用每天产品销售产生的数以百万计的数据而现在你已经知道了使用这些数据背后的秘密了

免责声明

虽然这篇文章是理解卷积神经网络的一个好的开始但它并没有提供一个全面的概述这篇文章没有讨论的话题包括非线性、池化层以及网络的超参数如过滤器尺寸、步长以及边界处理此外这篇文章也没有讨论网络结构、批量归一化、梯度消失、dropout、初始化技术、非凸优化偏移量、损失函数的选择、数据增强、正则化方法、计算考量、修改反向传播等诸多话题

原文链接

亲,眼睛太累了,关注exread(睿读)微信号,用耳朵“阅读”微信。

您可以将文章的链接或收藏的微信发送到睿读微信号中,我们会帮您转换成音频来听读,让您的眼睛休息一下吧!
查看来源 违规举报