卷积神经网络——卷积神经网络基础

背景:计算机视觉是一个包含很广泛的领域,包含了日常生活中所有可视化的1维,2维,3维数据,例如心跳脉冲的检测(1维),目标检测、人脸识别(2维),3维场景重建、虚拟现实(3维)等,但是处理这些数据时往往需要巨大的内存需求(下面会详细的说明),普通的神经网络无法满足,因此卷积神经网络应运而生。

首先图片是计算机视觉中最重要的也是发展最快的领域,下面就从图片入手深入的讲解卷积神经网络。

图片介绍:人类可以看到的不同的颜色是因为人的眼睛就像一个三色接收器的体系,而大多数的颜色可以通过红、绿、蓝三色按照不同的比例合成产生。为什么是三种颜色,不是七种颜色?这里我们就不得不提一个耳熟能详的名字——牛顿(How old are you怎么老是你),牛顿通过三菱镜首先发明了自然光可以分解为不同颜色的七彩色光,伟人的思想往往是与众不同的,他们往往不会止步不前,继续思考 他在想既然自然光可以分解,那么七彩色光是不是也可以被分解或者合成呢? 

顺着这个思路他又经过了无数个昼夜不停的实验和计算,(至于怎么实验的感兴趣的可以自己搜索)终于真理又让他发明了,在七彩色光中只有红、绿、蓝三种颜色不能够再继续分解,不能分解也就是原子的这点和事务的特性一样,所以称其为三原色,其它的光可以通过这三种光来组合叠加和相减算出来。

三原色在应用于实际生活中时既可以相加,也可以相减,采用相加的方式成为RGB颜色模型(红、绿、蓝)和CMY模式(品红、青色、淡黄),也是用的最多的一种,相减为CMYK模型,他们分别用于绘图和印刷领域。 如今在我们电脑上大部分的图片都是以jpg、jpeg(有损压缩,体积小)或者png(无损压缩)格式存储的,其中它们都支持RGB、CMYK和灰度模式。通常情况下,RGB每个颜色各有256级亮度,用数字表示为从0、1、2...直到255。 按照计算,256级的RGB色彩总共能组合出约1678万种色彩,即256×256×256=16777216。 通常也被简称为1600万色或千万色。也称为24位色(2的24次方)。这24位色还有一种较为怪异的称呼是8位通道色,为什么这样称呼呢? 这里的所谓通道,实际上就是指三种色光各自的亮度范围,我们知道其范围是256,256是2的8次方,就称为8位通道色。 

一张图片在屏幕上面如果无限缩小会看到是由无数个点组成的,其实任何事物都是由无限到有限来组成,无数个点会组成一个平面,当点和点之间的间距足够小时我们的肉眼是分不出来的,我们看到的就是一个图像,当无限个图像从我们眼前闪过就会形成视频电影,他们都是一个道理,好比几何中的点组成线、线组成面、面组成立体空间,当分析到这一层次图像识别就显着处理简单了,只要让计算机计算组成图片的无数个点的特征就可以识别出来相似图片,当然这也依赖于强大的运算能力,因为像素高的大图是非常大的,如常见笔记本电脑像素,有1366*768个像素点,数量级别在百万级,况且以RGB模式来说有三个通道颜色 将会更大。

ok,啰啰嗦嗦这么多(小白一个大家多多见谅),回到正题。

图像处理面临的挑战:如果我们对一张图片进行深度学习,图片的格式是(64,64,3)的RGB格式(3是通道数也就是红绿蓝),我们为了方便计算将需要将其flatten得到一维数据64\times64\times3=12288,所以输入层特征向量x的维度也就是12288。但是64\times64的图片实在太小,如果要操作更大的清晰度更高的图片,比如1366*768的图片,特征向量X^(^1^)的维度就达到了惊人的3147264(大约三百万),对于全连接的神经网络来说如果第一层hidden layer的hidden units数量是1000,也就是权值矩阵W^[^1^]的大小就需要达到1000\times3百万(大约30亿个参数)。在参数如此巨大的情况下,难以获得足够的数据来防止神经网络发生过拟合和竞争需求,要处理包含30亿参数的神经网络,巨大的内存需求让人不太能接受。所以就需要使用卷积神经网络来减少参数。

