第一课:计算机视觉
受益于深度学习,计算机视觉是目前快速发展的领域之一,深度学习的计算机视觉现在能够帮助自动驾驶汽车判断周围的其他汽车和行人的位置以躲避它们。也使面部识别比以前任何时候都要好,面部解锁手机,打开门。展示风景、酒店和产品的公司正使用深度学习帮助你展示最具吸引力最美或最相关的图片,甚至产生了新的艺术形式。
深度学习的计算机视觉能吸引你们的原因有:
1.计算机视觉的急速发展能产生全新的应用
2.即使你最终没能亲身开发计算机视觉系统,但是创造力和创新精神在产生新的神经网络结构和算法方面实际上也启发了许多和其他领域的交叉
图像分类
目标检测
神经风格转换
挑战:输入可以任意大
1M大小的图片有三百万维的输入特征。所以如果第一个隐藏层你也许只有1000个隐藏单元,然后总共的权重 w1矩阵,将会变成一千乘以三百万维的矩阵,这个矩阵有三百万个参数,这是非常非常大的。有那么多的参数,很难获得足够的数据以避免神经网络过拟合。
同时,训练一个有三百万个参数的神经网络,对计算量和内存需求是不太可行的。
所以需要卷积运算!它是神经网络的基础之一。
用边缘检测作为例子来解释卷积。
第二课:用边缘检测的例子来解释卷积运算
卷积网络是神经网路的基础组成单元之一,通过边缘检测来学习卷积运算是如何进行的?
神经网络的前几层是如何检测边缘的?并且后几层可能会检测对象的某些部分,而更后的几层会检测到某些整个的对象。
举例:检测一张图片中物体是什么?
你做的第一件事可能是检测图片中的垂直边缘和水平边缘。
所以你怎么才能在像这样的图像中检测边缘呢?
灰度图像只有6x6x1的矩阵(没有分开的RGB通道),为了检测垂直边缘,你能做的是建立一个3x3的矩阵,在池化过程中用卷积神经网络中的专业术语来说在,这会被称为过滤器,有些科研论文中将它称为核而不是过滤器。
你需要做的是获得6x6的图像并求其卷积,卷积运算用*号代替。稍微有点遗憾的是这个星号在数学中是卷积的标准符号,但是在Python中表示乘法,所以这个星号是双重用法,即重复的符号。
这个卷积运算的乘积是一个4x4的矩阵,即4x4的图像。运算过程是把过滤器粘贴到你的原始图像的3x3区域上,然后计算元素积,然后把九个结果都加起来。把区域向右移动一步后,计算第二个元素值。
以此类推...
最终用3x3矩阵卷积6x6矩阵得到一个4x4的矩阵。这些都是多维的矩阵,左边的矩阵可以很容易地理解为一个图像,中间是过滤器,右边也是一个图像。这就是一个垂直边缘检测器。
提醒:如果你将这运用到编程语言中,大部分编程语言都会有一些不同的方法,而不是用一个星号去标记卷积。但是所有支持卷积的深度学习框架都会有一些函数实现这个卷积运算。
为什么这是在进行垂直边缘检测呢?
看另一个例子:
检测出来的边缘比较厚是因为我们在例子中用了一个很小的图像,如果你用一个1000x1000的图像,而不是一个6x6的图像,你会发现它能很好的检测出你图像中的垂直边缘。
最右边的明亮区域只是用输出图像的方式来表示有一个强垂直边缘正好在图像的中间。
一个垂直边缘是一个3x3的区域因为我们用的是3x3的过滤器,左边有亮像素,然后右边是暗像素。
卷积运算提供了一个方便的方法去弄清楚如何在图像中找到这些垂直边缘。
看完卷积运算的是如何工作以后,那么如何运用卷积运算?
第三课:更多的图像边缘检测
正边缘和负边缘的区别?即由亮变暗和由暗变亮的边缘过度。其他几种边缘检测器?以及如何让算法来学习边缘检测器而不是手动设置边缘检测器?
上一讲中的图像翻转以后会发生什么?
因为亮度变化是相反的,30也变成了-30。表明由暗变亮而不是由亮变暗的转换。如果你不在乎这个转换,你可以输出矩阵的绝对值。但是这个过滤器确实能够区分亮和暗的边界。
更多边界检测的例子:
3x3的过滤器同样能够检测水平的边界,其上方区域亮,下方区域暗。
可以检测出正边界和负边界。中间值10反映了过滤器捕捉到了左边正边界的一部分和右边负边界的一部分,因而混在一起从而得到介于两者之间的值。如果这是一个1000x1000的图片,虽然仍然是棋盘形式,但是就不会有这些元素为10的过渡区域。这些过渡值相对于图片的大小会非常小。
总而言之,不同的过滤器可以找到垂直和水平的边界。
事实上,这些3x3的垂直边界检测器,只是一个可能的选择,在计算机视觉文献中,对于哪些数字组合是最好的仍然存在很大的争议。
sobel过滤器:这个过滤器的优点在于它给中间行赋予了更大的权重,从而使它更加稳定。
scharr过滤器:这个过滤器有些其他的略微不同的性质。
上面的是垂直边界检测器,如果将上面这些矩阵旋转90度就可以得到水平边界检测器, 随着深度学习的发展,我们发现,如果你想要检测一些复杂图片的边界,可能并不需要计算机视觉的研究人员挑选出这9个矩阵元素。你可以把矩阵里的9个元素当做参数,通过反向传播来学习得到它们的数值。目标是获得这9个参数使得对6x6的图片,用这个3x3的过滤器进行卷积,能得到一个优良的边界检测器。
在后面的视频中可以看到,将这9个元素当做是参数学习,如果需要的话,反向传播可以选择学习得到比前述人们定义的过滤器更加善于捕捉你的数据的统计学特征的过滤器。
除了垂直和水平过滤器,同样能够学习去检测45度的边界,无论什么角度,通过将这个数字设置为参数,从数据中自动学习得到我们发现神经网络可以学习底层特征学习的很好,比如边界,甚至比计算机视觉研究人员所精心选择的更加稳定。
但是这些计算仍然是卷积运算,这使得反向传播可以学习任何所需的3x3的过滤器并应用到整个图片的任何位置,从而得到所需要检测的特征。无论是垂直边界,水平边界还是倾斜的边界,甚至是一些还没有名字的过滤器。
总之:
将这9个数字当做是参数去学习,是计算机视觉中一个有用的想法,后面看具体的细节,你将会学习如何利用反向传播学习这9个数字。
但我们需要看看基本的卷积运算的一些细节和变化。如何使用填充和不同的步幅?这两个是卷积神经网络的卷积底层架构非常重要的组成部分。
第四课:填充/补白
为了构建深层神经网络,一个你非常需要使用的对基本的卷积操作的改进是填充。
使用过滤器进行卷积运算的公式是:
如果你有一个nxn的图片并且想使用一个fxf的过滤器,这样输出的维度将会是(n-f+1)x(n-f+1)。
这其实有两个缺陷:
1.每一次你使用卷积操作,你的图像都会缩小,你做不了几次卷积,你的图片就会变得非常小。比如你有一个一百万的深度网络,如果每层都会缩小图片一点,这样一百层以后就会得到一个非常小的图片。
所以每次你想检测边界或者其他特征时,都会缩小你的图片,这就是一个缺陷。
2.图片角落或者边界上的像素,只会在输出中被使用一次,因为它只通过3x3过滤器一次,然而中间的像素则会被过滤很多次。
你丢失了许多图片上靠近边界的信息。
为了同时解决上述两个问题,你能做的就是使用卷积操作前,你可以填充图片,使用额外的边缘填充图片,在边界周围用一个1像素大小的额外边缘,所以你通过填充就可以保持图片的原始大小。
通常情况下,如果你使用0来填充,如果p是填充的数量,在这种情况下,p = 1,因为我们使用了一个1像素的额外边缘填充了一圈。这样输出就变成了(n+2p-f+1)x(n+2p-f+1),这样保持了原图片的大小。
这样做就可以大大降低之前的那种边界和角落信息被忽略的严重程度,并且我在这里展示了使用单个像素填充边缘的效果,如果你需要,可以使用两个像素进行边缘填充。
到底要填充多少?我们有两个常见的选择:
valid卷积和came卷积。
valid卷积:没有填充。你会得到一个(n-f+1)x(n-f+1)维度的输出。
另一个常见的填充选择:came卷积
意思是:你选择的填充将使得输出大小等于输入大小,即
p = (f-1)/2
所以当f是奇数时,这样通过选择填充的大小,你可以保证输入和输出的大小相同。
在计算机视觉领域,f基本上使用奇数,事实上几乎永远是奇数,很难看到偶数大小的计算机视觉使用的过滤器f。
f是奇数的两个原因:
1.如果f是偶数,你会需要一些不对称的填充,所以f是奇数,从而在图片四周产生相同维度的一个自然填充区域。
2.当你有一个奇数大小的过滤器,这样可以有一个中心位置,有时候在计算机视觉领域中,有一个特殊点是很好的,因为它可以称之为中心像素,这样你就可以描述你过滤器的位置。
如果阅读文献,会发现3x3最常见,此外还有一些5x5,7x7。事实上,有些时候我们会用到1x1过滤器和它的原理,这些奇数过滤器的使用是约定俗成的,我建议你也这么做。
你现在知道了如何使用填充卷积,为了指定你卷积操作的填充,你可以指定p的大小,或者你可以说这是一个valid卷积(p=0)抑或是came卷积(有足够的填充使得输出和输入相等)。
这就是填充,那么如何实现带步长的卷积?
第五课:带步长的卷积
带步长的卷积是在卷积神经网络中组成基础卷积模块的另一部分。
我们使用3X3过滤器对7X7的矩阵进行卷积得到一个3x3的输出。输入和输出的维度间关系可以用以下的方程表示:
如果你有一个nxn大小的图像,用一个fxf大小的过滤器对这个图像进行卷积,对图像使用p层填充,并假设步长为s,得到结果的维度为(n+2p-f)/s+1 x (n+2p-f)/s+1。
还有一个细节:
如果这个分数中,分子不能被分母整除得到整数怎么办?
这时我们可以向下取整,用大括号表示向下取整。floor[z]表示最接近z的小于z的整数。之所以这样做是因为当蓝色区域被像素或补充的元素填满时,得到的是正数。如果蓝色区域没有被图像或图像加填充部分覆盖,落在外部时,我们就不能进行计算。
这说明3x3过滤器必须全部落在原图像,或原图像加上填充的范围之内,形成了这样的约定。
之后,计算输出维度的正确做法是:如果(n+2p-f)/s不是整数的话,就向下取整。
总结一下维度的计算:
如果你有一个nxn的图像或矩阵,将其填充p层元素后,用fxf大小的过滤器,以步长为s的方式进行卷积,输出的矩阵大小为(n+2p-f)/s+1,我们可以选择这些数的数值,使结果为整数,即向下取整。
关于交叉相关和卷积的说明:
标准的书序课本对卷积的定义:其实是在做元素间相乘并求和之前,需要做一个另外的步骤,先将3x3过滤器沿水平轴进行翻转,同样地对竖直轴进行翻转,即对水平和竖直轴进行镜像映射,之后将其放到矩阵中,计算结果,之后移动步长,以此类推...
我们在本视频中讨论的卷积将翻转操作省略了,技术层面上来说,实际上我们在视频中进行的操作,应该是交叉相关,而不是卷积。但是在深度学习文献中,由于约定,我们将其称为卷积。
总结一下:在机器学习的约定中,我们通常忽略掉翻转的操作,技术上我们进行的操作应该被称为交叉相关。但是大多数的深度学习文献将其称为卷积,所以我们将延续这一约定。
事实上,在信号处理或其他数学分支领域,对卷积进行核翻转,会使卷积核保持:
这一性质在数学上叫做结合率。
这一性质在信号处理领域很有用,但对深度神经网络而言,它不重要,所以元素相乘并求和简化了代码。而且这一改变后,神经网络照常工作。
约定上,大部分人把这个叫做卷积,即使数学家喜欢称之为交叉相关。
因此,你已经看到了如何进行卷积,也看到了如何进行通过填充和跨步长进行卷积,但是现在我们看到的都是对矩阵进行卷积,如何对三维体积进行卷积?这会使卷积操作具有更加强大的魔力。
第七课:超量卷积
你们已经理解了卷积在二维图像中是如何工作的,那么对三维图像如何实现算法呢?
RGB图像是三张6x6图像的叠加,为了检测这个图像中图像边缘或一些图片中的其他特征,所以你现在应该使用的是一个三维过滤器,即过滤器本身将有对应的三层,分别对应红、蓝、绿三个通道。
6x6x3,第一个6代表图像的高度,第二个6代表图像的宽度,最后的3代表通道数目。过滤器有着类似的高度、宽度和通道数。并且图像中的通道数目必须与过滤器的通道数目相同,输出将会是一个4x4的图像,即4x4x1。
为了简化3x3的过滤器,而不是理解Wie矩阵的叠加,可以将过滤器画成三维立方体。为了计算这个卷积运算的结果,是将这个立方体复制到对应图像区域。
运算:
将过滤器三个通道中的数字分别与原图像三个通道中的数字相乘后求和,将这些数字相加后得到输出的第一个数字。移动方块,以此类推...
你用这些做了什么呢?
如果你想要检测图片中红色通道的边缘,那么就可以在红色通道上设置1 1 1 0 0 0 -1 -1 -1,然后在绿色通道和蓝色通道上全部设置为0,如果你是用这三层相叠加来获得你的3x3x3过滤器,那么这个过滤器就可以仅仅检测红色通道的垂直边缘。
或者如果你不介意一个垂直边缘属于哪个颜色,那么你可能想要一个过滤器,在三个通道上都设置为1 1 1 0 0 0 -1 -1 -1,你就会得到一个边缘检测器,能检测任何颜色的边缘,通过使用不同的参数,你可以从这个3x3x3的过滤器中得到不同特征的检测器。
通过计算机视觉领域,当你的输入有一个固定的高度和宽度和一个固定数量的通道数,那么你的过滤器可能会有不同的高度,和不同的宽度,但是有相同数量的通道。
理论上来说,我们可以有一个只负责红色通道的过滤器,或者一个只负责蓝色通道或绿色通道的过滤器,那么再一次的,你会注意到做一个体积的卷积时,用一个3x3x3来卷积6x6x3会得到一个4x4的结果,也是一个二维的输出。
现在你知道了如何在体积上做卷积,最后还有一个对于建立卷积神经网络非常重要的概念,那就是如果我们不仅仅想要检测垂直边缘呢?
如果我们想同时检测垂直边缘和水平边缘,又或者是4度和70度边缘,即如果你想要同时应用多个过滤器呢?
之前可能是一个垂直边缘检测器,或者是检测其他的什么特征,第二个是个水平边缘检测器,那么通过之前的第一个过滤器卷积运算,我们得到了第一个4x4的输出,然后用第二个卷机器就能得到一个不同的4x4的输出,我们可以把这两个不同的4x4的输出,把第一个放在前面,第二个放在后面,将这两个输出叠加到一起就可以得到一个4x4x2的输出体积。这里的2代表我们使用了两个不同的过滤器。
总结一下这里的维度:
如果你有nxnxn通道数量的输入图片,你用它来卷积一个fxfxn下标c,同样地通道数量,最后你会得到一个(n-f+1)x(n-f+1)xnc,这里的c是指过滤器的数量。
以上就是在立方体上做卷积的概念,实际上非常强大,其中一小部分作用在于你现在可以直接处理有三个通道的RGB图像,但是更重要的是,你现在可以检测两个特征,比如垂直、水平边缘或者10个,128个甚至几百个不同的特征,那么这个输出会是通道的数目,等于过滤器的数目。
这里有个需要注意的表达式,我一直在用你的通道数量作为最后一个维度,而在文献里人们经常称之为3D立方体的深度,这两种表达方式,无论是深度还是通道,都常出现在文献中,有时候也会说到神经网络的深度,所以视频中统一使用通道表示这三个维度的大小。
现在你知道了如何在立方体上做卷积,应该准备好应用卷积神经网络上其中一层了,具体怎么做呢?
第七课:卷积网络的一层
准备好来构建单层卷积神经网络。
之前我们已经提过如何应用两个不同的过滤器,对三维输入进行卷积计算。最终我们需要把这些输出变成单层卷积神经网络,还需要对每一个输出添加一个偏差(bias),这里的偏差是一个实数,这里使用广播机制,我们对16个元素添加同样的偏差,然后我们可以继续添加一些非线性转换ReLu,最终,通过添加偏差和非线性转换,我们得到一个4x4矩阵输出,最后我们把这两个输出放到一起,就计算得到了一个4x4x2的输出。
这就是卷积神经网络的一层。
现在我们把这个例子和非卷积单层前向传播神经网络对应起来,在神经网络传播之前我们需要做:
求解z[l]
利用激活函数求解a[l]
这里把原始图像当做a[0],过滤器的效果和w[l]类似,这里通过卷积计算得到4x4x2的矩阵的过程就和之前w[1]xa[0]类似,输出也是4x4矩阵。另外就是添加偏差值,它的作用和z类似。最后通过非线性方程得到最后的输出。这里的输出就是下一层神经网络的激活函数。
以上就是从a[0]得到a[1]的操作:首先是线性计算,然后进行卷积,然后再相乘。因此卷积计算其实就是应用线性操作计算,再添加偏差,再通过ReLu操作,使得从a[0]即6x6x3的输入,经过一层神经网络的传播得到4x4x2的输出,也就是a[1]。
这就是一层神经网络。
在这个例子中,我们有两个过滤器,也就是有两个特征,因此得到的输出也是4x4x2,但如果我们有10个过滤器而不是两个,那么我们的输出就是4x4x10,因为这里需要10个这样的操作,然后把结果放到一起,得到一个4x4x10的a[1]输出。
看一个练习:假如你的单层神经网络中有10个而不是2个3x3的过滤器,这层网络中有几个参数?
每个过滤器都是3x3x3的三维矩阵,因此每个过滤器有27个参数,也就是有27个数字需要进行训练学习得到,还有一个参数b,也就是有28个参数。
对于10个过滤器,28*10 = 280个参数。
注意这里:一个很好的特性就是:不管输入的图像有多大,比方1000x1000,5000x5000,这里的参数个数都不会改变。因此用10个过滤器来检测一个图片的不同特征,比方垂直边缘线,水平边缘线或者其他特征,不管图片多大,所有的参数个数都是一样的。
这个特征使得卷积神经网络不太容易过拟合。
因此,比方你训练学习得到10个特征检测器(函数),你可以把它们应用到非常大的图像(特征检测)中,所用的参数数目是不变的,比如这里的280个参数,相比于图片大小是非常小的,
现在我们来总结回顾一下:
用来在卷积神经网络中描述一层网络的(形式化表示的)符号标记:
1.f[l]表示过滤器矩阵维度的大小,这是一个l层大小的fxf的过滤器,这里的l表示当前层
2.p[l]表示填充的大小,填充的大小也可以通过不同的卷积名称来定义,比如valid填充——没有填充,Same填充——应用的填充大小会使得输出结果大小和输入拥有相同的维度大小。
3.s[l]表示步长大小
4.这一层的输入,是一个多维矩阵,也就是一个n x n x nc(上一层的通道数目)我们改变表示方法为(因为这个来自于上一层的激活函数):
n[l-1] x n[l-1] x nc[l-1]。
目前为止我们的图像都是长宽想等的,对于长宽不等的图像,我们表示为:
n[l-1]h x n[l-1]w x nc[l-1]
这里的h和w表示上一层输入图像的长和宽。因此l层的矩阵大小是:
nh * nw * nc
这是第l层的情况,这一层的输入是上一层的输出,就变为l-1。
5.这一层神经网络的输出为:
n[l]h x n[l]w x nc[l]
这里输出的大小的长和宽是由公式:
(n+2p-f)/s + 1决定的,结果如果不是整数的话,向下取整。
输出矩阵的长和宽的计算公式:
这就是如何从nh[l-1]到nh[l],和从nw[l-1]到nw[l],那么通道数目怎么得到呢?
6.nc[l]表示输出中的通道数目
我们可以看一下输出维度的深度,通道数目的大小是和过滤器数目一样的,比方我们有2个过滤器,那么我们的输出就是4x4x2,是二维的,如果过滤器的数目是10个,我们的输出就是4x4x10。因此输出的通道数目就是我们这一层神经网络所用的过滤器的数目。
7.每个过滤器的大小是f[l] x f[l] x nc[l-1](过滤器的通道数目)(应该和输入的通道数目相同)
8.最后通过非线性计算,这一层的输出,就是这一层的激活函数a[l],即n[l]h x n[l]w x nc[l],如果你使用向量化实现,或者批量梯度下降,或者是小批量梯度下降,那么就会得到:
A[l] = m * n[l]h x n[l]w x nc[l]
这就是你需要使用的变量的(梯度下降)顺序:首先告诉我们训练数据的大小,然后分别加入三个变量。
9.权重矩阵w:我们已经知道过滤器的维度,即f[l] x f[l] x nc[l-1],但这只是一个过滤器的维度,我们需要多少过滤器呢?
所有过滤器的权重的维度就是所有的过滤器的大小总和,因为最后的数字大小是l层神经网络中过滤器的数亩大小,所以w的维度是:
f[l] x f[l] x nc[l-1] x nc[l]
10.最后,每个过滤器加上一个偏差,即加上一个实数,因此偏差参数有nc[l]大小的向量,它会减去一个更为方便的偏差系数编码(1, 1, 1,nc[l])。
这样的四维矩阵,也称为4维tensor。
这些都是本课程会用到的参数和符号,其实在一个常见框架中,会有一个参数来设置在矩阵的索引中,是要把通道数目放在最开始还是最后面。
我觉得这些情况都合理,只要你使用的时候保持前后一致。
本节课中,都会保持高和宽两个维度放在前面,通道维度放到最后。
把重点放在单层卷积神经网络和神经网络工作原理以及在这层中激活函数的计算,还有怎么把激活函数应用到下一层。
现在你知道了单层卷积神经网络怎么工作,下一步我们联合几层神经网络,来讨论深度卷积神经网络。
第八课:简单的卷积网络示例
ConvNet中的一个卷积层。现在我们来研究一个深度卷积神经网络的实例。
假如你有一张图片,并且你想做图片分类,或图像识别,例如输入一张图像x,判断是不是一只猫。假设这个图像的大小为39x39x3。
因此第0层中的nh和nw都是39,通道数为3,假设第一层用3x3过滤器,使用步长为1,不使用填充,使用相同的卷积,用10个过滤器,那么神经网络下一层的激活数就是:37x37x10,37来自于公式(n + 2p- f)/s +1,10来自于10个过滤器,这是一个有效的卷积,得到nh[1] = nw[1] = 37,nc[1] = 10,nc[1]同时也等于第一层的过滤器的数量,这就是第一层的激活的维度a[1]。
假设你现在有另一个卷积层,而且假设你现在使用5x5的过滤器,以2为步长,没有填充,20个过滤器,那么神经网络下一层的激活数就是:17x17x20,因为采用2为步长,维度收缩的更快,得到这里的激活的维度a[2]。
再加上最后一个卷积层,a[3]。
所以你现在做的就是把一个39x39x3的输入图像,计算出此图像的7x7x40特征。
最后,通常会做的是,如果你把这个7x7x40,把这些特征展开为1960个单元,扁平化为一个向量,然后将其输入到一个逻辑回归或softmax单元,取决于你是在试图识别有猫/无猫的二元分类还是试图识别任意的k种东西的多元分类,这就会给神经网络的最终预测输出。
所以要清楚,最后一步只是采取这些数字,1960个数字,并把它们展开为一个非常长的矢量,你可以输入到softmax直到它能做出最终预测输出的一个回归。
以上就是一个非常典型的ConvNet的例子。
卷积神经网络设计中的很多工作是选择像这样的超参数总单元数是多少?步长是多少?填充是多少?或者使用了多少过滤器?如何做出这些选择和指导方针是什么?
但是就目前而言,我们要记住的一件事就是:随着你建立的神经网络越来越深,通常你的输入图像都很大,但是随着你在神经网络中的深入,图像大小逐渐变小,此例中从39变成37到17到7等,而通道的数目一般会增加,此例中从3到10到20到40。
你会在其他卷积神经网络中看到这样的一种常见的趋势。
事实证明在一个典型的ConvNet中,通常有三种类型的层。
1.卷积层,通常我们会将其表示为一个Conv层
还有两种常见的层类型:
2.池层,通常会直接称为池
3.完全联通的层,FC
虽然我们可能只是使用卷积层来设计一个相当好的神经网络,大多数神经网络架构也将有几个池层和几个完全连接层。
幸运的是,池层和完全连接层要比卷积层简单一些。
下节课介绍来让你对卷积神经网络中的所有常见的层都有一个感觉。你将会构建比我们刚刚展示的更强大的神经网络。
如何实现一个池层?
第九课:池层
除了卷积层以外,ConvNet通常还会使用池化层来减少展示量,一次来提高计算速度,并使一些特征的检测功能更强大。
池化的例子(max pooling)之最大池化:
实现方法很简单:将原始图像的区域赋予不同的颜色后,然后将每个输出值对应于颜色区域的最大值。
这就如同你使用了一个大小为2的过滤器,因为你选取了一个2x2的区域,并且使用步长为2,这些实际上是最大池化的超参数。
最大池化背后的机制:
如果你把原始图像的大小看作是某个特征的集合,即神经网络某个层中的激活状态,那么一个大的数字意味着它或许检测到了一个特定的特征,它或许是一个垂直的边缘...。
所以最大池化做的是:检测所有地方的特征,四个特征中的一个被保留在最大池化的输出中。即如果在滤波器中任何地方检测到了这些特征,就保留最大的数值,但是如果这个特征没有检测到,可能这个区域内没有这个特征,因为那些数值的最大值仍然相当小。
但是不得不承认:人们选择使用最大池化,是因为在很多实验中发现它的效果很好。
最大池化有一个有趣的特性:它有一套超参数,但是它没有任何参数需要学习,实际上没有任何需要梯度相加算法学习的东西,一旦确定了f和s,就确定了计算,而且梯度下降算法不会对其有任何改变。
看一个有某些不同超参的例子:
我们之前用来计算卷积层输出大小的公式在最大池化中仍然适用,(n + 2p -f)/s +1,这个公式仍然可以用于计算最大池化的输出大小。
以上是二维输入的最大池化输出,如果对于一个三维输入,则输出会具有同样的维数。并且计算最大值采样的方法是使用我们刚刚描述的每个通道的计算过程,即在不同的层上进行最大化取值操作。
总结:最大值采样计算是在这些nc个通道上独立进行的。
还有一类并非经常使用的采样:均值采样。
均值采样所做的不是在每个滤波器中取最大值,而是取其平均值。
目前最大值采样的使用通常比均值采样更多,唯一的例外是有时候深度非常大的神经网络,你可以采用均值采样来合并表示。
总结一下:
1.采样的超参是滤波器的大小f(常用值2,可以近似地把高度和宽度缩小两倍以上)
2.步长s(常用值2)
3.其他的超参就像一个二进制位元,指示你是使用最大值采样还是均值采样
4.如果你愿意有一个罕见的超参:填充(极少使用,有一个例外),对于最大值采样的绝大多数部分,是不进行任何填充。
5.最大值采样的输入是:大小为nh * nw * nc的体数据,它会输出一个如下所述大小的体数据[(nh-f)/s+1] x [(nh-f)/s+1] x nc,这里输入通道的数量等于输出通道的数量,因为采样是独立的应用到每一个通道。
6.一个值得注意的是:它没有需要学习的参数,所以在实现剪切的时候,没有参数需要通过最大值采样进行调整,反而是上面的超参需要你设定一次,或许是人工设定或者使用交叉检验,它就是一个神经网络在其中一层计算的确定函数。
现在你知道了如何建立卷几层和采样层,让我们接下来看一个更复杂的卷积网络的例子,这个例子会引入全连接层。
第十课:CNN例子
你现在已经了解了用于创建一个完整的卷积神经网络的构件,看一个例子:
例如你有一个32*32 RGB图像,要尝试识别图像中是0-9中10个数字中的哪一个是7?
这里是用的神经网络的算法是一种和它非常相似的经典的神经网络的启发,称作LeNet-5,这里要展示的很多和LeNet-5不完全一样,但其中许多参数的选择是受它启发的。
将原始图像经过过滤器得到conv 1,那么用了6个过滤器,加上偏差值,再应用非线性,或许ReLu非线性,得到了卷积层一的输出28286,接下来使用一个池化层,最大池化参数为f = 2, s = 2,没有填充,得到14146,我们把这层称为池1输出。
事实上在卷积网络中有两种关于层的说法:
1.将conv 1和池层1两个单元称为神经网络的第一层
2.卷积层为一层,池化层单独称为一层
神经网络中当人们说到网络层数的时候,通常指那些有权重,有参数的网络层数量,因为池化层没有权重,没有参数,只有一些超参数,我会使用卷积层和池化层为一层的说法。
并且Conv 1和Pool 1名字末尾是1,也表明了我认为两者都是神经网络层一的组成部分。
接下来,在14146的基础上,再做一次卷积,这次使用55的过滤器,步长为1,共10个过滤器,那现在你会得到一个101010的单元,称为卷积层二,继续最大池化,f = 2,s = 2,得到55*10大小的池化层2,即可得到神经网络层二。
现在我们把池化层二展开为一个400*1的向量,把它想象成为一组展开的神经元。
接下来我们要做的是用这400个单元做输入,创建一个有120个单元的下一层,这实际上是我们第一个全连接网络层,称之为FC3,因为这400个输入单元和120个输出单元密集的相连,因此这个全连接层和你之前见到的网络神经层一样,这不过是一个标准的神经网络,其中被称为w[3]的权重矩阵大小为120*400,因为400个输入中的每一个单元都和120个输出的每一个单元相连。
所以被称为全连接网,并且这里还有个偏差参数,大小也将是120的向量,因为有120个输出。
最后一步,让我们在120的单元的基础上再加一层,这次让它变得更小,假设我们84个单元最终。我将它称为全连接网络层4,即FC4,最终我们获得了可以用于softmax层的84个实数。
如果你尝试做手写识别,那将是一个有着10个输出的softmax层。
以上就是一个相对典型的展示了一个卷积神经网络的大致构成。其中的超参数选取的原则之后讨论,一个常用的法则实际上是不要试着创造你自己的超参数组,而是看文献,看别人使用的超参数,从中选取一组可能适用于你的超参数。
目前我只想指出:经常随着神经网络的深入,高度nh和宽度nw会减小,从3232变成2020到1414再到1010,最终为5*5,因此当你深入下去通常宽度和高度都会变小,然而通道数量会增加,从3到6最后是全连接网络层。
另一种常见的神经网络模型是:
一个或多个卷积网络层接着一层池化层,再接着一个或多个卷积层叠加一层池化层,然后叠加几层全连接层,也许最后还叠加一个Softmax层,如上所述的就是一个常见的神经网络模型。
回顾一下神经网络的一些细节:
如激活输入的尺寸,大小和网络参数数量...
分析得到:
首先最大池化层是没有任何参数的
其次,注意卷积层趋向于拥有越来越少的参数
实际上,多数参数在神经网络的全连接层上
同时,随着神经网络的深入,你也会发现激活输入的大小也逐渐变小,如果减少的太快,通常也不利于网络性能。
你会发现许多卷积神经网络有着与此相似的特性和模式。
你已经了解了神经网络的基本构件:卷积神经网络、卷积层、池化层和全连接层,如何利用这些基本构件构造一个有用的神经网络?
把这些构件组合到一起实际上需要相当的洞察力,我认为最好的办法就是去学习一定数量的实例,看看人家是如何做的?从中获得灵感如何把这些构件组合到一起。
既然给出了一些实例,你就可以直接在自己的应用程序中使用别人已经开发的架构。
为什么要用卷积,它的优缺点是什么?以及如何把它们组合到一起?如何通过训练集来训练一个神经网络。
第十一课:为什么要进行卷积?
为什么把卷积放在神经网络中会如此有用?如何把卷积和神经网络结合在一起?如果你有一个带有标签的训练数据集,如何用它来训练这个卷积神经网络?
卷积层和只用完全连接的神经层相比有两大优势:
参数共享和连接的稀疏性
例如你有一个32323的图片,加上6个5*5的过滤器,得到一个28x28x6的输出结果。
所以,如果你是创建一个一层有3072个单元的神经网络,下一层是4704个单元,然后你连接每一个这些神经元,接着是权重矩阵,这些参数的权重矩阵是3072*4704,结果约是1400万个,这样就有很多参数需要训练。
当然如今你可以训练比1400万更多的参数的神经网络,但是考虑到这仅仅是一个很小的图像,却有如此多的参数需要训练,如果有一个1000x1000的图像,这个权重矩阵会变的更大。
但是如果你看这个卷积层的参数总数:每个过滤器有25个参数,加上每个过滤器的偏置参数有26个参数,你有6个过滤器,所以相乘后就得到156个参数,所以这个卷积层的参数总数仍然很少。
卷积神经网络参数较少的原因有两个:
1.参数共享。参数共享是源于在特征检测器中,例如垂直边缘检测对于图像的一部分是有用的,那么对于另一部分可能也是有用的,这意味着,如果你用一个3x3过滤器来检测垂直边缘,那么你就可以用这个3x3过滤器一直过滤下去,对于所有的这些特征检测器,所有的输出结果在你的输入图像许多不同的位置使用相同的参数。即检测比如说垂直边缘或者其他的一些特征,我认为这对简单的特征例如边缘,以及更高层次的特征,比如检测眼睛、脸、猫、或者其他东西都是可以的。
共享参数在这个例子中用相同的参数来计算所有16个输出结果,是减少参数个数的方法之一。如果你有 一个数据集,在左上角和右下角有不同的分布,这两块也许看上去不同,但是它们已经足够相似,它们已经可以使用相同的特征探测器,效果是一样的。
2.卷积神经网络避免只有相对较少的参数方法是建立稀疏的联系。
每一个输出值的特征输出值只和9个特征输入值相连,其他像素格子不会影响到这个输出值。
因此,通过这两个机制,一个只有很少的参数神经网络,可以用少于30个单元的训练数据集来训练。
有时,卷积神经网络会被用来捕捉平移不变,卷积结构可以帮助神经网络编译,即使图片平移,同样还会产生相似的特征。
平移之前和平移之后的图层就会帮助神经网络自然而然地学会更稳定或者更佳的捕捉到平移不变所需要的特性。
以上就是卷积神经网络在计算机视觉中表现比较好的原因。
最后,综上所述,看看如何训练一个卷积神经网络?
猫探测器:
x:一个图像
y:二进制标签
选择卷积神经网络,插入图像,神经卷积,池化层,全连接层...输出y帽
卷积神经网络层和完全连接层将有各种参数w和偏差b,所以任何参数的设置,让你定义一个类似于我们之前看到的代价函数。
我们随机初始化w和b的参数,你可以计算J的值,作为整个训练集的神经网络预测损失的总和。
训练神经网络:使用梯度下降或者一些类似的算法,比如梯度下降动量法,RMSprop、Adam或者其他算法,为了优化所有的神经网络参数,来试图降低代价函数J,这样你就会发现,你建立起了一个非常有效的猫探测器或其他检测器。
你现在已经看到了卷积神经网络的所有基本组成构件,以及如何将它们组成一个有效的图像识别系统。
卷积神经网络中的超参数设置?
通过一些具体的例子和一些最有效的卷积神经网络,这样你就可以从中识别到规律,知道哪些类型的网络体系结构是有效的。人们经常做的一件事就是:利用其他人已经发现并发表的研究论文的框架,拿到自己的应用程序中使用。
我们还学到了卷积神经网络高效的背后机制,然后在余下的课程中,我们还将看到其他计算机视觉应用,比如对象检测和神经存储传输,它们如何被用来创建新的艺术品?