深度学习——CNN相关网络(二)

深度学习——CNN(Convolutional Neural Network)(二)

在之前的文章中,我们主要介绍了关于CNN的基本思想和基本结构,下面我们要介绍的是关于CNN的一些常见的变形结构。

1 空洞卷积(dilated convolution)

1.1 基本思想

空洞卷积的基本思想是在卷积操作之后生成的结果矩阵上增加“空洞”,依次来增加接收域(reception filed),相比于原理的卷积操作,空洞卷积主要是增加一个超参数,这个超参数称为“空洞率”,空洞率值的是卷积核内部参数的间隔。

我们给出两个图来展示一下这个过程:
在这里插入图片描述
在这里插入图片描述
上面给出的两个图分别是原始的卷积结构和空洞卷积结构。

1.2 空洞卷积过程

在这里插入图片描述

首先,图a对应的我们使用3*3的卷积核进行标准卷积的过程,也就是空洞率为1的卷积。

图b对应的是空洞率为2的卷积操作,在这个卷积过程中,我们使用的卷积核的维度不变,仍然是33的卷积核,但是由于空洞的存在,我们可以理解为扩大的卷积的区域,将33的区域扩展成了77的区域,但是区域内部只有9个红色的点的权重不为0,其他的区域内部的权重均为0。可以看到,接收域已经从33变成了77,如果该空洞卷积是基于标准的卷积得到,则每一个红点就是空洞率为1 的卷积的输出,这个时候空洞率为1和2的卷积相结合,就能达到77的卷积。

图c对应的是空洞率为4的卷积,同理,如果这个卷积接在空洞率-1和空洞率-2的卷积后面,就能达到15*15的接收域。

总的来看,相比于传统的卷积操作,3层3*3的卷积加起来,步长为1的话,只能达到(3-1)*3=7的接收域,也就是和层数成线性关系,而空洞卷积的接收域是呈指数增加的。dilated的好处是不做pooling损失信息的情况下,加大了感受野,让每个卷积输出都包含较大范围的信息。

2 形变卷积(Deformable Conv)

在我们之前介绍的所有的CNN网络结构中,卷积操作的感受域的范围都是固定的,是根据我们认为定义的卷积核的大小来决定感受域的大小,这里我们来考虑一个问题,以一张图片来说,假设图片中的物体特征特别大,而我们定义的卷积核不能够满足关于这个物体的特征抽取。换句话来讲,我们的感受域的大小不能够动态的适应当前的物体特征,这就限制了识别的精度。

为了解决这种卷积操作的规则性而导致的不能够很好的去适应的输入中的特征大小,这里提出了形变网络,其核心思想在于对于卷积核中的每一个采样点的位置都增加了一个偏移的变量。通过这些变量,卷积结果就可以在当前位置附近随意的进行采样,从而对当前的卷积结果进行扩展,从而扩大了感受域。而不是局限在之前的规则区域。

这里我们用一张图来展示一下这个过程:

在这里插入图片描述

在这里插入图片描述
这里我们可以从第一个图开始看起,初始的时候一个标准的卷积过程,在确定标准的感受域之后,在计算当前的卷积核的词采样点的时候就可以根据采样点近似随机的偏移,将该卷积结果从其他的卷积结果上进行扩展。

事实上,形变卷积单元增加的偏移量是网络结构中的一个部分,这个偏移实际上也可以通过其他的标准的卷积过程计算得到。也就是说,这个偏移也可以通过反向传播进行更新。通过这种偏移使得在学习的过程中可以动态的对于感受域进行调整。其直观的效果就是根据原始图像中的特征大小来动态的调整卷积结果范围的计算。

3 CNN代表——AlexNet网络

这个是由 Krizhevsky等人在2012年提出来的一种深层的CNN网络结构,其总的结构如下图所示:

在这里插入图片描述
从上面的整个结构我们可以看出,整个的AlexNet网络结构一共包含5个卷积层和3个全连接层,其具体的结构如下图所示:

在这里插入图片描述
这里需要注意的是,在ALexNet中采用了LRN的技术,我们来简单的介绍一下这种技术:

3.1 LRN

LRN全称为Local Response Normalization,即局部响应归一化,LRN类似于DropOut,是一种防止过拟合的方法,这个函数很少使用,基本可以被Dropout方法进行替代。
其基本的计算公式如下:

b x , y i = a x , y i ( k + α ∑ j = m a x ( 0 , i − n / 2 ) m i n ( N − 1 , i + n / 2 ) ( a x , y i ) 2 ) β b_{x,y}^i=a_{x,y}^i(k+α∑_{j=max(0,i-n/2)}^{min(N-1,i+n/2)}(a_{x,y}^i)^2)^β bx,yi=ax,yi(k+αj=max(0,in/2)min(N1,i+n/2)(ax,yi)2)β

其中 b x , y i b_{x,y}^i bx,yi表示的是归一化之后的值,i是通道的位置,代表更新第几个通道的值,x和y表示更新像素的位置。
a x , y i a_{x,y}^i ax,yi表示第i个通道的想x,y元素的位置的输入元素。
k , α , β , n / 2 k,α,β,n/2 k,α,β,n/2都是自定义的系数。
N N N是总的通道数。
累加多少个通道的像素值取决于自定义的系数 n / 2 n/2 n/2

4. CNN代表——ZeilerNet

ZeilerNet网络是对于AlexNet的一种改进,其内部使用了反卷积的操作,得到了可视化的特征图,并且指出了AlexNet的一些不足,最后呢修改了步长等等来对Alex网络结构进行调整,使得分类的效果得到的了提升,从本质来看,其没有对于Alex网络进行大范围的修改。其架构如图如下图所示:

在这里插入图片描述

5. CNN代表——VGGNet网络

VGGNet主要是针对于网络深度这一个方向对于CNN网络进行调整。在VGGNet中使用的是33的小的卷积核,同时为了使得卷积前后的输入矩阵的维度一致,对原始的矩阵进行了填充,对于原始的输入矩阵,其padding为1。在卷积之后,VGGNet选择的是Max—pooling,整个网络结构一共采用了5个Max-pooling,同时并不是所有的卷积之后都需要进行max-pooling操作。pooling时,其核的维度为22,步长为2。这里VGGNet与Alex不同的是其选择的是不重叠的pooling。在作用的展开操作中,使用的是三层的全连接的操作。在VGGNet中选择的激活函数为Relu,同时在最后的输出层使用了softmax的操作。在VGGNet中取消了LRN的局部响应归一化的操作。其不同的网络结构参数如下图所示:
在这里插入图片描述

6. CNN代表—GoogleNet

GoogleNet是由2014年有Google提出来的基于CNN的网络结构,在Googlenet中没有项VGGNet一样继承了AlexNet的框架结构,该模型一共有22层,当时参数量只有AlexNet的 1 12 \frac{1}{12} 121,在Googlenet中指出,获得高质量模型最为保险的方式是增加模型的深度或者是模型的宽度。但是这种网络也会产生很多的问题,比如模型参数过多,容易造成过拟合。网络结构更加复杂,很难做到实际的应用,网络过深容易造成梯度消失等等。为了解决这些问题,GoogleNet采用的方式是将原来的全连接和一般的卷积操作都变成稀疏连接。

为了实现这个思路,GoogleNet使用了Inception的模块化的结构来进行实现。Inception是一种嵌套的网络结构,其具体的形式如下所示:

在这里插入图片描述
下面简单的介绍一下:

  1. 首先,对于前一层的输入,首先选择的是不同的卷积核进行卷积。然后对于卷积核的卷积结果进行拼接,这意味着不同尺度特征的融合。
  2. 这里选择的卷积核的维度为1,3,5,首先,1维的卷积核和的作用是为了进行降维和激活。之后设定的卷积的步长为1,在对前一层的结果进行padding,就可以得到相同维度的结果。
  3. 这里增加了3*3的pooling用于提取全局的特征信息。
  4. 整个网络的结构越往后,特征就月抽象,每个特征所涉及的感受域也就越来越大。因此随着层数的增加,33和55的卷积核的比例也就越高。
  5. 最后,模型采用了average pooling来完成结果单额全局信息抽取,在使用全连接层进行输出。