要学习卷积神经网络就要知道卷积神经网络每层都做了什么,下面就由浅入深的理解卷积神经网络是如何运算的。

边缘检测示例:卷积运算是卷积神经网络最基本的组成部分,使用边缘检测作为入门样例。下面就来看看卷积是如何进行运算的。下图展示了卷积神经网络如何一层一层的检测到完整的物体

首先神经网络的前几层找到了像图片1这样的边缘或者线,然后后面的几层有可能检测到物体的部分区域,更靠后的一些层可能检测到完整的物体,这个人脸识别例子中首先检测到图片的边缘,然后的检测到更复杂的形状和模式比如眼睛鼻子,之后检测到人脸的大部分轮廓。就像素描中由简单的一笔一划最后完成复杂的图画。那神经网络又是如何做到这一切的?

让我们举个更加直观的例子,给了这样一张图片,让电脑去搞清楚这张照片里有什么物体,你可能做的第一件事是检测图片中的垂直边缘。比如说,在这张图片中的栏杆(红线)就对应垂直线,与此同时,这些行人的轮廓线某种程度上也是垂线,这些线是垂直边缘检测器的输出。同样,你可能也想检测水平边缘,比如说这些栏杆(绿线)就是很明显的水平线,它们也能被检测到,所以如何在图像中检测这些边缘?

例如在一个6\times6的灰度图像(灰度图像是6\times6\times1矩阵,区别与n_c\timesn_c\times3的RGB三通道)。为了检测图像中的垂直边缘,你可以构造一个3×3矩阵。在卷积神经网络的术语中,它被称为filter(过滤器)。我要构造一个3×3的fiilter,像这样。

更进一步的边缘检测:上文已经见识到用卷积运算实现垂直边缘检测,在本视频中,你将学习如何区分正边和负边,这实际就是由亮到暗与由暗到亮的区别,也就是边缘的过渡。

还是上一个视频中的例子,这张6×6的图片,左边较亮,而右边较暗,将它与垂直边缘检测滤波器进行卷积,检测结果就显示在了右边这幅图的中间部分。

现在这幅图有什么变化呢?它的颜色被翻转了,变成了左边比较暗,而右边比较亮。现在亮度为10的点跑到了右边,为0的点则跑到了左边。如果你用它与相同的过滤器进行卷积,最后得到的图中间会是-30,而不是30。如果你将矩阵转换为图片,就会是该矩阵下面图片的样子。现在中间的过渡部分被翻转了,之前的30翻转成了-30,表明是由暗向亮过渡,而不是由亮向暗过渡。

如果你不在乎这两者的区别,你可以取出矩阵的绝对值。但这个特定的过滤器确实可以为我们区分这两种明暗变化的区别。

再来看看更多的边缘检测的例子,我们已经见过这个3×3的过滤器,它可以检测出垂直的边缘。所以,看到右边这个过滤器,我想你应该猜出来了,它能让你检测出水平的边缘。提醒一下,一个垂直边缘过滤器是一个3×3的区域,它的左边相对较亮,而右边相对较暗。相似的,右边这个水平边缘过滤器也是一个3×3的区域,它的上边相对较亮,而下方相对较暗。

 

再举个例子,这里的30(右边矩阵中绿色方框标记元素)代表了左边这块3×3的区域(左边矩阵绿色方框标记部分),这块区域确实是上边比较亮,而下边比较暗的,所以它在这里发现了一条正边缘。而这里的-30(右边矩阵中紫色方框标记元素)又代表了左边另一块区域(左边矩阵紫色方框标记部分),这块区域确实是底部比较亮,而上边则比较暗,所以在这里它是一条负边。

