长文解析Resnet50的算法原理

恭喜你发现宝藏了。收藏起来吧。

前言

从打算写图像识别系列文章开始已经快2个月了,目前写了有9篇文章,几乎涵盖了Renset50这一CNN网络95%的算法。

今天整理了下,修复一些笔误和表述错误,整理成了pdf, 同时本文也是整理汇总版。

这篇文章算是偏专业性的深度科普文,将Resnet50这一神经网络(为什么叫这个名字文中也有详述)用到的算法几乎全部分章节完成了科普性的表述。

文中关于算法的表述力求在通俗易懂的情况下完成,几乎没有枯燥无味的公式推导,会有很多图片演示,算法背景也有交代。但毕竟涉及到算法,对于没有算法背景或深度学习背景的同学而言,可能有些地方会难懂一点,但不妨碍对深度学习或Resnet50这一网络有个感性的认识。

限于作者白天要上班,文章基本都是晚上下班后和周末抽时间写的,时间精力有限。文中一些表述难免有疏漏,同时,作者为了尽可能用通俗易懂的语言说清楚一些算法原理,会导致某些算法上的表述并不严谨,但不妨碍我们对一些算法有一个感性认识。

欢迎收藏本文或分享给周围希望了解深度学习知识的朋友。

pdf 目录如下:

长文解析Resnet50的算法原理

长文解析Resnet50的算法原理

?全文共18500字,全文较长。

建议收藏本文,全文pdf你也可以关注下面链接的公众号,发送【resnet】获取全文pdf。下载pdf阅读更通畅。

长文解析Resnet50的算法原理

一、写在前面

如果让你设计一个可以识别图像的神经网络,你会怎么做/p>

我之前问过自己这个问题,思来想去,我的答案是:我可能不知道如何下手。

突然有一天,当我把Resnet50这个网络的所有算法都写完一遍之后,我突然觉得,只要我深入了解了这些算法的原理,或许这个网络我也能设计出来(后知后觉的大话而已)。

于是,我有了一个大胆的想法。接下来,我会从头开始,聊聊一个图像识别网络是怎么工作的,每一步算法的原理,以及相关的背景知识。你可能会想,看懂这些需要什么知识呢实不需要太深奥的数学知识。我会尽可能把每一步写的通俗易懂,这个过程中我也会搜集一些资料,也是一个不断完善自己知识体系的过程。

文中聊得网络,就是大家都比较熟悉的,被玩烂的、作为各大AI芯片厂商性能标杆的Resnet50。

个人水平有限,文中如有错误,欢迎联系我指正。

长文解析Resnet50的算法原理

二、从像素说起

要实现图像识别,最离不开的,就是像素。

其实我们都知道,图像是由像素组成的。实际上,神经网络计算,算的就是像素之间的关系,以及这些关系背后可能隐藏的图片信息。相机摄像头像素2000万,拍出来的照片肯定比像素1000万的要清晰我们更容易看到图片中的物体是什么。

这是为什么为像素越多,像素之间的关系(色彩,轮廓)越丰富,我们所能看到的信息就越多,自然而然获取到的信息就多。

长文解析Resnet50的算法原理

一张1080p的图片,我们可以更容易辨别出图像中的物体是山还是水。这是因为更多的像素会给眼睛更丰富的图片细节 但是,你有没有发现,当我们去看一张图片时,我们绝对不是盯着某一个像素或某几个像素看,而是看了整个图像的大部分区域,或者说,大部分像素!

因为只有看到了大部分的图片,才能知道图中是座山。正所谓,聚沙成山!绝不是少了一粒沙,山就不是山,多了一粒沙,就变成了山。

像素局部性

长文解析Resnet50的算法原理

?上图哆啦A梦,虽然不是很清晰,像素点数也很少,但一眼望去,依然可以分清是哆啦A梦,甚至,用手捂住一半的图像,依然可以。

这是因为人眼对于图像信息的识别,是建立在对像素局部性分析的基础上的。

所谓局部性,通俗点说,就是眼睛或大脑会将相邻的像素或大片的像素连接起来分析,从而组合成嘴巴,然后是耳朵,最后是哆啦A梦。

神经网络识别图片大致就是这样的原理,它模拟的,就是人们看到图片之后的信息处理过程。

当我们盯着一个图片看时,我们首先会获取到图片的细节特征。比如哆啦A梦红色的大嘴巴。但是如果仅仅盯着大嘴巴,又反而让人有一种“只缘身在此山中”的感觉,看不到图片的全貌。

因此还需要看一下图像的轮廓。于是,我们的眼睛看图片大致有以下两个过程:

  • 瞳孔放大,盯着某一处细节(如大嘴巴)看
  • 瞳孔缩小,模糊的看一张图片的大致轮廓

两个过程获取的信息叠加。

Bingo,看清楚了,是哆啦A梦!那么神经网络是否可以模拟这种瞳孔放大、缩小的方式呢/p>

很幸运,可以! 那就是卷积算法。

卷积

长文解析Resnet50的算法原理

卷积的计算示意图

卷积核的设计,就可以很直观的模拟这种获取图片信息的方法。

