CNN卷积神经网络

如何识别、分析并理解图片、视频等数据是计算机视觉的一个核心问题,全连接层在处理高维度的图片、 视频数据时往往出现网络参数量巨大,训练非常困难的问题。通过利用局部相关性权值共享的思想。

Yann Lecun 在 1986 年提出了卷积神经网络(Convolutional Neural Network, 简称 CNN)。随着深度学习的兴盛,卷积神经网络在计算机视觉中的表现大大地超越了其它算法模型,呈现统治计算机视觉领域之势。这其中比较流行的模型有用于图片分类的 AlexNet、 VGG、 GoogLeNet、ResNet、 DenseNet 等,用于目标识别的 RCNN、 Fast RCNN、 Faster RCNN、 Mask RCNN、YOLO、 SSD 等

首先来分析全连接网络存在的问题。 考虑一个简单的 4 层全连接层网络,输入是28 × 28打平后为 784 节点的手写数字图片向量,中间三个隐藏层的节点数都是 256,输出层的节点数是 10

统计参数量:对于每条线连接线的权值标量,视为一个参数,所以对输入节点数为n,输出节点数为m的全连接层,𝑾张量包含的参数量共有𝑛 ∙ 𝑚个, 𝒃向量包含的参数量有𝑚个, 则全连接层的总参数量为𝑛 ∙ 𝑚 + 𝑚。以第一层为例,输入特征长度为 784, 输出特征长度为 256, 当前层的参数量为 784 ∙ 256 + 256 = 200960 , 同样的方法可以计算第二、 三、 四层的参数量分别为: 65792、 65792、 2570 ,总参数量约 34 万个。如果将单个权值保存为 float 类型的变量,至少需要占用 4 个字节内存(Python 语言中float 占用内存更多),这仅仅是要训练的参数,还有梯度信息,输入,中间结果等等。随着层数的增加,无疑会占用更多的计算机资源,训练效率变低。

一、卷积运算
 

在信号处理领域, 1D 连续信号的卷积运算被定义两个函数的积分: 函数𝑓(𝜏)、 函数
𝑔(𝜏), 其中𝑔(𝜏)经过了翻转𝑔(-𝜏)和平移后变成𝑔(𝑛 - 𝜏)卷积的“卷”是指翻转平移操
作,“积”是指积分运算, 1D 连续卷积定义为:

 离散卷积将积分运算换成累加运算:

在计算机视觉中,卷积运算基于 2D 图片函数𝑓(𝑚 𝑛)2D 卷积核𝑔(𝑚 𝑛), 其中𝑓(𝑖 𝑗)和𝑔(𝑖 𝑗)仅在各自窗口有效区域存在值,其它区域视为 0,如图所示。 此时的 2D 离散卷积定义为:

首先,将卷积核𝑔(𝑖 𝑗)函数翻转(沿着𝑥和𝑦方向各翻转一次),变成𝑔(-𝑖 -𝑗)。当(𝑚 𝑛) = (-1, -1 )时, 𝑔(- 1- 𝑖 ,-1 - 𝑗)表示卷积核函数翻转后再向左、向上各平移一个单元,此时

 2D 函数只在𝑖 ∈[-1,1] 𝑗 ∈ [-1,1] 存在有效值,其它位置为 0。 按照计算公式,我们可以得到 𝑓⨂𝑔 (-1 ,-1 ) =7 :

 (𝑚, 𝑛) = (0 ,-1 )时, 即卷积核翻转后再向上平移一个单元后对应位置相乘累加, 𝑓⨂𝑔 (0 ,-1 ) = 7,

 当(𝑚 𝑛) = (1, -1 )时,即卷积核翻转后再向右、 向上各平移一个单元后对应位置相乘累加, 𝑓⨂𝑔 (1, -1 ) =1

 按照此种方式循环计算,可以计算出函数 𝑓⨂𝑔 (𝑚 ,𝑚) 𝑚 ∈[ -1,1] 𝑛 ∈[ -1,1] 的所有值,