总而言之,通过使用不同的过滤器,你可以找出垂直的或是水平的边缘。但事实上,对于这个3×3的过滤器来说,我们使用了其中的一种数字组合\begin{bmatrix} 1&1 &1 \\ 0& 0 &0 \\ -1&-1 &-1 \end{bmatrix}或者\begin{bmatrix} 1 &0 &-1 \\ 1& 0 & -1\\ 1& 0 & -1 \end{bmatrix}。但在历史上,在计算机视觉的文献中,曾公平地争论过怎样的数字组合才是最好的,所以你还可以使用这种:\begin{bmatrix} 1 &0 &-1 \\ 2&0 &-2 \\ 1&0 &-1 \end{bmatrix},叫做Sobel的过滤器,它的优点在于增加了中间一行元素的权重,这使得结果的鲁棒性会更高一些。

但计算机视觉的研究者们也会经常使用其他的数字组合,比如这种:\begin{bmatrix} 3 &0 &-3 \\ 10&0 &-10 \\ 3&0 &-3 \end{bmatrix},这叫做Scharr过滤器,它有着和之前完全不同的特性,实际上也是一种垂直边缘检测,如果你将其翻转90度,你就能得到对应水平边缘检测。随着深度学习的发展,我们学习的其中一件事就是当你真正想去检测出复杂图像的边缘,你不一定要去使用那些研究者们所选择的这九个数字,但你可以从中获益匪浅。把这矩阵中的9个数字当成9个参数,并且在之后你可以学习使用反向传播算法,其目标就是去理解这9个参数.

当你得到左边这个6×6的图片,将其与这个3×3的过滤器进行卷积,将会得到一个出色的边缘检测。这就是你在下节视频中将会看到的,把这9个数字当成参数的过滤器,通过反向传播,你可以学习这种的过滤器\begin{bmatrix} 1 &0 &-1 \\ 1& 0 & -1\\ 1& 0 & -1 \end{bmatrix},或者Sobel过滤器和Scharr过滤器。还有另一种过滤器,这种过滤器对于数据的捕捉能力甚至可以胜过任何之前这些手写的过滤器。相比这种单纯的垂直边缘和水平边缘,它可以检测出45°或70°或73°,甚至是任何角度的边缘。所以将矩阵的所有数字都设置为参数,通过数据反馈,让神经网络自动去学习它们,我们会发现神经网络可以学习一些低级的特征,例如这些边缘的特征。尽管比起那些研究者们,我们要更费劲一些,但确实可以动手写出这些东西。不过构成这些计算的基础依然是卷积运算,使得反向传播算法能够让神经网络学习任何它所需要的3×3的过滤器,并在整幅图片上去应用它,不管是垂直的边缘,水平的边缘,还有其他奇怪角度的边缘,甚至是其它的连名字都没有的过滤器。

Padding:

为了构建深度神经网络,你需要学会使用的一个基本的卷积操作就是padding,让我们来看看它是如何工作的。

我们在之前讲到的,如果你用一个3×3的过滤器卷积一个6×6的图像,你最后会得到一个4×4的输出,也就是一个4×4矩阵。那是因为你的3×3过滤器在6×6矩阵中,只可能有4×4种可能的位置。这背后的数学解释是,如果我们有一个n×n的图像,用f×f的过滤器做卷积,那么输出的维度就是(n-f+1)×(n-f+1)。在这个例子里是6-3+1=4,因此得到了一个4×4的输出。

这样的话会有两个缺点,第一个缺点是每次做卷积操作,你的图像就会缩小,从6×6缩小到4×4,你可能做了几次之后,你的图像就会变得很小了,可能会缩小到只有1×1的大小。你可不想让你的图像在每次识别边缘或其他特征时都缩小,这就是第一个缺点。

第二个缺点时,如果你注意角落边缘的像素,这个像素点(绿色阴影标记)只被一个输出所触碰或者使用,因为它位于这个3×3的区域的一角。但如果是在中间的像素点,比如这个(红色方框标记),就会有许多3×3的区域与之重叠。所以那些在角落或者边缘区域的像素点在输出中采用较少,意味着你丢掉了图像边缘位置的许多信息。