人们通过调整卷积核的大小,来达到瞳孔张开、缩小的目的。并且大量的实验和论文表明,卷积这一针对图像局部性识别的算法,可以非常有效的模拟人眼识别物体的过程。关于卷积算法以及卷积核的设计原理,后面会专门来讲,因为卷积这一算法,在图像处理领域,太重要了。

我们现在继续沿着像素这一话题讲下去。

色彩分量RGB

回到像素这一话题,你有没有想过,为什么一张图片会是彩色的。

学过摄影的小明同学可能这时会回答:因为图片是由RGB三种颜色来表示的,每个像素实际是不同的R/G/B分量的叠加,混合起来,就表示成了不同的颜色。

回答正确。

长文解析Resnet50的算法原理

?三张分别表示R/G/B分量的图片,合成一张彩色图片

对于上面一张RGB的图,我们人眼可以很直观的看到红色和蓝色,可以察觉到一张图片的色彩和轮廓。

那么,如果让计算机来处理图片,他又是如何知道色彩和轮廓的呢/p>

其实对于计算机来说,一张图片只是一堆数据,计算机是无法知道这堆数据代表的是什么。这就需要人为的给这堆数据一种表示方法,让计算机知道,哦,这1/3的数据是红色分量,这1/3的是蓝色分量,这些数据(像素)组合起来,可能代表的是个“帽子”。

怎么做呢过设计数据在计算机中的存储方式来解决。

数据在计算机的存储中,最常见的存储方式是连续存储的。比如C语言,定义一个数组,那么数组在内存中的位置是连续的。

长文解析Resnet50的算法原理

哈利波特的女贞路4号,内存也是类似于门牌号规则,数据就像人一样,存储在以地址为标识的一个个的内存地址上(房子)

只不过,在计算机存储器中,没有门牌号,有的都是地址。这个时候,计算机根本就不关心数据是啥,计算机用到的时候,就把数据从内存对应的地址中取出来用。

计算机是如何取像素数据的

人们为数据存储设计一种格式,告诉计算机,这堆数据大概是什么样的。只有这样,通过这种约定的方式,计算机才能正确的取到R分量或者B分量。

对于一张图片来说,最常见的两个参数是长和宽,一般用H(height) 和W(width) 来表示,那么RGB三个分量,看作是3个通道(channel),一般用 C 来表示。

如此一来,一张长宽分别是224像素*224像素的RGB图像,就可以用 HWC = [224, 224, 3]来表示。两张类似的图片就用 NHWC = [2, 224, 224, 3]表示,其中N代表图片张数。

长文解析Resnet50的算法原理

一张图片的抽象数据表示

友好的数据表示方法,可以减少大量的计算复杂度。

虽然这样表示不太利于人们的直观理解,但是计算机处理这种数据是十分方便的。在目前主流的深度学习框架中,对于图片的数据格式,基本都支持了NHWC或NCHW这种数据摆放格式。说到底,都是为了更高效地进行图片数据的处理和运算。

总结一下

这一章,从像素说起,说到了像素具有局部连接性的,人眼识别图像也是通过获取像素的局部连接性信息来完成的。

幸运的是,卷积这一算法,可以很好的模拟这一过程。最后,为了使计算机更高效的处理图片数据,引出NHWC的图片数据表示方法,所以,之后我们说图片,不仅仅局限于图片的长和宽,还多了一个维度信息,那就是channel。

加餐

熟悉OpenCV或者计算机视觉的同学,可能对于上面的RGB分量中的女神很熟悉。没错,在很多的教程中,这位女神不止一次的出场。

长文解析Resnet50的算法原理

这位女士名叫Lena。

电气电子工程师学会图像处理汇刊(IEEE Transactions on Image Processing)主编曾在1996年1月出版的一期中解释道,Lena的流行,因为她是一张好的测试图片,其中包含了很多细节,平滑区域,阴影和纹理。当然,另外一个原因就是漂亮美女的图片自然受到男性居多的研究领域的欢迎。

三、图像的色彩空间

上一章从像素开始,聊到了RGB 这一常见的色彩空间模型。

之所以还想继续聊聊RGB 以及另一种色彩空间模型-YUV ,不是说想要以后去学摄影,学学如何需要调节色度、曝光和饱和度啥的。

而是在图像识别的深度学习任务中,RGB以及YUV这些概念,总是会时不时的出现一下,让枯燥无味且高度抽象的深度学习算法,突然之间,变得具体一些,光鲜一些。

长文解析Resnet50的算法原理

RGB

Red,Green,Blue(RGB)是我们最常见的图像表示方法。这个非常好理解,三原色的融合,几乎可以构造出所有需要的颜色。三张RGB分量图片的融合,就可以构成一幅色彩斑斓的图片。

长文解析Resnet50的算法原理

原图与R G B 三个分量图片

平时我们说,分辨率为1920*1080的图片,它代表的是在长宽两个方向上,有 1920 * 1080 个像素,但是,在色彩这个方向上,还有 3 个通道(channel),也就是RGB,往往被我们忽略。

我们看到的一个像素点的颜色,在计算系统中,并不是简单的由一个数值来表示的,而是由RGB三个分量的三个数值来表示的。

