《TensorFlow 2.0深度学习算法实战教材》学习笔记(九、卷积神经网络)

全连接网络的问题

局部相关性

网络层的每个输出节点都与所有的输入节点相连接,用于提取所有输入节点的特征信息,这种稠密(Dense)的连接方式是全连接层参数量大、计算代价高的根本原因。全连接层也称为稠密连接层(Dense Layer),当全连接层的激活函数𝜎为空时,全连接层也称为线性层(Linear Layer):
在这里插入图片描述
其中𝑛𝑜𝑑𝑒𝑠(𝐼)表示I 层的节点集合。

基于距离的重要性分布假设称为局部相关性,它只关注和自己距离较近的部分节点,而忽略距离较远的节点。利用局部相关性的思想,我们把感受野窗口的高、宽记为k(感受野的高、宽可以不相等,为了便与表达,我们只讨论高宽相等的情况),当前位置的节点与大小为k 的窗口内的所有像素相连接,与窗口外的其他像素点无关,此时网络层的输入输出关系表达如下:
在这里插入图片描述
其中𝑑𝑖𝑠𝑡(𝑖 𝑗)表示节点𝑖 𝑗之间的欧式距离。

权值共享

通过运用局部相关性和权值共享的思想,我们成功把网络的参数量从‖𝐼‖ ∗ ‖𝐽‖减少到𝑘 ∗ 𝑘(准确地说,是在单输入通道,单卷积核的条件下)。这种局部连接、共享权值的网络其实就是卷积神经网络。

卷积

卷积的“卷”是指翻转平移操作,“积”是指积分运算。

在深度学习中,权值函数𝑔(𝑚 𝑛)称为卷积核(Kernel),其他资料也叫Filter,Weight 等。

卷积核即是窗口为k 大小的权值矩阵W,对应到图上大小为k 的窗口即为感受野。

卷积神经网络

卷积核

在多通道输入的情况下,卷积核的通道数需要和输入X 的通道数量相匹配。

输入通道的通道数量决定了卷积核的通道数。一个卷积核只能得到一个输出矩阵,无论输入X 的通道数量。

一个固定的卷积核只能完成某种逻辑的特征提取,当需要同时提取多种逻辑特征时,可以通过增加多个卷积核来得到多种特征,提高神经网络的表达能力,这就是多通道输入,多卷积核的情况。

步长

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

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

填充

为了让输出O的高宽能够与输入X 的相等,一般通过在原输入X的高和宽维度上面进行填充(Padding)若干无效元素操作,得到增大的输入X′。

卷积层实现

在 TensorFlow 中,既可以通过自定义权值的底层实现方式搭建神经网络,也可以直接调用现成的卷积层类的高层方式快速搭建复杂网络。

自定义权值

在 TensorFlow 中,通过tf.nn.conv2d 函数可以方便地实现2D 卷积运算。tf.nn.conv2d基于输入X: [b, ℎ, 𝑤, 𝑐𝑖𝑛] 和卷积核W: [𝑘, 𝑘, 𝑐𝑖𝑛, 𝑐𝑜𝑢𝑡] 进行卷积运算,得到输出O:[b, ℎ′, 𝑤′, 𝑐𝑜𝑢𝑡] ,其中𝑐𝑖𝑛表示输入通道数,𝑐𝑜𝑢𝑡表示卷积核的数量,也是输出特征图的通道数。

out = tf.nn.conv2d(x,w,strides=1,padding=[[0,0],[0,0],[0,0],[0,0]])

其中padding 参数的设置格式为:
padding=[[0,0],[上,下],[左,右],[0,0]]

例如,上下左右各padding 一个单位,则padding=[[0,0],[1,1],[1,1],[0,0]],

padding=same 只有在strides=1 时才是同大小,当𝑠 > 时,设置padding='SAME’将使得输出高、宽将成1/𝑠倍地减少

卷积层类

在TensorFlow 中,API 的命名有一定的规律,首字母大写的对象一般表示类,全部小写的一般表示函数,如layers.Conv2D 表示卷积层类,nn.conv2d 表示卷积运算函数。

如果卷积核高宽不等,步长行列方向不等,此时需要将kernel_size 参数设计为(𝑘ℎ ,𝑘𝑤),strides 参数设计为(𝑠ℎ, 𝑠𝑤).如下创建4 个3x4 大小的卷积核,竖直方向移动步长𝑠ℎ = 2,水平方向移动步长𝑠𝑤 =1 :

