【深度学习】4.1卷积神经网络

计算机视觉

在计算机视觉中操作的是不再是之前64×64的图片了,变成了64×64×3的图片,因为每张图片都有3个颜色(RGB)通道,因此数据量为12288,所以特征向量X的维度是12288。如果要操作更大的图片,那么特征向量的维度就会更大。

计算机视觉需要处理的数据量非常大,因此需要使用卷积。

边缘检测示例

卷积运算是卷积神经网络最基本的组成部分,使用边缘检测作为入门样例。

神经网络的前几层检测边缘信息,有些后面的层可能检测到物体的部分信息,更靠后的一些层甚至可能检测到完整的物体。
在这里插入图片描述
对于这张图片,让电脑去搞清楚这张照片里有什么物体,可能最先做的就是检测图片中的垂直边缘,比如这张图片中的栏杆、行人的轮廓线就是垂直边缘检测器的输出;然后可能会检测水平边缘,比如水平栏杆。
在这里插入图片描述
如何在图像中检测这些边缘呢?

这是一个6×6的灰度图像:
在这里插入图片描述
因为是灰度的,所以这是一个6×6×1的矩阵,而不是6×6×3的矩阵。
为了检测图像中的垂直边缘,可以构造一个3×3的矩阵,在卷积神经网络的术语中它被称为过滤器,在论文中它也会被称为,构造下面这样的一个3×3的过滤器:
在这里插入图片描述
用它对上面的6×6的矩阵进行卷积运算,用*表示。这个卷积运算的输出将会是一个4×4的矩阵,可以将其看作一个4×4的图像。
为了计算第一个元素,使用3×3的过滤器将其覆盖在输入图像上最上面的3×3区域上:
在这里插入图片描述
然后进行元素乘法运算,第一个是3×1=3,下面的第二个是1×1=1,再下面是2×1=2,将他们相加;把这9个运算之后的结果加起来3×1 + 1×1 + 2×1 + 0×0 + 5×0 + 7×0 + 1×(-1) + 8×(-1) + 2×(-1) = -5,因此4×4的图像的第一个元素值应为-5。
计算第二个元素如下:
在这里插入图片描述
0×1 + 5×1 + 7×1 + 1×0 + 8×0 + 2×0 + 2×(-1) + 9×(-1) + 5×(-1) = -4,因此4×4的图像的第一个元素值应为-4。同理,可以算出其他的元素值。
在这里插入图片描述
这些图片和过滤器是不同维度的矩阵,一般将最左边的矩阵认为是一张图片,中间的矩阵认为是一个过滤器,右边的矩阵认为是另一张图片。
这就是垂直边缘检测器,在python中使用conv_forward函数来实现卷积运算,在tensorflow中使用tf.nn.conv2D函数,在keras框架中使用Conv2D来实现卷积运算。
在这里插入图片描述
左边矩阵代表的图片左边的一半是10,右边的一半是0,将其看作一张图片,那么左边的那部分像素值10是比较亮的像素值,右边像素值比较暗,可以用灰色或黑色表示0。图片中在图像中间有一个很明显的垂直边缘,这条垂直线是从黑到白(从白色到神色)的过渡线。当用3×3的过滤器处理时,3×3的过滤器可视化下面这个样子,在左边有明亮的像素,然后有一个过渡段0在中间,右边是深色的。卷积运算后可以得到右边的矩阵,将其当作图像,它在中间有段亮一点的区域,对应检测到6×6图像中间的垂直边缘。

更多边缘检测内容

区分由暗向亮过渡还是由亮向暗过渡:
在这里插入图片描述
如果不在乎是如何变化的,可以取输出矩阵的绝对值。但这个特定的过滤器可以为我们区分这两种明暗变化的区别。

在这里插入图片描述
第一个过滤器可以检测出垂直的边缘,右边的过滤器可以检测出水平的边缘。第一个滤波器的垂直边缘是一个3×3的区域,它的左边相对较亮,而右边相对较暗。右边这个滤波器的水平边缘也是一个3×3的区域,它的上边相对较亮,下方相对较暗。
在这里插入图片描述
与水平边缘滤波器卷积,得到了右边的矩阵。第二行的30代表了左边3×3的区域上面两行是10下面一行是0的3×3矩阵,这块区域上方比较亮,底部比较暗;-30代表了左边3×3的另一块区域上面两行是0下面一行是10的3×3矩阵,这块区域底部比较亮,上边比较暗。如果图片尺寸很大, 就不会出现10和-10这种过渡带了。