长文解析Resnet50的算法原理

一个像素点的 RGB 表示

因此,想要计算一张1920*1080的图片的大小,或者说计算这张图片在计算机内存中所占用的大小时,不能仅仅用图片的长度乘以宽度这么算,还需要考虑通道数。

数值表示和图片大小计算

我们可能用过画图这一软件来调过颜色。

通过简单的设置红色,绿色,蓝色的数值,就可以在调色板中得到一个颜色。有没有注意到,无论红色,还是绿色,还是蓝色,其表示的数值都没有超过255。

为什么为像素值,在计算机语言中,是用一个 int8 的数据来表示的。而 int8,指的是 8bit 无符号整数,其能表示的范围就是 0 – 255。

长文解析Resnet50的算法原理

?画图面板:自从几年前微软宣布停止更新画图软件之后,画图就越来越少的出现在人们的视野中,你或许可以打开电脑看看,左下角的菜单里,是否还有画图软件,就像当年window xp 系统被停用一样,慢慢的就会消失在人们的记忆里

说到这,我们就可以算一算,一张1920 * 1080 的RGB图像,在计算机的表示中,到底占多少的内存/p>

很简单,长宽方向上每个像素由 3 个通道组成,每个通道由一个 8 bit 的数值表示,一个 8 bit 数值代表一个字节(Byte)。

因此,一张1920 * 1080的 RGB 图像,占计算机存储大小为1920* 1080 * 3 * 1 Bytes = 6075 KB = 5.9 MB5.9 MB 的内存占用!

大么目前动辄几个G的手机内存相比,不算大。

小么边缘侧图像识别终端内存,比如摄像头里的嵌入式芯片内存相比,又不算小。

更何况在公路违法拍照的摄像头场景下,在车流量很大的时候,需要实时处理的图片,可远远不止一张!

那怎么办没有办法可以在进行图像处理时,减少图片的数据量,从而减少图片大小和内存占用呢/p>

有,YUV就是其中一种办法。

YUV

YUV是将亮度信息和颜色信息进行编码的一种颜色空间表示方法。和RGB类似,YUV 也使用3个字母维度来表示颜色。为了简单点,我们暂时将这3个值称为Y,U和V。(事实上,YUV的称呼很多,比如Y’CbCr,也很细节,这里不多描述,我们只要知道它是另外一种表示颜色的方法就可以。)

Y 代表亮度,U 代表色彩度,V代表饱和度。

长文解析Resnet50的算法原理

原图

长文解析Resnet50的算法原理

?仅有Y分量也就是亮度,黑白图片

长文解析Resnet50的算法原理

?仅有U分量,只有色度

长文解析Resnet50的算法原理

?仅有V分量,只有饱和度

上面的几张图片,除了原图之外,我们可能更加倾向于使用只有Y分量的图片,也就是那张黑白图像。

因为即使没有色彩,但是它的轮廓以及明亮程度,也足以让我们分辨出图片中的物体。其视觉效果远远好于其他两个分量的图片。相反,只有色度和饱和度的图片,反而变得模糊不堪。

这就是问题所在!人眼对于亮度具有更高的敏感度,而对色度和饱和度反而显得迟钝一些。

说到这,有没发现什么然人眼对于色度和饱和度的反应不敏感,那就没有必要把所有的色度和饱和度信息都放在图片里了啊。

举个例子,色度和饱和度我隔一个像素放一个,剩下的像素没有饱和度,不就可以了么。没错,是可以,而且效果很好。

这就是YUV的不同编码。

长文解析Resnet50的算法原理

YUV422编码

实际上,YUV的编码方式有很多种,比如YUV444, YUV422等。

大致意思就是,保留全部的Y分量(人眼最敏感的亮度分量),但是只保留部分的U/V分量(人眼不敏感),以此来减少图片的占用,但又不失重要信息。

还记得上面的1920*1080的RGB图片的内存占用么,为5.9MB。如果用YUV444的编码,结果也同样是5.9MB,因为YUV444也是全采样,所有的亮度、色度、饱和度信息都保留了。而如果采用YUV422的编码,相当于U分量减少一半,V分量减少一半。

那么最终的图片占用大小就变成了1920* 1080 * (1 + 0.5 + 0.5) Bytes = 4050KB = 3.9MB

只有3.9MB,减少了1/3的内存占用!是不是好很多多关于YUV的编码知识,有兴趣的同学可以Google。如果不做相关课题,可以不用深究。

我们只需要知道,YUV这一色彩编码方法,在保留亮度这一人眼最敏感信息的基础上,通过降低其他人眼不太需要的信息,可以来达到降低图片大小的目的。

就足够了!

YUV编码的用途

原始图片,channel数代表的是RGB通道,可以理解为原始图片具有的三个特征。

可在深度学习网络中,随着网络深度的增加,图片的channel数会不断的增大。就拿Resnet50这个网络来说,最后面的一层图片,channel数已经增大到了2048。这时channel代表的信息,早已不再是RGB这种基础的特征了。而是通过了大量的神经网络训练,代表了图片的多种分类特征,比如是猫的特征还是狗的特征。

这个后面会详细说。

