《动手学深度学习》第五章 卷积神经网络

5.1 二维卷积层

卷积层实际是使用的是互相关运算,互相关运算和卷积运算是不同的,使用互相关运算和使用卷积运算学习到的卷积核是不同的,是两者之间上下左右翻转的。

自己编写的卷积操作运算
在这里插入图片描述
基于自己编写的卷积操作运算,实现一个自定义的二维卷积层,可以学习网络参数。
声明权重和偏差,具体的操作时先进行互相关运算,再加上偏置项。
在这里插入图片描述

5.2 填充和步幅

默认情况下,步幅为1,不填充。输出形状为
在这里插入图片描述
填充padding,在输入高和宽的两侧填充0.
在这里插入图片描述

注意这里p=2,指的是两侧一共添加的行数,按公式计算是4x4的。

在这里插入图片描述
这里要使得输入和输出大小一样,p应该是1,就是在某一层添加0.

为使得输入输出大小一致,常进行如下设置
在这里插入图片描述
这里如果k是偶数,就在顶端向上取整,在底端向下取整来使得输入输出大小一致。卷积网络常使用奇数大小的卷积核,补零也方便。

例子
在这里插入图片描述
x.view()是对输入维度的改变,因为卷积函数必须按批量输入且设置输入通道数。
注意注意

在网络内置的函数conv2d里的参数padding指的是一侧补零数量,但是计算公式中是两侧的总数,就是计算出来一共需要补2层时,参数里写1.

当卷积核的高和宽不同时,可以设置不同的填充数来使得输入输出大小相同。
在这里插入图片描述
步幅
这里也分别可以设置两个方向上的步幅,计算公式
在这里插入图片描述
注意这里是向下取整,当补零数按之前输入输出大小一样设置时,输出形状还可以简化为
在这里插入图片描述
总结:

  • 填充可以增加输出的高和宽,常用来使输出和输入大小相等
  • 步幅可以减小输出的高和宽。

5.3 多输入通道和多输出通道

多通道输入:明确多通道输入时,卷积核的通道数要和输入的通道数相等,然后出来是单通道的输出。具体运算是对应通道上进行互相关运算,然后将各通道结果相加,不是之前理解的那样。
在这里插入图片描述
多通道输出:明确当多通道输入时,输出通道数是1,想要多通道输出时,需要构建的卷积核形状是四维的,分别是输出通道数 输入通道数 卷积核行数 卷积核列数 ,然后对于单个输出通道,计算过程和上面一样。其计算结果是卷积核的第零个维度的遍历的堆叠。
在这里插入图片描述
1x1的卷积层:如果把通道数当做特征维度,把高和宽维度上的元素当成数据样本,那么1x1卷积层的作用和全连接层等价。
在这里插入图片描述
如上图所示是多通道输入,多通道输出的具体计算过程,卷积核的维度是2x3x1x1,不是之前理解的那种两个1x1,要和输入通道对应进行运算,再加和。
模拟全连接层
在这里插入图片描述
输入
在这里插入图片描述

输出 True

总结:
在这里插入图片描述

5.4 池化层

进行卷积操作识别了图像中的边缘,就是进行图像边缘检测。
池化层目的:缓解卷积层对位置的过度敏感性
最大池化 平均池化 :注意默认情况下,进行池化操作的步幅和池化核大小一样。
和卷积层一样,池化层也可以设置填充和步幅
在这里插入图片描述
输出为
在这里插入图片描述
可手动设置步幅和填充
在这里插入图片描述
计算输出大小的方法也和卷积操作一样。也可以设置非正方形的池化窗口,传入元组,分别指定高和宽上的填充和步幅。
在这里插入图片描述
输出
在这里插入图片描述
对多通道输入数据进行多通道池化
这里和卷积层不一样,多通道池化是分别对每个通道池化,输入输出通道数相同。

5.5 卷积神经网络LeNet

当有池化层时计算网络输出,可以直接思考,比如大小是2,步幅也是2,那输出大小就是原来的一半。也可以按卷积操作中的公式进行计算输出大小,复杂一点的那个公式是向下取整

LeNet是很古老的一个卷积网络,其中包括了卷积层,池化层,一般就是卷积层后面跟池化层,最后输出多通道的矩阵,再过全连接层时将矩阵多通道矩阵拉直成向量,维度就是batch乘以向量,再进行后续操作。

代码里计算损失函数的过程直接计算交叉熵,出来是一个batch的均值,不需要再求和求平均之类的运算,直接反向传播,更新参数也是默认按照一个样本来的。

为什么用卷积网络,不用全连接呢?

因为对于大尺寸的输入图像来说,使用全连接层会使得模型参数量特别大,比如输出为3通道的1000像素的图片,输出256维的向量,网络参数就是3x1000x1000x256,而使用卷积核进行卷积可以实现参数共享,降低参数量

5.6 深度卷积神经网络AlexNet

这个网络是2012年出现的,和LeNet相比,规模更大了,还是卷积层和全连接层的结合,是浅层神经网络和深层神经网络的分界线,是深度学习再度发展起来的起点。这里扩大了卷积核的大小和输出通道数。

深度神经网络的设计思路5.7-5.12

5.7 使用重复元素的网络VGG

思路是:可以通过重复简单的基础块来构建深度模型。
结构:
在这里插入图片描述
VGG组成规律,
在这里插入图片描述
将大卷积核改成若干个小卷积核,感受野不变,但是增加了网络深度,可以学习更复杂的模式,参数还少,能够提升网络效果。
全连接层前面要先将输出拉成向量。
设计启发

简单小块的堆叠;卷积层保持输入大小不变;池化层使其减半;输出通道数每次翻倍。

5.8 网络中的网络NiN