还有一些其他的过滤器:
在这里插入图片描述
sobel过滤器,其优点在于增加了中间一行元素的权重,也就是处在图像中央的像素点,这使得结果的鲁棒性会更高一些。
scharr过滤器,也是一种垂直边缘检测,将其翻转90°就能得到对应的水平边缘检测。
实际上,可以将矩阵的9个数字当成9个参数,并且在之后使用反向传播算法去理解这9个参数,即把这9个数字当成参数的滤波器,它可以检测出45°、70°、73°、甚至是任何角度的边缘。
在这里插入图片描述
将矩阵的所有数字都设置成参数,通过数据反馈让神经网络自动去学习它们。

Padding

如果有一个n×n的图像,用一个f×f的过滤器做卷积,那么输出结果的维度就是(n-f+1)×(n-f+1)。这有两个缺点:第一个就是每次做卷积操作会使图像缩小,可能经过几次之后,图像就会变得很小了,但我们不希望图像在每次识别边缘或识别其他特征时都缩小;第二个缺点就是角落边的像素点只被一个输出所触碰和使用,这意味着丢掉了图像边缘位置的许多信息,但是中间的像素点就会有很多过滤器的区域与之重叠。

为了解决上述两个问题(输出缩小+图像边缘的大部分信息都丢失了),可以在卷积操作之前填充图像,比如可以沿着图像边缘再填充一层像素,那么n×n的图像就被填充成了一个(n+2)×(n+2)的图像,并且习惯上会用0去填充。若p是填充的数量,当我们在图像周围都填充一个像素点时,p=1,输出变成了(n+2p-f+1)×(n+2p-f+1)
也可以填充两个像素点,p=2,那么就变成了(n+4)×(n+4)的图像;还可以去填充更多的像素点。

选择填充多少像素的方法有两种:Valid卷积和Same卷积。
Valid卷积意味着不填充。如果有一个n×n的图像,用一个f×f的过滤器卷积,它将会给一个(n-f+1)×(n-f+1)维的输出。
Same卷积意味着填充后输出大小和输入大小是一样的。如果有一个n×n的图像,当填充p个像素点时,输出变成了(n+2p-f+1)×(n+2p-f+1)。让n+2p-f+1=n,因此p=(f-1)/2。所以当f为奇数时,只要选择相应的填充尺寸,就能确保得到和输入相同尺寸的输出。习惯上,计算机视觉中f通常都是奇数的,很少看到一个偶数的过滤器在计算机视觉里使用。

卷积步长

若想用3×3的过滤器卷积7×7的图像,将步幅设置为2,那么:
在这里插入图片描述
第一个元素为:2×3 + 6×1 + 3×(-1) + 3×4 + 6×0 + 4×0 + 7×4 + 9×2 + 8×3 = 91。然后让过滤器跳过2个步长,还是将每个元素相乘并求和,得到第一行的第二个元素:7×3 + 9×1 + 8×(-1) + 4×4 + 8×0 + 3×0 + 6×4 + 7×2 + 8×3 = 100。
在这里插入图片描述
同理,得到最后的3×3的输出。用f×f的过滤器卷积一个n×n的图像,padding设为p,步幅为s,那么输出为[(n+2p-f)/s +1]×[(n+2p-f)/s +1]。如果商不是一个整数,可以向下取整(地板除),即将其向下取整到最近的整数。此原则是当蓝色的框移到了图像以外的地方就不对它进行操作计算了:
在这里插入图片描述
即:过滤器必须完全处于图像中或者填充之后的图像区域内,才输出相应结果。

在数学教材中,卷积的定义是是在做元素乘积求和之前将过滤器沿水平和垂直轴翻转,例如:
在这里插入图片描述
然后再把这个翻转后的矩阵复制到要处理的图像中去计算输出。

但按照机器学习的惯例,通常不进行翻转操作,从技术上说,之前讲的不翻转的操作也可以叫做互相关。

卷积为何有效