YUV这种编码方法,可以用在图片的上下采样中。通过降低或增加通道数,实现图片的上下采样,以此来实现图片的增大或减少,但又不损失太多我们希望保留的信息。

总结一下

这章聊了聊RGB、YUV 两种颜色空间,以及YUV可能的用途和它的优势。

为什么聊这么多关于图片的东西,因为在深度学习处理图像的任务中,图片是原材料。正所谓知己知彼,百战不殆。

了解了图片这一深度学习的原材料之后,我们就可以更加高效的来完成图片数据的处理和分析。就可以开始图像识别的算法之旅了!

加餐

公元663年,唐代诗人王勃游历南昌,登滕王阁而做序,大笔一挥,豪气万丈。

当时的王勃,傲立在滕王阁楼顶时,看到的应该是怎样的一副壮美图景,才使得中国文坛留下了一句千古绝唱。

潦水尽而寒潭清, 烟光凝而暮山紫。

当时的王勃,应该怎么也不会想到,1000年后的今天,聪明华夏后人,将”暮山紫”这一颜色进行了编码。从此,暮山紫,不只存在于人们的想象中,而是精确地存在了计算机里。

长文解析Resnet50的算法原理

暮山紫-RGB:163 171 214 | 图片来源:微博@一条

四、初识卷积

就像上一章说的那样,图片是做深度学习任务的原材料,就像是做饭,不了解原材料的特性,怎么能快速高效的做出一顿美味的大餐/p>

下面开始,想聊聊卷积。但是不聊公式,只想聊一下,卷积这一算法是如何工作的,以及它的一些原理。

人脑是怎么记住东西的/h2>

在说卷积之前,先务虚一下,说说AI的记忆。

或许你已经听说过很多AI故事了,比如大名鼎鼎的阿尔法狗大战柯洁。但是,你有没有想过一个问题。阿尔法狗确实是学会了下棋,但是它下棋的记忆到底是什么样的在什么地方呢/p>

高中生物老师教过我们,人脑中有大量的脑神经元。每个脑神经元都可以看做是一个小的记忆体,神经元之间通过树突连接起来。整个大脑的神经元,可以说是一张十分复杂的网络。人脑处理信息,就是利用这个复杂的网络处理信息,并最终得到一个结果。

通过神经元网络,我们才能知道,眼睛看到的是一只猫,还是是一只狗。稍微简化一下大脑神经元的复杂结构成如下的网络。

长文解析Resnet50的算法原理

每个黑点代表一个神经元脑细胞,每个神经元都有自己负责记忆的东西。

当我们看到一张画着猫的图片的时候,图片信息通过视神经传给大脑神经元,于是,信息到达了最左边一排竖着的黑点(神经元)。

神经元的激活与静止

假如一个黑点(神经元)之前见过猫,那么这个黑点就会把信息往后传,此时神经元处于激活状态。

假如一个黑点从来没见过猫,那么这个黑点(神经元)就啥也不知道,啥也不做,此时神经元处于静止状态。

像不像初中课堂上,老师问了你一个超难的问题,而你不知道的时候,你也只能站着,可怜又无助,啥也不会做错,神经元如果没见过猫,他啥也不会做!

长文解析Resnet50的算法原理

?神经元图片的信息就这样,一层一层的通过“见过猫且确信它是一只猫的”神经元往后传递,直到在最后输出一个结果。

这是一只猫。

长文解析Resnet50的算法原理

这个过程叫做大脑的推理。

整个推理过程你应该注意到了一件事。所有的黑点(神经元),都可能是有记忆的,只不过记得东西各有不同,有的认识猫,有的认识狗,就像下面这样。

长文解析Resnet50的算法原理

?所有认识猫的神经元都会让信息通过,其他不认识猫的神经元都静止了。但是只要信息能传到最后,人脑最终就可以得出一个结论,这就是一只猫。

那神经元的这些记忆是怎么获取的呢/p>

当然是训练!

人们在日常生活中不断地训练大脑,时刻观察着周围的事物。见得多了,就会了!

训练,人工智能获取记忆

那么计算机又该怎么模拟这个记忆过程呢/p>

答案很简单:因为计算机只会计算,那就让它计算好了。

如果某个黑点认识猫,有什么办法可以把“这是一只猫”这一信息传递到后面呢以1啊,任何数乘以1都是它自己,一只猫乘以1也还是他自己。

如果某个黑点压根没见过猫,有什么办法可以什么都不做呢以0啊,任何数乘以0都是0,信息也就没了,一只猫乘以零,猫也就没了。

于是乎。在深度学习的网络中,每个黑点(神经元)都有一个与之对应的数字(实际的网络中,不是0或者1这样简单的数字,而是一对复杂的数字,这里仅仅是为了说明示意),这些数字,在深度学习中,我们称之为权值。

神经元可以通过与权值的加权计算来判断是否让某一信息经过神经元,到达下一层。权值乘以输入的信息(猫),然后经过激活函数去激活(类似于人脑神经元的激活)。

如果能成功激活,那么信息就往下传。如果没有成功激活,信息就在此丢失。

当然神经网络中的权值不是简单的0或1,所以经过激活函数计算出来的只是一个概率值,也就是说黑点(神经元)觉得它是一只猫的概率。最终如果得到95%的概率觉的它是一只猫,那基本就是一只猫。