layer = layers.Conv2D(4,kernel_size=(3,4),strides=(2,1),padding='SAME')

表示学习

通过将每层的特征图利用反卷积网络(Deconvolutional
Network)映射回输入图片.

从表示学习的角度来理解,卷积神经网络通过层层堆叠来逐层提取特征,网络训练的过程可以看成特征的学习过程,基于学习到的高层抽象特征可以方便地进行分类任务。

应用表示学习的思想,训练好的卷积神经网络往往能够学习到较好的特征,这种特征的提取方法一般是通用的。。基于这种思想,可以将在任务A 上训练好的深层神经网络的前面数个特征提取层迁移到任务B 上,只需要训练任务B 的分类逻辑(表现为网络的最末数层),即可取得非常好的效果,这种方式是迁移学习的一种,从神经网络角度也称为网络微调(Fine-tuning)。

池化层

在卷积层中,可以通过调节步长参数s 实现特征图的高宽成倍缩小,从而降低了网络的参数量。实际上,除了通过设置步长,还有一种专门的网络层可以实现尺寸缩减功能,它就是我们要介绍的池化层(Pooling layer)。

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

BatchNorm 层

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

2015 年,Google 研究人员Sergey Ioffe 等提出了一种参数标准化(Normalize)的手段,并基于参数标准化设计了Batch Nomalization(简写为BatchNorm,或BN)层 (Ioffe &Szegedy, 2015)。BN 层的提出,使得网络的超参数的设定更加自由,比如更大的学习率,更随意的网络初始化等,同时网络的收敛速度更快,性能也更好。BN 层提出后便广泛地应用在各种深度网络模型上,卷积层、BN 层,ReLU 层、池化层一度成为网络模型的标配单元,通过堆叠Conv-BN-ReLU-Pooling 方式往往可以获得不错的模型性能。

为了提高BN 层的表达能力,BN 层作者引入了“scale and
shift”技巧,将𝑥̂变量再次映射变换:
在这里插入图片描述
其中𝛾参数实现对标准化后的𝑥̂再次进行缩放,𝛽参数实现对标准化的𝑥̂进行平移,不同的是,𝛾 𝛽参数均由反向传播算法自动优化,实现网络层“按需”缩放平移数据的分布的目的。

经典卷积网络

从 2012 年AlexNet (Krizhevsky, Sutskever, & Hinton, 2012)的提出以来,各种各样的深度卷积神经网络模型相继被提出,其中比较有代表性的有VGG 系列 (Simonyan &Zisserman, 2014),GoogLeNet 系列 (Szegedy, 以及其他人, 2015),ResNet 系列 (He, Zhang,Ren, & Sun, 2015),DenseNet 系列 (Huang, Liu, & Weinberger, 2016)等,他们的网络层数整体趋势逐渐增多。

AlexNet

AlexNet 的创新之处在于:

  • 层数达到了较深的8 层
  • 采用了 ReLU 激活函数,过去的神经网络大多采用Sigmoid 激活,计算相对复杂,容易出现梯度弥散现象
  • 引入 Dropout,Dropout 提高了模型的泛化能力,防止过拟合
    在这里插入图片描述

VGG 系列

VGG 系列网络的创新之处在于:

  • 层数提升至19 层
  • 全部采用更小的3x3 卷积核,相对于AlexNet 中7x7 的卷积核,参数量更少,计算代价更低
  • 采用更小的池化层2x2 窗口和步长s=2,而AlexNet 中是步长s 为2,3x3 的池化窗口
    在这里插入图片描述

GoogLeNet

GoogLeNet 网络采用模块化设计的思想,通过大量堆叠Inception 模块,形成了复杂的网络结构。如下图 10.47 所示,Inception 模块的输入为X,通过4 个子网络得到4 个网络输出,在通道轴上面进行拼接(Concatenation),形成Inception 模块的输出。这4 个子网络是:

  • 1x1 卷积层
  • 1x1 卷积层,再通过一个3x3 卷积层
  • 1x1 卷积层,再通过一个5x5 卷积层
  • 3x3 最大池化城,再通过1x1 卷积层
    在这里插入图片描述
    GoogLeNet 的网络结构如图 10.48:
    在这里插入图片描述

卷积层变种

空洞卷积

空洞卷积在不增加网络参数的条件下,提供了更大的感受野窗口。
在 TensorFlow 中,可以通过设置layers.Conv2D()类的dilation_rate 参数来选择使用普通卷积还是空洞卷积:

In [8]:
x = tf.random.normal([1,7,7,1]) # 模拟输入
# 空洞卷积,1 个3x3 的卷积核
layer = layers.Conv2D(1,kernel_size=3,strides=1,dilation_rate=2)
out = layer(x) # 前向计算
out.shape
Out[8]: TensorShape([1, 3, 3, 1])

当dilation_rate 参数设置为默认值1 时,使用普通卷积方式进行运算;当dilation_rate 参数大于1 时,采样空洞卷积方式进行计算。

转置卷积

转置卷积(Transposed Convolution,或Fractionally Strided Convolution,部分资料也称之为反卷积/Deconvolution,实际上反卷积在数学上定义为卷积的逆过程,但转置卷积并不能恢复出原卷积的输入,因此称为反卷积并不妥当)通过在输入之间填充大量的padding 来实现输出高宽大于输入高宽的效果,从而实现向上采样的目的.
在这里插入图片描述
转置卷积具有“放大特征图”的功能,在生成对抗网络、语义分割等中得到了广泛应用.

分离卷积

这里以深度可分离卷积(Depth-wise Separable Convolution)为例.

分离卷积的计算流程则不同,卷积核的每个通道与输入的每个通道进行卷积运算,得到多个通道的中间特征,如图 10.61 所示。这个多通道的中间特征张量接下来进行多个1x1 卷集核的普通卷积运算,得到多个高宽不变的输出,这些输出在通道轴上面进行拼接,从而产生最终的分离卷积层的输出。可以看到,分离卷积层包含了两步卷积运算,第一步卷积运算是单个卷积核,第二个卷积运算包含了多个卷积核。
在这里插入图片描述
在这里插入图片描述

深度残差网络

AlexNet,VGG,GoogLeNet 等网络模型的出现将神经网络的发展带入了几十层的阶段,研究人员发现网络的层数越深,越有可能获得更好的泛化能力。但是当模型加深以后,网络变得越来越难训练,这主要是由于梯度弥散现象造成的。在较深层数的神经网络中间,梯度信息由网络的末层逐层传向网络的首层时,传递的过程中会出现梯度接近于0的现象。网络层数越深,梯度弥散现象可能会越严重。

那么怎么解决深层神经网络的梯度弥散现象呢?一个很自然的想法是,既然浅层神经网络不容易出现梯度弥散现象,那么可以尝试给深层神经网络添加一种回退到浅层神经网络的机制。当深层神经网络可以轻松地回退到浅层神经网络时,深层神经网络可以获得与浅层神经网络相当的模型性能,而不至于更糟糕。

通过在输入和输出之间添加一条直接连接的Skip Connection 可以让神经网络具有回退的能力。以VGG13 深度神经网络为例,假设观察到VGG13 模型出现梯度弥散现象,而10 层的网络模型并没有观测到梯度弥散现象,那么可以考虑在最后的两个卷积层添加SkipConnection,如图 10.62 中所示:通过这种方式网络模型可以自动选择是否经由这两个卷积层完成特征变换,还是直接跳过这两个卷积层而选择Skip Connection,亦或结合两个卷积层和Skip Connection 的输出。
在这里插入图片描述

ResNet 原理

ResNet 通过在卷积层的输入和输出之间添加Skip Connection 实现层数回退机制,如下图 10.63 所示,输入𝑥通过两个卷积层,得到特征变换后的输出ℱ(𝑥),与输入𝑥进行对应元素的相加运算,得到最终输出

ℋ(𝑥) = 𝑥 + ℱ(𝑥)

ℋ(𝑥)叫做残差模块(Residual Block,ResBlock)。由于被Skip Connection 包围的卷积神经网络需要学习映射ℱ(𝑥) = ℋ(𝑥) − 𝑥,故称为残差网络。
在这里插入图片描述

DenseNet

Skip Connection 的思想在ResNet 上面获得了巨大的成功,研究人员开始尝试不同的Skip Connection 方案,其中比较流行的就是DenseNet (Huang, Liu, & Weinberger, 2016)。DenseNet 将前面所有层的特征图信息通过Skip Connection 与当前层输出进行聚合,与ResNet 的对应位置相加不同,DenseNet 采用在通道轴c 维度进行拼接操作,聚合特征信息。

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

汀桦坞

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

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

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

打赏作者

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

抵扣说明:

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

余额充值