卷积神经网络学习笔记


卷积神经网络(convolution neural network,简称cnn)主要应用于计算机视觉领域,可以说卷积神经网络撑起了现在的计算机视觉领域的半边天。卷积神经网络最大的作用在于对输入的图片进行特征提取。我们知道,人工智能的实现有三驾马车数据、算力、算法,一个算法能不能发挥它的能力,除了与算力相关以外,最关键的就是能否从数据中得到关键的特征。一般情况下这些特征都是我们手动选择的,费时费力,效果还不一定好,而卷积神经网络则可以自动的通过训练来找到那些关键的特征,因此,卷积神经网络通常与其他的算法结合来完成任务。

卷积层

卷积

卷积神经网络的卷积操作其实很简单,只不过是用卷积核与输入图片的相应位置进行内积,然后将内积的结果相加作为输出的一个元素。下面通过一个例子来详细介绍。
假设我们现在有一张图片,它的大小为5x5,同时有一个卷积核,它的大小为3x3(如下图所示)。
在这里插入图片描述
卷积的步骤如下:
  1.找到第一个大小与卷积核相同的区域(下图左上角的3x3矩阵)
  2.将卷积核”放“在该区域上,并与对应元素相乘
  3.将相乘得到的值相加,相加得到的值作为输出矩阵的第一个元素
显然(1x1+1x0+1x1+0x0+1x1+1x0+0x1+0x0+1x1)=4,则4作为输出矩阵的第一个元素。

在这里插入图片描述
接下来的操作跟上面基本一样,只不过我们需要将卷积核移动,并和不同区域进行卷积(如下面的gif所示),通过这样不停的卷积,在遍历完图片以后就可以得到图片的特征数组了,我们一般称之为feature map。

https://pic3.zhimg.com/v2-7fce29335f9b43bce1b373daa40cccba_b.webp

步长(stride)

  上面所演示的卷积过程都是在步长为1的情况下的,而在实际中我们可能会进行不同步长的卷积。所谓步长其实就是卷积核移动的距离,上面的例子中步长为1,那么卷积核在完成一个区域的卷积然后向下一个区域移动的过程中移动的距离就就是一位。
  如果我们设置步长为2的话,卷积核在完成了最开始那个区域的卷积之后就会移动到下图的位置,然后进行卷积。
      在这里插入图片描述
注意,上面展示的只是横轴的移动,而纵轴的移动同样也受到步长的影响。

填充(padding)

所谓填充,其实就是用特定的数字来扩大矩阵的大小,一般这个数字会选为0,原因是为了不干扰图片的特征。
下面展示一下padding为1的情况。
            在这里插入图片描述
可以看到在原来的矩阵外面围上了一层0,矩阵大小变为了7x7。

卷积后的feature map的大小是有公式可以帮助我们快速的计算的
            在这里插入图片描述
其中h表示的就是输出的高,w表示输出的宽,hpre表示输入数组的高,wpre表示输入数组的宽,pad就是填充的大小,f表示卷积核的高或者宽(卷积核高宽都一样,因为它是一个方阵),s表示步长。

三维卷积

前面介绍的都是二维的卷积,然而在实际的应用中我们一般进行的是多维的卷积,因为图片有RGB三个通道(channel),每个通道对应一个二维的数组,这样的三个二维数组组合在一起就成为了三维数组(如下图所示)。
      在这里插入图片描述

三维数组与二维数组的区别是多了通道,因此,为了对三维数组进行卷积,卷积核也应该具有相同的通道数。比如一张RGB图片有三个通道,如果要对这张图片进行卷积的话,卷积核也需要有同样大小的通道。

如下图所示,左边的就是图片的三维数组,中间的两个三维数组就是卷积核。可以看到这里有两个卷积核,每个卷积核都有三个通道,与图片的通道对应。注意,有多少个卷积核就有多少个输出,可以看到两个卷积核对应了两个输出。
在这里插入图片描述
进行多维卷积时,图片的通道与卷积核相应的通道各自进行卷积,然后各个通道的卷积结果按对应元素相加,得到一个单通道的数组。

语言描述起来不太好理解,下面来看个例子。
下图中左边的三个数组是图片的三个R、G、B通道,中间红色的两列数组就是卷积核,其中第一列是第一个卷积核,第二列是第二个卷积核。最右边的两个淡黄色的数组就是输出。
可以看到,图片的各个通道与第一个卷积核对应的通道进行卷积,卷积完以后我们会得到三个数组(每个通道卷积完以后都会得到一个特征数组),然后将这三个数组相加就得到了我们的输出。第二个卷积核进行同样的操作,最后得到第二个输出。
在这里插入图片描述

池化层(pooling layer)

池化层和卷积层一样也有一个kernel,但这个kernel没有参数,它的作用是从卷积层提取得到的feature map中筛选特征,这样做不仅能进一步提取关键的特征,还可以减少feature map的大小。

最大池化(max pooling)

假设我们现在得到了一个4x4大小的feature map,而最大池化层的kernel大小为2x2,步长s为2。
在这里插入图片描述

我们的做法和前面的卷积很相似
  1.首先kernel移到feature map的左上角对应的2x2大小的区域
          在这里插入图片描述

  2.从这个区域的所有元素中找出最大的元素,从上图可以看到左上角的2x2大小的区域中最大的元素是9
  3.得到新的feature map的一个元素,在这里是9。经过池化以后得到的新feature map的大小仍可以用之前的公式进行计算,在这个例子中kernel大小为2x2,padding=0,stride=2,那么通过式子可以算出新的feature map大小为2x2。
           在这里插入图片描述
  4.kernel向左平移2(stride=2),在feature map对应的区域(如下图所示)中找到最大值,很显然是2。
            在这里插入图片描述
通过以上的方式,得到经过了最大池化以后的新feature map
            在这里插入图片描述
另外有一点需要注意的是与卷积不同,经过池化以后feature map的通道数不会改变。比如进行池化前的feature map通道数为2,那么池化以后得到的新的feature map的通道数也是2。也就是说各个通道的池化是相互独立的,在各通道池化完成以后不需要像卷积那样将结果相加。

平均池化(average pooling)

懂得了最大池化以后,平均池化就很好理解了,只不过是把求最大值变成了求平均值。
同样据上面的例子,设kernel大小为2x2,步长s为2,对下图的feature map进行平均池化。
          在这里插入图片描述
很显然,第一个区域(如下图所示)包含1、3、2、9这四个数,那么它们的平均数就是3.75,除了将求最大值变为求平均值以外,其他所有操作都和上面的最大池化一致,这里就不再赘述。
              在这里插入图片描述

多通道的池化与单通道池化差不多,只不过是每一个通道分别进行池化。注意,池化与卷积不同,池化层中输入数组有多少个通道那么输出就有多少个。

参考资料

YJango的卷积神经网络——介绍
DeepLearingAi

猜你喜欢

转载自blog.csdn.net/qq_51182466/article/details/121462185