这个权值,就是AI 的记忆。这个权值,就是AI 在训练的过程中学到的东西:千百万次计算得出的最优解。这个权值,可以保证,只要AI 在训练过程中看过猫,那么新的猫咪来的时候,猫咪乘以权值有很高的概率能通过激活函数,确保神经元被激活。

为什么可以这么确定呢。

因为AI 的训练过程早已经模拟了成千上万次“识猫”的过程了。权值就是训练出来的!

就像我们的记忆被训练出来的一样!

而卷积这一算法,就天然存在一个记忆体,或者说权值。

那就是卷积核。

卷积-Convolution

首先不要被这个名字吓到了。不管数学好不好的同学,看到卷积的第一反应,可能是记得有一个卷积公式,貌似可以进行信号处理。

长文解析Resnet50的算法原理

信号处理中的卷积过程

一个代表卷积核的曲线在原始信号曲线上滑来滑去,得到不同的输出。在什么地方学过来着像是时频转换的时候,又好像不是。(当然不是!)

但是,不用回忆之前的知识,不用管它!因为,深度学习中的卷积,和信号处理中的卷积,有相似之处,但又不完全一样。

深度学习中的卷积,完完全全模拟的,就是人眼看物体的过程!

长文解析Resnet50的算法原理

?卷积过程示意图

动图请查看长文解析Resnet50的算法原理

卷积模拟人眼

上图是深度学习中卷积的示意图。

还记得之前说过的么,图片是由像素组成的。

示意图下方的4×4 的像素方格就是卷积需要处理的图片(模拟人眼观看图片的过程)。

示意图上方的2×2 的像素方格就是卷积的输出(人眼看到图片之后得出的结论)。

那么卷积核在哪x4方格上移动的灰色阴影,3×3的像素方格就是卷积核!可以理解为人眼此时聚焦看到的区域(称之为感受野,人眼的视野),只不过,这个示意图中每次看到的都是一个3×3的像素方格!而卷积过程,就是用3×3的卷积核,去逐步扫描图片。横着扫完竖着扫。每扫一次,就将逐个像素点的值相乘然后加一起,得到一个输出。

长文解析Resnet50的算法原理

?

长文解析Resnet50的算法原理

动图请查看长文解析Resnet50的算法原理 上图第一次扫到的是左上角的9个点,与卷积核中9个点逐点相乘,然后相加,就得到了输出图片的左上角的一个点的值。

卷积,就是这么简单的过程。

我们可以通过调整卷积核的大小,比如把上图3×3的卷积核扩大到5×5,来控制 “人眼” 看到的图片范围,从而获取到不同的图片信息。当然,在实际神经网络中,存在这个各种各样的卷积变种。科学家或工程师们通过设计不同的卷积核以及卷积每次移动的多少等参数,来实现不同的功能。但卷积操作万变不离其宗!

总结一下

这一章主要聊了聊几个概念。

AI 之所以能够记住它所学的东西,关键在于神经网络有权值这一参数的存在,它的存在就类似人脑的记忆。并且,权值和人脑的记忆一样,都是通过大量的实践来训练出来的。而卷积这一算法,天然就存在一个权值参数,称之为卷积核,人们可以通过设计卷积核的大小,调整希望神经网络“看到”的图片的视野,也叫作感受野,从而不同的卷积获取到不同的信息。

实际上,卷积这一算法,除了本文说的利用“感受野”获取到不同图片区域的信息,从而将图片在长宽两个维度的尺寸缩放之外,还存在channel维度的升降。

而这,才是卷积这一算法的核心,称之为特征提取。下一章,聊一聊卷积是如何完成一张“画着猫的图片”的特征提取的。

五、卷积的特征提取

上一章聊到了卷积这一算法。

通俗点讲,卷积就是模仿的人眼识图的过程,以“感受野”的视角去扫描图片,从而获取不同区域的图片信息。但其实,这并不是卷积算法的核心思想。

卷积的核心,是通过设计多个卷积核,同时对一张图片进行卷积操作,以完成不同特征的提取。本章重点围绕特征提取这一概念,聊一聊卷积。

卷积的数学描述

不想看数学描述的同学可以略过,不影响后面的阅读。有了之前文章的铺垫,这里说一张图片的尺寸是 [n, h, w, c],应该不陌生了,其中,

  • n 代表的是图片的张数。
  • h 代表的是图片的高度,通俗的讲,高度方向上有多少像素。
  • w 代表的是图片的宽度,通俗的讲,宽度方向上有多少像素。
  • c 代表图片的通道数,例如 RGB 图片,c 等于3。

长文解析Resnet50的算法原理

图片的维度

不论是图片,还是卷积核,其数学描述都是具有n,h,w,c四个维度的数据。

因此,对于卷积算法而言,输入图片尺寸为[n, hi, wi, c](下标i代表input,输入),卷积核尺寸为 [kn, kh, kw, c],输出图片尺寸为[n, ho, wo, kn](下标o代表output)。

有没有发现,输出图片的channel数与输入图片的channel数不一致!输出图片的channel数与卷积核的个数一致!