前边两个网络都是卷积层后面加全连接层,然后考虑的是规模上加宽和深度的增加。
这里考虑的是串联由卷积层和全连接层组成的小网络

因为卷积层的输入通常是四维的,即batch数,通道数,高,宽,全连接层输入一般是二维的,即batch数,特征,想要在卷积层后面加全连接层需要改变输入的维度,由于1x1的卷积层可以看做全连接层,不改变输出大小,只是改变通道数,比如之前那个就可以看做9个样本,每个特征维度是3,经过全连接后,每个样本特征维度变成2。

所以这里NiN的部分结构是
在这里插入图片描述
还有一个点是整体结构搭建时,去掉了后边的全连接层,使用另一个NiN块输出十个通道的特征映射,然后进行全局平均池化,得到10维向量,用于后续分类。这样可以减小模型参数的尺寸,缓解过拟合。

5.9 含并行连结的网络GoogLeNet

可以获取并查看网络的一级子模块及名字
在这里插入图片描述
GoogLeNet结构考虑了小模块的串联,并且每个小模块内部并联。
在这里插入图片描述
这个块的输出不改变输入大小,改变输出通道数,这四部分每一部分通道数不同,有比例,是一个有四条线路的子网络,最后合并层是将这些输出按通道级联起来
主体网络结构包括五个块,每个块里包括了上图小模块卷积层最大池化层,最后一个块里使用全局平均池化,然后再拉直转变维度,作为全连接层的输入,输出10维进行分类。

5.10批量归一化BN层

BN层使训练更有效,即非线性更强,因为数据集中在了梯度较大的区域,也防止产生梯度消失问题。

使用位置是在仿射层输出之后,激活函数之前。

对全连接层和卷积层进行批量归一化实质上是不同的
全连接层,对于经仿射层输出的样本,小批量大小为m,对这m个样本求均值和方差,然后由样本均值和方差对其进行标准化,得到结果后再使用两个可学习参数对其进行拉伸和偏移。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
对卷积层做批量归一化

如果卷积的输出有多个通道,需要分别对每个通道求均值和方差,并且每个通道都有自己的拉伸和偏移参数,为标量。我们单看一个通道,一个批量有m个样本,将每个样本的这个通道求均值和方差,然后使用这个相同的均值和方差对其标准化,得到该通道标准化后的输出,再进行本通道的拉伸和偏移,最后综合起来还是多通道的。
测试时的批量归一化

训练时,批量选大一点,得到的均值和方差更准确,但是训练时,单个样本的输出不应取决于随机小批量中计算出来的均值和方差,所以使用移动平均来估计均值和方差在测试时使用,得到固定的输出。

自己编程实现批量归一化层,区分全连接层和卷积层计算方式,区分训练模式和测试模式,测试模式使用滑动平均计算输出。

构建BN层,要输入num_features,全连接层是指节点数,即输出个数,卷积层是通道数,因为要利用这个数生成那两个需要训练的参数,初始化成和输入尺寸一样的。

在pytorch中,BN层分一维和二维,分别对应全连接层卷积层

5.11 残差网络ResNet

也能够防止梯度消失,因为有那个直连通道,具体见第三章笔记里梯度消失和爆炸的讨论。
残差网络的思考,我们不知道网络有多少层是能最好的得到结果的,但是添加层数,使得解空间变大有可能使得性能提升,而且原模型解的空间是新模型解空间的子空间,此时也就是恒等映射。所以提出了残差网络。
在这里插入图片描述
原始残差块的设计

输入经过两个相同输出通道的3x3卷积,然后是BN层,再是激活函数,然后将输入跳过两个卷积层加在激活函数之前,所以经过卷积层以后的大小要和输入时相等,后边才能加(也可以改变输出的高和宽,也是在改变原始输入的通道数时改变,不然后边不能加),如果经过卷积后通道数变了,要改成一样的通道数就需要一个另外的1x1卷积层,再进行相加。
残差网络模型

上面是一个残差块,然后搭建残差网络过程先是一组卷积层,bn层,激活函数,后边是最大池化层,然后这个后面是四个残差块,每个残差块里有两个原始残差块,每个原始残差块里面是两次卷积,所以一共是16次卷积,第一个残差块不改变输出大小和通道数,后边三个残差块,都使得通道数翻倍,大小减半,所以都用到了那个改变通道数的卷积层,也改变输入的大小,这样后边才能加。四个残差块后面是一个全局平均池化,然后是全连接层,输出10类进行分类。

5.12 稠密连接网络DenseNet

在这里插入图片描述

可以看到,稠密块和残差块的区别,稠密块是在通道维度上的连接,直接将输入作为下一级的输出,每一个这个块就会使得通道数增加,但是图像大小不变。

稠密网络搭建主要是稠密块和过渡层来实现的,过渡块用来减小输出通道数以及减小输出特征的尺寸。
稠密块由多个conv_block组成,每个这个块里是BN层 激活函数 二维卷积,前向计算时将每个块的输入和输出在通道维度上连结。

自定义稠密块,设置输入几个卷积块,输入通道数和输出通道数。
在这里插入图片描述
卷积块的通道数被称为增长率。
在这里插入图片描述
过渡层
使用1x1卷积层改变输出通道数,使用池化层减半尺寸。
在这里插入图片描述
比如前面例子中把通道数改成10,大小减半。
在这里插入图片描述
网络模型搭建

  • 前面和残差网络一样,将后面的四个残差块换成四个稠密块,每个稠密块使用了四个卷积层,稠密块里卷积层输出通道数是32,所以每个稠密块将增加128个通道。
  • 在稠密块之间要加上过渡层,使得通道数减半,尺寸也减半。
  • 最后加上全局平均池化全连接层,进行分类。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值