6.卷积神经网络

发布时间 2023-10-18 17:08:51作者: mostimali

卷积层的作用一

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

稀疏连接

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

参数共享

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

平移不变性

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

卷积层的作用二

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

示例: 垂直边缘检测

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表示从黑色到白色的边缘

卷积层的作用三

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

卷积层的缺点

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



池化层的作用

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

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

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