图片的特征

这意味着什么记得么,channel代表的是图片的特征,如果我们想让图片呈现出100个特征,怎么办卷积,使用100个卷积核计算,输出图片就具有100个特征!

卷积算法,可以通过设计卷积核的个数,随意的提取图片的不同的数量的特征!说的数学一点,卷积算法,就是通过线性变换,将图片映射到特征空间!有点绕关系,只需要知道,卷积的核心,是提取图片的特征就行了。

那么,特征怎么理解呢像特征主要有图像的颜色特征、纹理特征、形状特征和空间关系特征。

长文解析Resnet50的算法原理

RGB图像和它的3个特征通道

RGB图片有3个通道,可以说有3个颜色特征,分别为红色,绿色和蓝色。

那么纹理特征,形状特征和空间特征又是什么意思呢理特征就是图片的纹理,比如下面这样。

长文解析Resnet50的算法原理

?图片中的纹理特征形状特征就是图片中物体的形状,比如下面这样。

长文解析Resnet50的算法原理

图片中的纹理特征

那么卷积这一算法在神经网络的训练过程中学习到这些特征了么案是肯定的!

卷积不仅学到了这些特征,而且还学到了更多人们不太好描述的特征,这些特征对于人类来说可能毫无意义,但对于神经网络来说,确实十分重要的。

长文解析Resnet50的算法原理

长文解析Resnet50的算法原理

长文解析Resnet50的算法原理

长文解析Resnet50的算法原理

Resnet50中各层卷积学到的特征,可视化

上图是著名的论文《Visualizing and Understanding Convolutional Networks》中的截图,文中提出通过反卷积这一算法,以可视化的视角,形象的展示卷积神经网络在训练过程中到底看到了什么。

所谓反卷积,通俗的理解就是卷积的逆运算。可以看到,随着神经网络深度的不断加深,卷积提取到的特征逐渐清晰起来。

由浅层次的纹理特征,逐步到深层次的形状特征!比如,在Layer 4中已经可以看到狗狗的形象!事实上,我们希望神经网络展现出来的是,看到一张画着小猫的图片,里面有一个代表猫的特征通道,该通道最终得分最高。

说到这里,即使你是一个AI算法小白,那也应该对卷积有了一些感性的认识。如果你希望了解到更多细节的东西,后面会逐步进行拆解。

Resnet网络

这篇文章的最后,介绍一下Resnet网络。就在昨天,深度学习大牛孙剑博士因病去世,在人工智能行业掀起轩然大波。孙剑博士领导研究的Resnet网络(残差网络),曾多次荣获图片分类大赛冠军,开启了一个卷积图像分类的热潮。而本文重点拆解的就是Resnet50网络,这是一个图像分类网络。

所谓图像分类,就是它可以将一张图片进行分类。猫就是猫,狗就是狗,飞机就是飞机,大树就是大树。与图像分类不同的,还有图像检测网络。

比如物体识别,需要在一张图片上准确的标注出物体是啥以及物体的位置。

长文解析Resnet50的算法原理

图像检测

这些网络里都大量使用了卷积这一算法。因此这些网络我们也可以称之为卷积神经网络(Convolution Neural Network, CNN)。

除了CNN,还有循环神经网络(Recurrent Neural Network, RNN),之前写过一篇关于LSTM的文章LSTM最通俗的解释,是老师太猛提到的LSTM就是一种RNN结构。

回到Resnet50这一卷积神经网络,这一网络由50个卷积层前后连接而成,因此叫Resnet50,除此之外,还有Resnet18,Resnet101等,大致网络结构相似,只是卷积的层数不同。

为什么会有不同的卷积层数呢经网络在学习的时候,每一层学习到的特征是不同的,就比如第一层,它的输入只有3个特征,输出有64个特征,至于这64个特征代表的是什么,可能连神经网络自己也说不清,它就只管学习。一直到最后一层有2048个特征,到了最后一层,可以比较形象的这么比喻:最后一层共2048个特征,实际上已经代表了2048种物体的分类了。

针对一张图片是猫的原始输入,2048个特征中,只有猫这一特征最后的得分最高,因此,网络会把它推理成猫。这就是卷积算法的核心,特征提取。

六、残差结构

桃树、杏树、梨树,你不让我,我不让你,都开满了花赶趟儿。红的像火,粉的像霞,白的像雪。花里带着甜味儿;闭了眼,树上仿佛已经满是桃儿、杏儿、梨儿。花下成千成百的蜜蜂嗡嗡地闹着,大小的蝴蝶飞来飞去。野花遍地是:杂样儿,有名字的,没名字的,散在草丛里,像眼睛,像星星,还眨呀眨的。

朱自清在写《春》的时候,或许也没有完全认清春天的所有花,以至于写出了“有名字的,没名字的,散在草丛中”这样的句子。

如今,时代变了。人手一部手机的我们,遇到不认识的花,随时随地就可以打开手机百度识图功能来完成识图。“杂样儿的,有名字的,有名字的,有名字的,有名字的 … 都散落在手机里,像眼睛,像星星,还眨呀眨的”!而让我们如此轻松加愉悦的完成识图功能的,便是手机背后运行的大量卷积神经网络,或者说是CNN网络。