在深度学习中,函数𝑔(𝑚, 𝑛)统一称为卷积核(Kernel), 有时也叫 Filter、 Weight。每次通过移动卷积核,并与图片对应位置处的感受野像素相乘累加,得到此位置的输出值卷积核即是行、列为𝑘大小的权值矩阵𝑾,对应到特征图上大小为𝑘的窗口即为感受野(局部相关性),感受野与权值矩阵𝑾相乘累加,得到此位置的输出值。在每次计算时,均使用相同的权值矩阵𝑾,也称为权值共享
 


二、卷积层

卷积神经网络通过充分利用局部相关性权值共享的思想,大大地减少了网络的参数量, 从而提高训练效率,更容易实现超大规模的深层网络
 

1.单通道输入和单卷积核

 以输入𝑿为 5× 5的矩阵,卷积核为3 × 3的矩阵为例,与卷积核同大小的感受野(输入𝑿上方的绿色方框)首先移动至输入𝑿最左上方, 选中输入𝑿上3 × 3的感受野元素与卷积核(图片中间3 × 3方框)对应元素相乘,得到标量7,写入输出矩阵第一行,第一列。完成第一个感受野区域的特征提取后,感受野窗口向右移动一个步长单位(Strides, 记为𝑠=1, 默认为 1),选中图绿色方框中的 9 个感受野元素,按照同样的计算方法,与卷积核对应元素相乘累加,得到输出 10, 写入第一行、第二列位置。继续向右移动,完成计算,写入第一行、第三列位置。

此时感受野已经移动至输入𝑿的有效像素的最右边, 无法向右边继续移动(在不填充无效元素的情况下), 因此感受野窗口向下移动一个步长单位(𝑠 =1 ), 并回到当前行的行首位置,向下移动一个步长单位,继续选中新的感受野元素区域, 与卷积核运算得到输出-1,写入第二行、第一列位置。

按照上述方法, 每次感受野向右移动𝑠 = 1个步长单位,若超出输入边界,则向下移动𝑠 = 1个步长单位, 并回到行首,直到感受野移动至最右边、 最下方位置。每次选中的感受野区域元素,和卷积核对应元素相乘累加,并写入输出的对应位置。最终输出得到一个3 × 3的矩阵。比输出矩阵略小,这是因为感受野不能超出元素边界的缘故卷积运算的输出矩阵大小由卷积核的大小𝑘,输入𝑿的高宽ℎ/𝑤, 移动步长𝑠, 是否填充等因素共同决定
 

2.多通道输入和单卷积核

在多通道输入的情况下, 卷积核的通道数需要和输入𝑿的通道数量相匹配, 卷积核的第𝑖个通道和𝑿的第𝑖个通道运算,得到第𝑖个中间矩阵,此时可以视为单通道输入与单卷积核的情况, 所有通道的中间矩阵对应元素再次相加, 作为最终输出

在初始状态,每个通道上面的感受野窗口同步落在对应通道上面的最左边、最上方位置,每个通道上感受野区域元素与卷积核对应通道上面的矩阵相乘累加, 分别得到三个通道上面的输出 7、-11、 -1 的中间变量, 这些中间变量相加得到输出-5, 写入对应位置。

感受野窗口同步在𝑿的每个通道上向右移动𝑠 = 1个步长单位,每个通道上面的感受野与卷积核对应通道上面的矩阵相乘累加,得到中间变量 10、 20、 20,全部相加得到输出 50, 写入第一行、第二列元素位置

以此方式同步移动感受野窗口,直至最右边、 最下方位置,此时全部完成输入和卷积核的卷积运算,得到3 × 3的输出矩阵

输入的每个通道处的感受野均与卷积核的对应通道相乘累加,得到与通道数量相等的中间变量,这些中间变量全部相加即得到当前位置的输出值输入通道的通道数量决定了卷积核的通道数。 一个卷积核只能得到一个输出矩阵,无论输入𝑿的通道数量。


3.多通道输入和多卷积核

一般来说,一个卷积核只能完成某种逻辑的特征提取当需要同时提取多种逻辑特征时, 可以通过增加多个卷积核来得到多种特征,提高神经网络的表达能力

