Loading

6.卷积神经网络

1- 卷积层

1.1- 卷积层的作用一

在说卷积层之前, 我想先说一下为什么会有卷积层; 前面几个博客提到的神经网络都是用矩阵乘法来建立输入和输出之间的关系, 如果有n个输入和m个输出, 那么就需要n*m个参数; 如果n和m很大并且有多个全连接层的话需要的参数数量是庞大的; 卷积层就是通过三个特性来解决这个问题: 稀疏连接, 参数共享, 平移不变性;

1.1.1- 稀疏连接

假设有n个输入ai和m个输出bi, 对于全连接层, 输出bi是由n个输入共同决定的, 这也是参数需求量大的原因, 而对于卷积层, bi则是由局部的输入来决定;
输入一个二维矩阵, 卷积的稀疏连接实现主要是来源于卷积核, 卷积核也是一个二维矩阵, 但是其大小要远小于输入的矩阵大小, 然后用滑窗的形式遍历整个输入矩阵得到输出矩阵, 而输出矩阵的每个元素都是由卷积核大小的局部输入矩阵决定的;

1.1.2- 参数共享

参数共享是指在一个模型的多个函数中使用相同的参数; 在全连接层中, 计算每层输出时, 权重矩阵中的元素只作用于某一个输入元素一次; 而在卷积神经网络中, 输出矩阵的每个元素都是由同一个卷积核和不同的局部输入矩阵得到的; 根据参数共享的思想, 我们只需要学习一组参数集合, 而不需要针对每一个位置的每一个参数进行优化学习;

1.1.3- 平移不变性

如果一个函数的输入做了一些改变, 那么输出也跟着做出同样的改变, 这就是平移不变性; 平移不变性是由参数共享的物理意义所得; 在计算机视觉中, 假如要识别一个图片中是否有一只猫, 那么无论这只猫在图片的什么位置, 我们都应该识别出来, 即就是神经网络的输出对于平移不变性来说是等变的;

1.2- 卷积层的作用二

卷积可以提取出图像中的特征,这些特征可以用来进行图像分类和识别。因为卷积可以捕捉到输入中的局部信息,比如边缘、形状、纹理等,这些信息对于区分不同的物体是非常重要的。卷积还可以通过叠加多个卷积核来生成多个特征图(或特征层),从而提取出更高层次和更抽象的特征。

1.2.1- 示例: 垂直边缘检测

X = torch.ones((6, 8)) #构造一个6X8像素的黑白图像
X[:, 2:6] = 0 #2到6列为黑, 其余为白
X
K = torch.tensor([[1.0, -1.0]]) #一个1X2的卷积核
Y = corr2d(X, K)
Y
tensor([[1., 1., 0., 0., 0., 0., 1., 1.], 
        [1., 1., 0., 0., 0., 0., 1., 1.], 
        [1., 1., 0., 0., 0., 0., 1., 1.], 
        [1., 1., 0., 0., 0., 0., 1., 1.], 
        [1., 1., 0., 0., 0., 0., 1., 1.], 
        [1., 1., 0., 0., 0., 0., 1., 1.]])

tensor([[ 0., 1., 0., 0., 0., -1., 0.], 
        [ 0., 1., 0., 0., 0., -1., 0.], 
        [ 0., 1., 0., 0., 0., -1., 0.], 
        [ 0., 1., 0., 0., 0., -1., 0.], 
        [ 0., 1., 0., 0., 0., -1., 0.], 
        [ 0., 1., 0., 0., 0., -1., 0.]])

输出Y中1表示从白色到黑色的边缘, -1表示从黑色到白色的边缘

1.3- 卷积层的作用三

卷积可以增加网络的非线性,提高网络的表达能力和泛化能力。因为卷积后通常会接一个非线性激活函数,比如ReLU,这样可以使网络能够学习更复杂的函数,并且避免过拟合的问题。

1.4- 卷积层的缺点

  1. 卷积会导致空间信息的损失。因为卷积是在局部区域上进行的,它会忽略掉全局的信息和结构。比如,在图像识别中,卷积可能只能检测到物体的局部特征,而不能识别物体的整体形状和位置。这就需要增加更多的卷积层和滤波器来提高感受野,但这也会增加模型的复杂度和计算量。
    补充一下: 滤波器就是卷积核, 感受野是指对于某一层的一个元素x, 在其先前层中所有会影响到x的运算的元素称为x的感受野; eg: 卷积核大小为2x2, 那么输出中的某个元素x就与输入的某个2x2的区间的元素有关, 如果输入也是某个卷积层的输出, 那么x就与前一个卷积层的输入也有个, 也是x的感受野;
  2. 卷积会导致平移不变性, 只要输入数据中存在某些特征,卷积就能检测到它们。这在一些场景下是有用的,比如图像分类和语音识别,但在一些场景下是不利的,比如图像分割和目标检测。因为在这些场景下,我们需要知道物体的具体位置和大小,而不仅仅是它们是否存在。

1.5- 扩展应用

1.5.1- 1x1的卷积核有什么用

使用1x1卷积核的卷积层在形式上看是一种特殊的全连接层, 具体作用如下

  1. 调节通道数:1*1的卷积核可以在不改变特征图的高度和宽度的情况下,改变特征图的通道数。这样可以实现对数据的压缩或扩展,也可以减少参数量和计算量。
  2. 增加非线性:1*1的卷积核可以在每个通道上进行线性变换,然后再通过一个非线性激活函数,从而增加网络的非线性表达能力。
  3. 跨通道信息交互:1*1的卷积核可以实现不同通道之间的信息整合,相当于对每个像素点进行全连接操作,从而提取更丰富的特征。