上一章聊了聊卷积的核心思想,那就是特征提取,文章最后也介绍了Resnet50这一图像分类网络。我打算接着上篇末尾介绍Resnet50的逻辑,继续聊聊这个图像分类网络,以及它的思想。

为什么叫Resnet50

研究AI网络的人拥有网络命名权。比如我研究出来一个网络,效果很好,要发一篇论文来介绍这个网络,论文中需要给网络起个名字,并且希望这个名字可以流传很广。

那么,简单、好记同时又能概括网络思想的名字肯定是首选。

Resnet50就是这样的名字,这个网络的核心思想,就藏在名字里。

Res + net + 50,Res 是 Residual (残差)的缩写,50指的是整个网络中有50个卷积层。

下图是Resnet50的网络结构图,可以看到,从第一层到最后一层,总共50个卷积算法。

长文解析Resnet50的算法原理

Resnet50 的网络结构拆解,共50个卷积层

那么Res(Residual)残差又是个什么东西呢/p>

残差结构

所谓残差结构,其实就是在正常的神经网络中,增加一个short cut 分支结构,也称为高速公路。比如上图中,左侧是正常的卷积层,一层层往下传,在右侧增加一条连线,使得整个网络结构形成了一个残差结构。

这样,网络的输出不再是单纯卷积的输出F(x),而是卷积的输出和前面输入的叠加F(x) + X。

长文解析Resnet50的算法原理

?

为什么要增加残差结构

在前面说过,深度卷积神经网络在网络深度不断加深的过程中,神经网络会学到不同的特征。但是,能无限制地加深么如使用1000层卷积层进行网络的训练的。

答案显然是不行的。

原因在于神经网络训练的过程是不断与目标值进行拟合的过程,直到拟合的误差降低到人们的预期,代表着神经网络训练完毕,一个会识图的AI就诞生了。

但是在实际训练过程中,数据的传递除了从网络前端往后传之外,还需要将最后一层与目标值的误差传回到网络前端,从而进行下一轮的训练,得到更小的误差,这一过程称为神经网络的反向传播。在往回传的过程中,由于误差本身就很小,如果卷积层数过多,在经过激活函数时,很容易发生误差传着传着就消失了,称为梯度消失。

梯度消失的原因有很多种,不好的激活函数、过深的网络层数等都有可能导致误差消失。想象一下,上一轮训练结果的误差传不回来,下一轮如何在上一轮的基础上进行进一步优化训练果就会导致怎么训练神经网络最终的结果都无法收敛。

AI根本训练不出来!

长文解析Resnet50的算法原理

?残差结构这个时候就可以发挥作用!

想象一下,这个高速公路的存在,可以使得输入数据无损地通过。

如果左侧卷积层学习到的数据不够好,那么叠加上无损通过的原始数据,依然保留了原始数据,不至于丢掉原始数据。而如果左侧卷积层学习到的效果很好,那么依然会保留着学习到的数据,下面的卷积层依然可以在这些数据基础上进一步学习优化。

反向传递也是一样,高速公路的存在,可以确保即使很小的误差也能传递过来,从而避免了梯度消失的发生。

说回Resnet50,这个网络就是通过50层卷积的计算,外加残差结构连接,来完成图像分类的。

长文解析Resnet50的算法原理

看到这,你或许能够了解,当我们打开百度识图完成图像识别时,它的背后,可能不是Resnet50这一网络,但肯定是有卷积和残差这两个算法!

Resnet——简单,暴力,有效

Resnet50网络的结构其实说简单,它很简单,而且算法思想也很简洁,就是50层卷积的计算,依据卷积局部感受野这一特性,抽取出图像的不同特征,通过最后一层卷积(或者叫做全连接)将图片进行分类。

这样的网络设计,分类效果很好,使得Resnet50 多次在图像分类大赛中夺冠!Resnet50除了大量使用了卷积这一算法之外,一个简单暴力的残差结构的应用,使得该网络无论在训练还是推理过程中,其效果都极为出彩!

从此,残差这一结构,受到了人们的关注,以至于,有人开始专门研究不同层之间的残差连接。一句话,Resnet50的核心是卷积和残差,卷积的核心是特征抽取。

加餐——大数吃小数

反向传播中,一个很小的误差,在反向传播经过激活函数(比如Sigmoid激活函数)时,有可能结果为零,这就是上面我们说的梯度消失。

但实际上,在计算机的科学计算中,同样存在一个很有趣的事情,使得很小的数在参与计算的过程中,并不起作用。这就是大数吃小数。

什么意思呢果你用一个超大的数,去加上一个很小的数,你会发现,结果和你的预期是不一致的。比如我有以下简单的C语言代码,一个超大数是 20000000,一个很小数是1,两个数相加。

你可能期望得到的结果是20000001,但是结果却依然是 20000000!

长文解析Resnet50的算法原理

很明显,小的数字 1 被大数20000000 吃掉了!你可以运行上述代码实际测试一下。

为什么会有大数吃小数这一现象呢/p>