当出现多卷积核时, 第𝑖 (𝑖 ∈[1, 𝑛] , 𝑛为卷积核个数)个卷积核与输入𝑿运算得到第𝑖个输出矩阵(也称为输出张量𝑶的通道𝑖), 最后全部的输出矩阵在通道维度上进行拼接(Stack 操作,创建输出通道数的新维度),产生输出张量𝑶, 𝑶包含了𝑛个通道数

 如图 3个通道输入、 2 个卷积核的卷积层,第一个卷积核与输入𝑿运算得到输出𝑶的第一个通道,第二个卷积核与输入𝑿运算得到输出𝑶的第二个通道,输出的两个通道拼接在一起形成了最终输出𝑶每个卷积核的大小𝑘、 步长𝑠、 填充设定等都是统一设置, 这样才能保证输出的每个通道大小一致,从而满足拼接的条件
 

总之,卷积层的作用:提取输入图片中的信息,这些信息被称为图像特征,这些特征是由图像中的每个像素通过组合或者独立的方式所体现,用它来进行特征提取

注:感受野的深度必须和输入图像的深度相同

4.步长

步长(stride):窗口一次滑动的长度。感受野密度的控制手段一般是通过移动步长(Strides)实现的。

通过设定步长𝑠,可以有效地控制信息密度的提取。当步长设计的较小时,感受野以较小幅度移动窗口,有利于提取到更多的特征信息,输出张量的尺寸也更大;当步长设计的较大时, 感受野以较大幅度移动窗口,有利于减少计算代价, 过滤冗余信息,输出张量的尺寸也更小

将步长设置为2,得到输出矩阵2X2,对比前面的s=1,感受野的数量减速了4个

5.填充

经过卷积运算后的输出𝑶的高宽一般会小于输入𝑿的高宽, 即使是步长𝑠 = 时,输出𝑶的高宽也会略小于输入𝑿高宽。 在网络模型设计时,有时希望输出𝑶的高宽能够与输入𝑿的高宽相同, 从而方便网络参数的设计、 残差连接等。 为了让输出𝑶的高宽能够与输入𝑿的相等, 一般通过在原输入𝑿的高和宽维度上面进行填充(Padding)若干无效元素操作,得到增大的输入𝑿′。 通过精心设计填充单元的数量, 在𝑿′上面进行卷积运算得到输出𝑶的高宽可以和原输入𝑿相等。另一个原因是为了提前边缘特征,提高边缘信息的权重,在中间的信息有的会被重复利用几次

通过精心设计的 Padding,即上下左右各填充一个单位,记为𝑝 = 1,可以得到输出𝑶和输入𝑿的高、 宽相等的结果
 

卷积神经层的输出尺寸[b,ℎ,′ 𝑤′, 𝑐𝑜𝑢𝑡] 由卷积核的数量𝑐𝑜𝑢𝑡,卷积核的大小𝑘,步长𝑠,填充数𝑝(只考虑上下填充数量𝑝h相同,左右填充数量𝑝𝑤相同的情况)以及输入𝑿的高宽ℎ/𝑤共同决定, 它们之间的数学关系可以表达为: 其中𝑝ℎ、 𝑝𝑤分别表示高、宽方向的填充数量, ⌊∙⌋表示向下取整

在 TensorFlow 中, 在𝑠 = 1时, 如果希望输出𝑶和输入𝑿高、 宽相等, 只需要简单地设置参数 padding=”SAME” 即可使 TensorFlow 自动计算 padding 数量,非常方便
 

三、池化层
 

在卷积层中, 可以通过调节步长参数𝑠实现特征图的高宽成倍缩小,从而降低了网络的参数量。除了通过设置步长,还有一种专门的网络层--池化层(Pooling Layer)可以实现尺寸缩减功能
 