1.5.2- 卷积层的堆叠

既然卷积层和池化层都会损失空间信息, 但是为什么很多模型会选择把很多卷积层堆叠在一起?

1.5.2.1- 优点

  1. 可以提取多级特征表示。每个卷积层都能学习到一定级别的特征表示,堆叠多个卷积层可以提取不同粒度的特征映射,形成多级特征表达,有利于学习数据的复杂模式。
  2. 可以增加模型学习能力。堆叠的卷积层数量越多,网络的参数和深度也越大,模型的学习表达能力就越强,可以拟合更复杂的函数。
  3. 可以构建深层网络。卷积层的堆叠是一个构建深度网络的重要手段,如VGGNet、ResNet等通过重复堆叠卷积层构建了很深的模型。
  4. 可以扩大感受野。堆叠卷积层可以使感受野越来越大,有利于捕获更全局的信息。

1.5.2.2- 缺点

  1. 可能会损失一些空间信息。卷积层通常会使用填充、步幅、池化等操作来调整输出的大小,这些操作可能会导致一些空间信息的丢失或模糊。
  2. 可能会增加计算量和参数量。卷积层的堆叠会增加网络的复杂度,需要更多的计算资源和存储空间,也可能导致过拟合或梯度消失等问题。



2- 池化层

2.1- 池化层的作用

同样, 我们先说一下为什么一般要在卷积层后面接一个池化层, 它解决了卷积层的哪些问题:

  1. 池化层可以进一步减小参数数量, 提高运算速度;
  2. 池化层可以增大网络的感受野, 使网络捕捉到更大范围和更高层次的特征;
  3. 卷积层的位置敏感性过强,导致模型对输入数据的位置变化过于敏感,降低模型的泛化能力和鲁棒性。池化层可以增强网络的不变性,使网络更关注是否存在某些特征而不是特征具体的位置,从而提高模型的泛化能力和鲁棒性 。

其中第3点是最主要的问题, 就以前面的垂直边缘检测为例, 现实情况很难实现绝对的垂直, 可能会有一两个像素点的抖动, 但是卷积层会敏感地识别到这些误差, 所以此时可以接一个池化层用来过滤掉这些误差;
这里要理解清楚卷积层平移不变性和位置敏感性之间的区别, 平移不变性是因为输入的每个局部都是用的同一个卷积核, 所以就算识别对象向各个方向平移, 最后还是会被该卷积核处理, 得到的结果不会因为位置的不同而不同; 而位置敏感性是因为卷积核会对每个局部进行处理, 而淡化了整体性, 所以局部的一些小误差会被识别到;

2.2- 池化层的缺点

  1. 由池化层的操作很明显可以看出池化层进一步导致了空间信息的损失
  2. 对位置的不敏感是一把双刃剑, 在某些应用上可能需要对位置的敏感性



3- 批量归一化

3.1- 为什么要用批量归一化

在神经网络的训练开始前我们通常会对输入进行归一化处理, 因为当训练数据和测试数据满足相同分布时, 由训练数据得到模型会获得一个较好的效果; 所以我们在把数据喂给模型时会进行预处理; 如果每批训练数据的分布都不一样, 那么网络每次迭代时都要去适应不同的分布, 这将大大降低训练速度;

同样的, 随着模型训练的进行, 每层的参数也会跟着更新, 前一层参数的变化就会影响后一层输入数据的分布, 这样各层在训练时就要不断的适应新的分布; 所以即使我们对最开始的输入数据做了标准化, 训练中参数的变化依旧会影响数据的分布; 只要网络的前面几层发生微小的改变,那么这些微小的改变在后面的层就会被累积放大下去; 如果训练过程中,训练数据的分布一直在发生变化,那么将不仅会增大训练的复杂度,影响网络的训练速度而且增加了过拟合的风险。

所以在模型训练时,在应用激活函数之前,先对一个层的输出进行归一化,将所有批数据强制在统一的数据分布下,然后再将其输入到下一层,使整个神经网络在各层的中间输出的数值更稳定。从而使深层神经网络更容易收敛而且降低模型过拟合的风险。

3.2- 批量归一化是如何实现的

深层神经网络中非线性激活函数输入值,随着网络深度加深或者在训练过程中,其整体分布逐渐往非线性函数的取值区间的上下限两端靠近,这会导致反向传播时低层神经网络的梯度消失,BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0, 方差为1的标准正态分布,使得激活输入值落在非线性函数对输入比较敏感的线性区域,其对应的导数远离导数饱和区,这样输入的小变化就会导致损失函数较大的变化,避免梯度消失问题产生,学习收敛速度快,能大大加快训练速度。

3.3- 在哪使用批量归一化

批量归一化是卷积神经网络中一个可选单元,如果使用BN能够保证训练速度更快,同时还可以具备一些正则化功能。在卷积神经网络中卷积层和全连接层都可以使用批量归一化。它一般作用在卷积层和全连接层的输出后, 激活函数的输入前, 对卷积层的每一个通道的特征图进行归一化; 还有卷积层和全连接层的输入前;

posted @ 2023-10-18 17:03  mostimali  阅读(52)  评论(0编辑  收藏  举报