为了解决这两个问题,一是输出缩小。当我们建立深度神经网络时,你就会知道你为什么不希望每进行一步操作图像都会缩小。比如当你有100层深层的网络,如果图像每经过一层都缩小的话,经过100层网络后,你就会得到一个很小的图像,所以这是个问题。另一个问题是图像边缘的大部分信息都丢失了。

为了解决这些问题,你可以在卷积操作之前填充这幅图像。在这个案例中,你可以沿着图像边缘再填充一层像素。如果你这样操作了,那么6×6的图像就被你填充成了一个8×8的图像。如果你用3×3的图像对这个8×8的图像卷积,你得到的输出就不是4×4的,而是6×6的图像,你就得到了一个尺寸和原始图像6×6的图像。习惯上,你可以用0去填充,如果是p填充的数量,在这个案例中,p=1,因为我们在周围都填充了一个像素点,输出也就变成了(n+2p-f+1)×(n+2p-f+1),所以就变成了(6+2-3+1)×(6+2-3+1)=6×6,和输入的图像一样大。这个涂绿的像素点(左边矩阵)影响了输出中的这些格子(右边矩阵)。这样一来,丢失信息或者更准确来说角落或图像边缘的信息发挥的作用较小的这一缺点就被削弱了。

刚才我已经展示过用一个像素点来填充边缘,如果你想的话,也可以填充两个像素点,也就是说在这里填充一层。实际上你还可以填充更多像素。我这里画的这种情况,填充后p=2。

至于选择填充多少像素,通常有两个选择,分别叫做Valid卷积和Same卷积。

Valid卷积意味着不填充,这样的话,如果你有一个的n×n图像,用一个f×f的过滤器卷积,它将会给你一个(n-f+1)×(n-f+1)维的输出。这类似于我们在前面的视频中展示的例子,有一个6×6的图像,通过一个3×3的过滤器,得到一个4×4的输出。

另一个经常被用到的填充方法叫做Same卷积,那意味你填充后,你的输出大小和输入大小是一样的。根据这个公式(n-f+1),当你填充个p像素点,n就变成了n+2p ,最后公式变为(n+2p-f+1)。因此如果你有一个n×n的图像,用个p像素填充边缘,输出的大小就是这样的(n+2p-f+1)×(n+2p-f+1)。如果你想让(n+2p-f+1)=n的话,使得输出和输入大小相等,如果你用这个等式求解p,那么p=(f-1)/2。所以当f是一个奇数的时候,只要选择相应的填充尺寸,你就能确保得到和输入相同尺寸的输出。这也是为什么前面的例子,当过滤器是3×3时,和上一张幻灯片的例子一样,使得输出尺寸等于输入尺寸,所需要的填充是(3-1)/2,也就是1个像素。另一个例子,当你的过滤器是5×5,如果f=5,然后代入那个式子,你就会发现需要2层填充使得输出和输入一样大,这是过滤器5×5的情况。

习惯上,计算机视觉中,f通常是奇数,甚至可能都是这样。你很少看到一个偶数的过滤器在计算机视觉里使用,我认为有两个原因。

其中一个可能是,如果f是一个偶数,那么你只能使用一些不对称填充。只有f是奇数的情况下,Same卷积才会有自然的填充,我们可以以同样的数量填充四周,而不是左边填充多一点,右边填充少一点,这样不对称的填充。

第二个原因是当你有一个奇数维过滤器,比如3×3或者5×5的,它就有一个中心点。有时在计算机视觉里,如果有一个中心像素点会更方便,便于指出过滤器的位置。

也许这些都不是f为什么通常是奇数的充分原因,但如果你看了卷积的文献,你经常会看到3×3的过滤器,你也可能会看到一些5×5,7×7的过滤器。后面我们也会谈到1×1的过滤器,以及什么时候它是有意义的。但是习惯上,我推荐你只使用奇数的过滤器。我想如果你使用偶数f也可能会得到不错的表现,如果遵循计算机视觉的惯例,我通常使用奇数值的f。

你已经看到如何使用padding卷积,为了指定卷积操作中的padding,你可以指定p的值。也可以使用Valid卷积,也就是p=0。也可使用Same卷积填充像素,使你的输出和输入大小相同。以上就是padding,在接下来我们讨论如何在卷积中设置步长。