池化层基于局部相关性的思想,通过从局部相关的一组元素中进行采样或信息聚合,从而得到新的元素值。最大池化层(Max Pooling)从局部相关元素集中选取最大的一个元素值,平均池化层(Average Pooling)从局部相关元素集中计算平均值并返回。
 

 以5×5 输入𝑿的最大池化层为例,池化感受野窗口大小𝑘 = 2,步长𝑠 = 的情况。绿色虚线方框代表第一个感受野的位置,在最大池化采样的方法下,通过 x' = max{1,-1,-1,-2} = 1,输出值为1并在相应的位置写上1。若采用的是平均池化操作,则此时的输出值应为𝑥′ = avg({ 1,-1, -1, -2}) = - 0.75。逐渐移动感受野窗口至最右边,获得最大池化层的输出。

由于池化层没有需要学习的参数,计算简单, 并且可以有效减低特征图的尺寸,非常适合图片这种类型的数据,在计算机视觉相关任务中得到了广泛的应用

通过精心设计池化层感受野的高宽𝑘和步长𝑠参数,可以实现各种降维运算。一种常用的池化层设定是感受野大小𝑘 = 2,步长𝑠 = 2,这样可以实现输出只有输入高宽一半的目的但是一般会在下一个卷积层,卷积核的数量翻倍,为了弥补池化层压缩特征信息
 

池化层:对输入的特征图进行压缩,一方面使特征图变小,简化网络计算复杂度;一方面进行特征压缩,提取主要特征
 

四、BatchNorm 层

卷积神经网络的出现,网络参数量大大减低,使得几十层的深层网络成为可能。然而,在残差网络出现之前,网络的加深使得网络训练变得非常不稳定, 甚至出现网络长时间不更新甚至不收敛的现象,同时网络对超参数比较敏感,超参数的微量扰动也会导致网络的训练轨迹完全改变
 

这是基于参数标准化设计了 Batch Nomalization(简写为 BatchNorm,或 BN)层 。 BN 层使得网络的超参数的设定更加自由,比如更大的学习率、 更随意的网络初始化等,同时网络的收敛速度更快,性能也更好。 卷积层、 BN 层、 ReLU 层、池化层一度成为网络模型的标配单元块通过堆叠 Conv-BN-ReLU-Pooling 方式往往可以获得不错的模型性能。
 

对网络中的数据进行标准化的原因:

如Sigmoid 激活函数和它的梯度分布,Sigmoid 函数在𝑥 ∈[-2 2] 区间的导数值在[0.1,0.25] 区间分布;当𝑥 > 2 或𝑥 < -2时, Sigmoid 函数的导数变得很小,逼近于 0,从而容易出现梯度弥散现象。为了避免因为输入较大或者较小而导致Sigmoid 函数出现梯度弥散现象,将函数输入𝑥标准化映射到 0 附近的一段较小区间将变得非常重要,通过标准化重映射后,值被映射在 0 附近,此处的导数值不至于过小,从而不容易出现梯度弥散现象

网络层输入𝑥分布相近, 并且分布在较小范围内时(如 0 附近),更有利于函数的优化。通过数据标准化操作可以将数据𝑥映射到𝑥̂:

其中𝜇𝑟、 𝜎𝑟2来自统计的所有数据的均值和方差, 𝜖是为防止出现除 0 错误而设置的较小数字

在基于 Batch 的训练阶段,考虑Batch 内部的均值𝜇𝐵和方差𝜎𝐵2,可以视为近似于𝜇𝑟,𝜎𝑟2

在测试阶段,根据记录的每个 Batch 的𝜇𝐵, 𝜎𝐵2估计出所有训练数据的𝜇𝑟,𝜎𝑟2,
 

标准化运算并没有引入额外的待优化变量, 𝜇𝑟,𝜎𝑟2和𝜇𝐵,𝜎𝐵2均由统计得到,不需要参与梯度更新。为了提高 BN 层的表达能力, BN 层作者引入了“scale andshift”技巧,将𝑥̂变量再次映射变换:𝑥̃ = 𝑥̂ ∙ 𝛾 + 𝛽。其中𝛾参数实现对标准化后的𝑥̂再次进行缩放, 𝛽参数实现对标准化的𝑥̂进行平移, 不同的是, 𝛾、 𝛽参数均由反向传播算法自动优化,实现网络层“按需”缩放平移数据的分布的目的
 

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Super.Bear

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值