如果想检测RGB彩色图像的特征,若彩色图像的大小是6×6,那么它的数据量就是6×6×3,可以将其想象为三个6×6的图像的堆叠。
为了检测图像的边缘和其他特征,将其与一个三维的维度为3×3×3的过滤器卷积,也将过滤器看作三个3×3过滤器的堆叠,对应红绿蓝三个通道。
图像的6×6×3中第一个6代表图像的高,第二个6代表图像的款,3代表通道的数目;同样的,过滤器也有高、宽、通道数。并且图像的通道数必须和过滤器的通道数匹配。
此例子的输出是4×4×1的!最后一个数不是3了。
在这里插入图片描述
为了简化这个3×3×3的过滤器的图像,将其画成一个三维的立方体:在这里插入图片描述
首先将这个3×3×3的过滤器放到图像最左上角的位置,这个3×3×3的过滤器有33=27个数,依次取这27个数乘以相应的红绿蓝通道中的数字,然后把这些数都加起来,就得到了输出的第一个数字。
在这里插入图片描述
若想检测图像红色通道的边缘,可以将第一个过滤器设为1 1 1 -1 -1 -1 0 0 0,而绿色通道和蓝色通道全部设为0。
按照计算机视觉的惯例,当输入有特定的高、宽、通道数时,过滤器可以有不同的高、宽,但是通道数必须一样。

若想同时用多个过滤器,可以把不同过滤器的输出堆叠在一起,形成一个输出立方体。

维度的总结
如果有一个n×n×nc(nc为通道数)的输入图像,然后卷积上一个f×f×nc的过滤器,然后就得到了(n-f+1)×(n-f+1)×nc,其中nc为使用的过滤器的个数。

单层卷积网络

假设使用第一个过滤器进行卷积,得到第一个4×4的矩阵;使用第二个过滤器进行卷积,得到另外一个4×4的矩阵。最终各自形成一个卷积神经网络层,然后增加偏差(它是一个实数)。然后应用非线性函数,输出结果是一个4×4矩阵;对于第二个矩阵,加上不同的偏差(也是一个实数),然后应用非线性函数,也就是一个非线性激活函数,最终得到另一个4×4矩阵。然后重复之前的操作,把这两个矩阵堆叠起来,最终得到一个4×4×2的矩阵。通过计算,从一个6×6×3的输入推导出一个4×4×2的输出。它是卷积神经网络的一层。
在这里插入图片描述
假设有10个过滤器,神经网络的一层是3×3×3,那么这一层的参数个数为:
每层都是一个3×3×3的图像,因此每个过滤器有27个参数,然后加上一个偏差(用参数b表示),现在参数增加到28个。10个过滤器因此参数为28×10=280个。不论输入的图像有多大,用这10个过滤器来提取特征,参数始终都是280个。因此即使图片很大,参数也很少,这就是卷积神经网络的一个特征“避免过拟合”。

一般,用:
f[l]表示过滤器大小,即l层中过滤器大小为f×f;
p[l]表示padding的数量;
s[l]表示步幅;
这一层的输入是上一层的输出,为nH[l-1]×nW[l-1]×nc[l-1],其中nH[l-1]表示上一层输入图片的高度,nW[l-1]表示上一层输入图片的宽度,nc[l-1]为上一层的通道数量。这一层的输出为nH[l]×nW[l]×nc[l],这就是输出图像的大小。
在这里插入图片描述
输出图片也具有深度(也可以叫通道)nc[l],它等于该层中过滤器的数量。
过滤器的大小等于f[l]×f[l]×nc[l-1],过滤器中通道的数量必须与输入中通道的数量一致。
应用偏差和非线性函数之后,这一层的输出等于它的激活值a[l],它是一个三维体,即nH[l]×nW[l]×nc[l]
权重参数W = f[l]×f[l]×nc[l-1]×nc[l]
每个过滤器都有一个偏差参数,它是一个实数,偏差包含了变量nc[l],在代码中偏差表示为一个1×1×1×nc[l]的四维向量或四维张量。

简单卷积网络示例

在这里插入图片描述
经过上述运算,最后为图片提取了7×7×40个特征,也就是1960个特征。然后对该卷积层进行处理,可以将其平滑或展开成1960个单元,输出一个向量。其填充内容是logistic回归单元或者softmax回归单元,这取决于我们想识别图片上有没有猫还是想识别K种不同对象中的一种。用y hat表示最终神经网络的预测输出。

随着神经网络计算深度不断加深,通常开始时的图像也要更大一些,高度和宽度会在一段时间内保持一致;然后随着网络深度的加深而逐渐减小,而通道数量在增加。

一个典型的卷积网络通常有三层,一个是卷积层,通常用CONV来标注;还有池化层,称之为POOL;全连接层,用FC表示。虽然仅用卷积层也有可能构建出很好的神经网络,但大部分神经网络架构仍然会存在池化层和全连接层。