这就跟数据在内存的存储格式有关了,感兴趣的同学可以查看IEEE754 标准的浮点数在内存中的表示。如果过去、现在或者未来,你发现你的程序出现了这种不可思议的错误,尤其是在你做好几万次加法循环的时候,不要怀疑出现了幻觉,也不要怀疑人类科技被智子锁死了,翻一翻计算机标准,你会豁然开朗的。

七、激活函数

上一章说到了Resnet网络的残差结构。也就是人们俗称的高速公路。看过图像识别(番外1)| AI算法攻城狮左手图纸,右手搬砖的真实性以及长图展示Resnet全貌和可视化CNN!的同学或许有印象,一层层搭建而成的神经网络,由卷积层、激活层、池化层等组成。而每一个卷积层的后面,都会跟着一个激活层。

在Resnet50中,激活函数用的是Relu激活函数。

那为什么在神经网络中,每一层卷积后面都需要跟着一个激活函数呢/p>

非线性

敲黑板,划重点,为了非线性。我们都学过线性关系,最简单的 y = kx + b,画出来就是一条直线。这个函数就是一个线性函数,称y 和 x 是线性关系。

长文解析Resnet50的算法原理

线性函数

如果这个时候,又有一个线性关系 z = hy + d,那么,可以通过如下的线性变换,得到变量 z 和 x 同样也是线性关系!

z= hy + d = h(kx+b) + d = hkx + hb + d = Ax + B其中:A = hk, B = hb + d。

所以,不管有多少个线性关系,只要在数学上首尾相连,最终都可以等效成一个线性关系!

而在深度学习任务中,如分类任务,具有线性关系的模型其分类效果是不好的,甚至是很差的。因为卷积算法是由大量的乘法和加法组成,所以,卷积算法也是线性的!这就导致,由大量卷积算法组成的卷积神经网络(CNN),如果没有非线性因素的引入,会退化成一个简单的线性模型。这就使得多层卷积失去了意义。

比如,Resnet50网络中的50层卷积,就会退化为一个卷积。而在神经网络中,使用多层卷积的一个重要目的,就是利用不同卷积核的大小,来抽取不同卷积核尺度下的图像特征。因此,在神经网络设计时,在每层的卷积后面,都增加一个非线性函数,就可以完成两个卷积层的线性隔离,确保每个卷积层完成自己的卷积任务。

目前常见的激活函数,主要有Sigmoid、tanh、Relu等。Resnet50中的激活函数就是Relu。

下面主要介绍下这三个函数。

sigmoid

长文解析Resnet50的算法原理

Sigmoid 函数的图像看起来像一个 S 形曲线。公式为:f(z)= 1/(1+ e^-z)

Sigmoid 在神经网络中使用,是有一些优点的,主要体现在:

  • Sigmoid函数的输出范围是 0 到 1。由于输出值限定在0 到 1,因此它对每个神经元的输出进行了归一化;
  • 用于将预测概率作为输出的模型。由于概率的取值范围是 0 到 1,因此Sigmoid 函数非常合适;
  • 梯度平滑,避免「跳跃」的输出值;
  • 函数是可微的。这意味着可以找到任意两个点的 sigmoid 曲线的斜率;
  • 明确的预测,即非常接近 1 或0;

tanh

长文解析Resnet50的算法原理

tanh激活函数的图像也是 S 形,tanh 是一个双曲正切函数。tanh 函数和sigmoid 函数的曲线相对相似。但是它比 sigmoid 函数更有一些优势。

长文解析Resnet50的算法原理

?sigmoid 函数和 tanh 函数对比

首先,当输入比较大或者比较小时,函数的输出几乎是平滑的并且梯度较小,这不利于权重更新。二者的区别在于输出间隔,tanh的输出间隔为 1,并且整个函数以 0 为中心,比sigmoid 函数更好;

在tanh 图中,负输入将被强映射为负,而零输入被映射为接近零。

Relu

长文解析Resnet50的算法原理

ReLU激活函数图像如上图所示,函数表达式如下:

长文解析Resnet50的算法原理

?

ReLU 函数是深度学习中较为流行的一种激活函数,相比于 sigmoid 函数和 tanh 函数,它具有如下优点:

  • 当输入为正时,不存在梯度饱和问题。
  • 计算速度快得多。ReLU 函数中只存在线性关系,因此它的计算速度比sigmoid 和 tanh 更快。

当然,它也有缺点:Dead ReLU 问题。当输入为负时,ReLU 完全失效,在正向传播过程中,这不是问题。有些区域很敏感,有些则不敏感。但是在反向传播过程中,如果输入负数,则梯度将完全为零,sigmoid函数和 tanh 函数也具有相同的问题;

我们发现ReLU 函数的输出为 0 或正数,这意味着 ReLU 函数不是以 0 为中心的函数。除了上面的3种激活函数之外,还有很多其他激活函数,比如Relu函数就有很多变种,如PRelu、LeakyRelu等。

每种激活函数,都在一种或几种特定的深度学习网络中有优势。判断一个激活函数的好与坏,绝不仅仅是从函数的数学表达式上来判断,而是需要在实际的深度学习网

来源:董董灿是个攻城狮

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年9月14日
下一篇 2022年9月14日

相关推荐