其整体的结果如下图所示:

在这里插入图片描述

7. Residual Network(ResNet残差网络)

残差:指的是在数理统计中实际的观测值和估计值之间的差值。更为准确的,假设我们想要确定一个x,使得f(x)=b,那么在给定一个x的估计值 x 0 x_0 x0,残差就是b-f(x),误差则为x- x 0 x_0 x0

进一步,回到神经网络上,当网络的层数不断加深的时候,会出现退化问题,原因在于随着网络层数的加深,训练变得更加的困难,网络的游湖也变得越来越难,这会使得深层的神经网络的效果没有浅层的神经网络的效果更好。为了解决这个问题,这里我们使用残差网络结构,首先我们来看这种网络结构的示意图:

在这里插入图片描述

上面的结构成维残差块,如上图所示,x表示网络的输入, F ( x ) F(x) F(x)表示残差块在第二层激活函数之前的输出,即 F ( x ) = W 2 δ ( W 1 x ) F(x)=W_2δ(W_1x) F(x)=W2δ(W1x),其中 W 1 , W 2 W_1,W_2 W1,W2表示第一层和第二层的权重, δ δ δ表示激活函数,最后残差块的输出是 δ ( F ( x ) + x ) δ(F(x)+x) δ(F(x)+x)

当没有+x的操作的时候,这个就是一个简单的两层的神经网络的结构,其中的结构可以CNN网络,也可以是普通的全连接网络的结构。假设我们的输出目标是Y,在第二层的激活之前为 H ( x ) H(x) H(x),则我们整个网络的学习目标是 H ( x ) = Y H(x)=Y H(x)=Y,如果使用残差的结构,我们的目标变成了 H ( x ) − Y = F ( x ) H(x)-Y=F(x) H(x)Y=F(x)即可。加入残差网络的优化要比单纯的两层的神经网络的优化要简单。

8. DenseNet

相比于ResNet,DenseNet的方式更为“极端”,在DenseNet中,将当前层前面的所有层的输出作为当前层的输入,在ResNet中,采用的是元素相加的操作方法来实现短路操作,而在DenseNet中,选择的是采用拼接的方式来实现这种“短路”操作。这里我们给出一个图示:
在这里插入图片描述
在DenseNet中每个层会和之前的所有层在通道的维度上进行拼接,作为下一层的输入,对于一个L层的神经网络,DenseNet一共包含 L ( L + 1 ) 2 \frac{L(L+1)}{2} 2L(L+1)个连接。DenseNet的这种拼接操作,实现了特征的重用,提升了计算效率。用公式计算的话有:

传统的网络在l层的输入为:
x l = H l ( x l − 1 ) x_l=H_l(x_{l-1}) xl=Hl(xl1)
在ResNet中,增加了来自前一层的输入:
x l = H l ( x l − 1 ) + x l − 1 x_l=H_l(x_{l-1})+x_{l-1} xl=Hl(xl1)+xl1
在DenseNet中,考虑的是之前所有层的拼接输入:
x l = H l ( [ x 0 , x 1 , . . . , x l − 1 ] ) x_l=H_l([x_0,x_1,...,x_{l-1}]) xl=Hl([x0,x1,...,xl1])

对于DenseNet而言,其整体的架构可以看成是由两个大的模块组成,第一个模块Dense模块和过渡模块(Transition),其中每一个Dense模块是由一系列的卷积层的构成,其输入和输出就是我们上面藐视的方式,而Trainsition模块是用于在两个不同Dense模块之间进行连接,用于过渡信息。

9. 参考

  1. 空洞卷积(dilated convolution)理解
  2. Alexnet中的LRN
  3. GoogleNet神经网络结构
  4. 残差网络(Residual Networks, ResNets)
  5. DenseNet:比ResNet更优的CNN模型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值