深入理解深度学习中的卷积和feature map

        虽然深度学习和CNN的概念已经传遍大街小巷,本文还是说一说CNN中的卷积。
       本文主要介绍卷积层的结构。下图显示了CNN中最重要的部分,这部分称之为过滤器(filter)或内核(kernel)。因为TensorFlow官方文档中将这个结构称之为过滤器(filter),故在本文中将统称这个结构为过滤器。如下图1所示,过滤器可以将当前层网络上的一个子节点矩阵转化为下一层神经网络上的一个单位节点矩阵。单位节点矩阵指的是长和宽都是1,但深度不限的节点矩阵。

图1:卷积层过滤器(filter)结构示意图
       在一个卷积层中,过滤器所处理的节点矩阵的长和宽都是由人工指定,此节点矩阵的尺寸也称之为过滤器的尺寸。常用的过滤器尺寸有3*3或5*5。因为过滤器处理的矩阵深度和当前层神经网络的深度是一致的,所以虽然节点矩阵是三维的,但是过滤器的尺寸只需要指定两个维度。
       过滤器中另外一个需要人工指定的设置处理得到的单位节点矩阵的深度,此设置称为过滤器的深度(此深度=过滤器的个数=feature map的个数)。
       注意过滤器的尺寸指的是一个过滤器输入节点矩阵的大小,而深度指的是输出单位节点矩阵的深度。如图1中,左侧小矩阵的尺寸为过滤器的尺寸,而右侧单位矩阵的深度为过滤器的深度。
       这里参考一篇文章A gentle dive into the anatomy of a Convolution layer.
       链接:https://pan.baidu.com/s/1pLoQwGz
       此文阐述了卷积层的一个特定的解剖特征。许多卷积架构是从一个外部卷积单元开始的,它将信道RGB的输入图像映射到一系列内部过滤器中。在当下最通用的深度学习框架中,这个代码可能如下所示:
       out_1=Conv2d(input=image, filter=32, kernel_size=(3,3), strides=(1,1));//卷积层
       relu_out=relu(out_1);                                                           //利用激活函数ReLU去线性化
       pool_out=MaxPool(relu_out, kernel_size=(2,2), strides=2);//最大池化降维
       很容易理解,上面的结果是一系列的具有32层深度的过滤器。我们不知道的是,该如何将具有3个信道的图像精确地映射到这32层中!另外,我们也不清楚该如何应用最大池(max-pool)操作符。例如,是否一次性将最大池化应用到了所有的过滤层中以有效地生成一个单一的过滤映射?又或者,是否将最大池独立应用于每个过滤器中,以产生相同的32层的池化过滤器?
       具体如何做的呢?
       一图胜千言,下图可以显示上述代码片段中所有的操作。

图2:卷积层的应用
       观察上图,可以看到最显著的一点是,步骤1中的每个过滤器(即Filter-1、Filter-2……)实际上包含一组3个权重矩阵(Wt-R、Wt-G和WT-B)。每个过滤器中的3个权重矩阵分别用于处理输入图像中的红(R)、绿(G)和蓝(B)信道。在正向传播期间,图像中的R、G和B像素值分别与Wt-R、Wt-G和Wt-B权重矩阵相乘以产生一个间歇激活映射(intermittent activation map)(图中未标出),然后将这3个权重矩阵的输出(即3个间歇激活映射)相加以为每个过滤器产生一个激活映射(activation map)。
       随后,这些激活映射中的每一个都要经过激活函数ReLu去线性化,最后到最大池化层,而后者主要为激活映射降维。最后,我们得到的是一组经过激活函数和池化层处理后的激活映射,现在其信号分布在一组32个(过滤器的数量)二维张量之中(也具有32个feature map,每个过滤器会得到一个feature map)。
       来自卷积层的输出经常用作后续卷积层的输入。因此,如果我们的第二个卷积单元如下:
       conv_out_2 = Conv2d(input = relu_out,filters = 64)
       那么框架就需要实例化64个过滤器,每个过滤器使用一组32个权重矩阵。

[1]参考书籍《Tensorflow实战Google深度学习框架》
Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