卷积步长(Strided convolutions)

卷积中的步幅是另一个构建卷积神经网络的基本操作,让我向你展示一个例子。

如果你想用3×3的过滤器卷积这个7×7的图像,和之前不同的是,我们把步幅设置成了2。你还和之前一样取左上方的3×3区域的元素的乘积,再加起来,最后结果为91。

只是之前我们移动蓝框的步长是1,现在移动的步长是2,我们让过滤器跳过2个步长,注意一下左上角,这个点移动到其后两格的点,跳过了一个位置。然后你还是将每个元素相乘并求和,你将会得到的结果是100。

现在我们继续,将蓝色框移动两个步长,你将会得到83的结果。当你移动到下一行的时候,你也是使用步长2而不是步长1,所以我们将蓝色框移动到这里:

注意到我们跳过了一个位置,得到69的结果,现在你继续移动两个步长,会得到91,127,最后一行分别是44,72,74。

所以在这个例子中,我们用3×3的矩阵卷积一个7×7的矩阵,得到一个3×3的输出。输入和输出的维度是由下面的公式决定的。如果你用一个f×f的过滤器卷积一个n×n的图像,你的padding为p,步幅为s,在这个例子中s=2,你会得到一个输出,因为现在你不是一次移动一个步子,而是一次移动s个步子,输出于是变为\frac{n+2p-f}{s}+1 × \frac{n+2p-f}{s}+1

在我们的这个例子里,n=7,p=0,f=3,s=2,\frac{7+0-3}{2}+1=3,即3×3的输出。

现在只剩下最后的一个细节了,如果商不是一个整数怎么办?在这种情况下,我们向下取整。这是向下取整的符号,这也叫做对进行地板除(floor),这意味着向下取整到最近的整数。这个原则实现的方式是,你只在蓝框完全包括在图像或填充完的图像内部时,才对它进行运算。如果有任意一个蓝框移动到了外面,那你就不要进行相乘操作,这是一个惯例。你的3×3的过滤器必须完全处于图像中或者填充之后的图像区域内才输出相应结果,这就是惯例。因此正确计算输出维度的方法是向下取整,以免\frac{n+2p-f}{s}+1不是整数。

 

可以选择所有的数使结果是整数是挺不错的,尽管一些时候,你不必这样做,只要向下取整也就可以了。你也可以自己选择一些n,f,p和s的值来验证这个输出尺寸的公式是对的。

 

池化层(Pooling layers)

除了卷积层,卷积网络也经常使用池化层来缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性,我们来看一下。

先举一个池化层的例子,然后我们再讨论池化层的必要性。假如输入是一个4×4矩阵,用到的池化类型是最大池化(max pooling)。执行最大池化的树池是一个2×2矩阵。执行过程非常简单,把4×4的输入拆分成不同的区域,我把这个区域用不同颜色来标记。对于2×2的输出,输出的每个元素都是其对应颜色区域中的最大元素值。

左上区域的最大值是9,右上区域的最大元素值是2,左下区域的最大值是6,右下区域的最大值是3。为了计算出右侧这4个元素值,我们需要对输入矩阵的2×2区域做最大值运算。这就像是应用了一个规模为2的过滤器,因为我们选用的是2×2区域,步幅是2,这些就是最大池化的超参数。

因为我们使用的过滤器为2×2,最后输出是9。然后向右移动2个步幅,计算出最大值2。然后是第二行,向下移动2步得到最大值6。最后向右移动3步,得到最大值3。这是一个2×2矩阵,即f=2,步幅是2,即s=2。

这是对最大池化功能的直观理解,你可以把这个4×4输入看作是某些特征的集合,也许不是。你可以把这个4×4区域看作是某些特征的集合,也就是神经网络中某一层的非激活值集合。数字大意味着可能探测到了某些特定的特征,左上象限具有的特征可能是一个垂直边缘,一只眼睛,或是大家害怕遇到的CAP特征。显然左上象限中存在这个特征,这个特征可能是一只猫眼探测器。然而,右上象限并不存在这个特征。最大化操作的功能就是只要在任何一个象限内提取到某个特征,它都会保留在最大化的池化输出里。所以最大化运算的实际作用就是,如果在过滤器中提取到某个特征,那么保留其最大值。如果没有提取到这个特征,可能在右上象限中不存在这个特征,那么其中的最大值也还是很小,这就是最大池化的直观理解。