池化层

假如输入一个4×4矩阵,用到的池化类型是最大池化(max pooling),执行最大池化的输出是一个2×2矩阵。执行过程为:将4×4的输入拆分成不同的区域,2×2的输出的每个元素都是其对应颜色区域中的最大元素值。这就像是应用了一个规模为2的过滤器,步幅是2。
在这里插入图片描述
对于一个有若干个超级参数的情况:
输入是一个5×5的矩阵,采用最大池化法, 它的过滤器参数为3×3,即f=3,步幅s为1,输出矩阵是3×3。计算卷积层输出大小的公式同样适用于最大池化,(n+2p-f)/s +1可以计算最大池化的输出大小。
在这里插入图片描述
第一个元素取篮框中的最大值9,然后移动一个元素(因为步幅是1),蓝色区域的最大值是9:
在这里插入图片描述
同理,得到超级参数为f=3,s=1时最终输出的矩阵为:
在这里插入图片描述
以上就是一个二维输入的最大池化的演示。如果输入是三维的,那么输出也是三维的,例如:如果输入是5×5×2,那么输出是3×3×2,计算最大池化的方法就是分别对每个通道执行刚刚的计算过程,每个通道都单独执行最大池化计算。

还有另外一种类型的池化——平均池化,他不太常用。
它选取的不是每个过滤器的最大值,而是平均值:
在这里插入图片描述
这个平均池化的超级参数f=2,s=2,也可以选择其它超级参数。

对于深度很深的神经网络,可以用平均池化来分解规模为7×7×1000的网络的表示层,在整个空间内求平均值,得到1×1×1000。但在神经网络中,最大池化要比平均池化用得更多。

总结一下:
池化的超级参数包括过滤器大小f和步幅s,常用的参数值为f=2,s=2,其效果相当于高度和宽度缩减一半;也有使用f=3,s=2的情况;也可以根据自己的意愿增加表示padding的其他超级参数,不过除了特殊情况,最大池化时,很少用到padding。
最大池化的输入就是nH×nW×nc,在没有padding时,输出为[(nH-f)/s +1]×[(nW-f)/s +1]×nc,因为对每个通道都做了池化,所以输入通道和输出通道个数相同。
池化过程中没有需要学习的参数。执行反向传播时,反向传播没有参数适用于最大池化,只有这些手动设置或者通过交叉验证设置过的超级参数。最大池化只是计算神经网络某一层的静态属性

卷积神经网络示例

在这里插入图片描述

在卷积网络文献中,卷积有两种分类,这与所谓层的划分存在一致性。一类卷积是一个卷积层和一个池化层一起作为一层;另一类卷积是把卷积层作为一层,而把池化层单独作为一层。在计算神经网络的层数时,通常只是统计具有权重和参数的层,因为池化层没有权重和参数,只有一些超级参数,所以通常将CONV1和POOL1共同作为一个卷积,并标记为Layer1。
在这里插入图片描述
5×5×16矩阵包含400个元素,将POOL2平整化为一个大小为400的一维向量。然后利用这400个单元构建下一层。
下一层含有120个单元,这就是这里的第一个全连接层,标记为FC3。400个单元与这120个单元紧密相连,还有一个偏差参数,最后输出120个维度。
然后再对这120个单元添加一个全连接层,假设它有84个单元,标记为FC4。最后用这84个单元填充一个softmax单元。
在这里插入图片描述
尽量不要自己设置超级参数,而是查看文献中别人采用了哪些超级参数,选一个在别人任务中效果很好的架构。

随着神经网络深度的加深,高度nH和宽度nW通常都会减少,而通道数量会增加,然后得到一个全连接层。

在神经网络中,另一种常见模式是一个或多个卷积层后面跟随一个池化层,然后一个或多个卷积层后面再跟一个池化层,然后是几个全连接层,最后是一个softmax。

神经网络的激活值形状、激活值大小和参数数量如下:
在这里插入图片描述
需要注意:
1.池化层和最大池化层没有参数。
2.卷积层的参数相对较少。许多参数都存在于神经网络的全连接层。
3.随着神经网络的加深,激活值会逐渐变小。如果激活值下降太快,也会影响网络性能。

为什么使用卷积?

和只用全连接层相比,卷积层的主要优势为参数共享和稀疏连接。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值