必须承认,人们使用最大池化的主要原因是此方法在很多实验中效果都很好。尽管刚刚描述的直观理解经常被引用,不知大家是否完全理解它的真正原因,不知大家是否理解最大池化效率很高的真正原因。

其中一个有意思的特点就是,它有一组超参数,但并没有参数需要学习。实际上,梯度下降没有什么可学的,一旦确定了f和s,它就是一个固定运算,梯度下降无需改变任何值。

我们来看一个有若干个超级参数的示例,输入是一个5×5的矩阵。我们采用最大池化法,它的过滤器参数为3×3,即f=3,步幅为1,s=1,输出矩阵是3×3.之前讲的计算卷积层输出大小的公式同样适用于最大池化,即\frac{n+2p-f}{s}+1,这个公式也可以计算最大池化的输出大小。

此例是计算3×3输出的每个元素,我们看左上角这些元素,注意这是一个3×3区域,因为有3个过滤器,取最大值9。然后移动一个元素,因为步幅是1,蓝色区域的最大值是9.继续向右移动,蓝色区域的最大值是5。然后移到下一行,因为步幅是1,我们只向下移动一个格,所以该区域的最大值是9。这个区域也是9。这两个区域的最大值都是5。最后这三个区域的最大值分别为8,6和9。超参数f=3,s=1,最终输出如图所示。

以上就是一个二维输入的最大池化的演示,如果输入是三维的,那么输出也是三维的。例如,输入是5×5×2,那么输出是3×3×2。计算最大池化的方法就是分别对每个通道执行刚刚的计算过程。如上图所示,第一个通道依然保持不变。对于第二个通道,我刚才画在下面的,在这个层做同样的计算,得到第二个通道的输出。一般来说,如果输入是5×5×n_c,输出就是3×3×n_cn_c​​​​​​​个通道中每个通道都单独执行最大池化计算,以上就是最大池化算法。

另外还有一种类型的池化,平均池化,它不太常用。我简单介绍一下,这种运算顾名思义,选取的不是每个过滤器的最大值,而是平均值。示例中,紫色区域的平均值是3.75,后面依次是1.25、4和2。这个平均池化的超级参数f=2,s=2,我们也可以选择其它超级参数。

目前来说,最大池化比平均池化更常用。但也有例外,就是深度很深的神经网络,你可以用平均池化来分解规模为7×7×1000的网络的表示层,在整个空间内求平均值,得到1×1×1000,一会我们看个例子。但在神经网络中,最大池化要比平均池化用得更多。

总结一下,池化的超级参数包括过滤器大小f和步幅s,常用的参数值为f=2,s=2,应用频率非常高,其效果相当于高度和宽度缩减一半。也有使用f=3,s=2的情况。至于其它超级参数就要看你用的是最大池化还是平均池化了。你也可以根据自己意愿增加表示padding的其他超级参数,虽然很少这么用。最大池化时,往往很少用到超参数padding,当然也有例外的情况,我们下周会讲。大部分情况下,最大池化很少用padding。p目前最常用的值是0,即p=0。最大池化的输入就是n_H \times n_W\times n_C,假设没有padding,则输出\frac{n+2p-f}{s}+1 × \frac{n+2p-f}{s}+1​​​​​​​。输入通道与输出通道个数相同,因为我们对每个通道都做了池化。需要注意的一点是,池化过程中没有需要学习的参数。执行反向传播时,反向传播没有参数适用于最大池化。只有这些设置过的超参数,可能是手动设置的,也可能是通过交叉验证设置的。

除了这些,池化的内容就全部讲完了。最大池化只是计算神经网络某一层的静态属性,没有什么需要学习的,它只是一个静态属性。

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值