想要理解CNN中关于卷积的操作,需要先了解tensorflow中关于张量的定义和神经网络中的“卷积”,这里卷积加双引号是为了区别于数学上的卷积,神经网络里的卷积实际上是互相关,这二者的区别主要在于卷积实际上需要把卷积核顺时针旋转180度然后再做点乘。下文的卷积均代指神经网络的卷积(即互相关)。
如果你已经理解了张量和卷积操作,请直接跳到第三部分 阅读tensorflow框架下,CNN中关于卷积核(kernel)、过滤器(filter)、通道(channel)、特征图(feature map)的概念解释。
一、张量
首先,关于张量的图形解释,可以参考张平的《图解深度学习与神经网络——从张量到TensorFlow实现》,其中对于张量定义、操作和卷积进行了图解,较为形象,建议阅读,有需求本书电子版的朋友可以私信我。
以下引用一下该书中与本文相关的主要内容:
二、卷积
书中对于张量的数据结构给出了十分形象的图示,为了更好地理解CNN中的卷积操作,理解这些是必不可少的。
再来说神经网络中的卷积操作,由于运算时参与的是张量,因此实际上我们采用的是离散卷积。卷积实际上分为full卷积、same卷积和valid卷积三种,用过matlab卷积命令的同学相信对此想必有所了解。
话不多说,继续上图。以最常用的二维卷积为例。
大家都看完了吧,总结一下。
设图片的大小为(N1,N1),卷积核的大小为(N2,N2),滑动步长均为1。
full卷积:卷积滑动从卷积核右下角与图片左上角元素重叠开始,卷积结果的大小为(N1+N2-1,N1+N2-1);
same卷积:卷积滑动以卷积核锚点与图片左上角重叠开始,卷积结果的大小为(N1,N1);
valid卷积:卷积滑动从卷积核左上角与图片左上角重叠开始,卷积结果的大小为(N1-N2+1,N1-N2+1)。
卷积时均是以从左向右,从上向下的顺序滑动,卷积时图片扩展无元素的区域补0。
原书中对于这部分解释更详细,需要进一步了解的可以自己翻翻看。
我们在CNN中进行二维卷积时,普遍采用的是valid卷积,因为valid卷积后可以减小特征图的尺寸,因此可以通过更深的卷积神经网络使特征图中单个元素的感受野变得更加广阔,从而捕捉输入上更大尺寸的特征,如果对于CNN卷积中卷积核、过滤器、特征图概念比较了解的朋友,可以看这个,其解释了感受野广阔的原因,特征图和感受野。
而full卷积常被用来进行反卷积,是上采样的手段之一。
对于上采样中反卷积感兴趣的同学,请看怎样通俗易懂地解释反卷积? - 孙小也的回答 - 知乎
卷积核锚点:
CNN卷积操作时大多数采用的都是奇数卷积核,也就是3×3、5×5这样奇数大小的卷积核,当采用奇数卷积核时,其锚点就是中心的那个元素。之所以不使用偶数卷积核,这在“Convolution with even-sized kernels and symmetric padding” 这篇论文,解释了偶数卷积核对网络的影响,在普通的分类任务中用偶数卷积核,偶数卷积之所以结果更差,是因为偶数卷积会使得feature map偏移,即“the shift problem”,这将导致学习到的feature不具备更强的表征能力。
三、tensorflow框架下关于卷积核、过滤器、通道和特征图的解释
重头戏来了,翻看中文社区中对于这方面的解释大多比较笼统或者具有一定误导性。想要理解这些概念,找寻你所学习框架下关于架构卷积网络API的参数解释或许是一种解决思路。
首先,补充两个概念:
①在部分书本或文章中有一类二维卷积——含深度的二维卷积,实际上应该称为多通道二维卷积。此处的深度并不准确,容易与三维卷积中的深度概念混淆,后续以多通道二维卷积称呼。
②在tensorflow框架下tf.nn.Conv2D或3D这一类实际上没有卷积核(kernel)这个参数,而是过滤器(filter)。但如果参考tf.keras.layers.Conv2D这一类会发现仍是有卷积核的概念。为了便于理解,后续仍然采用卷积核+过滤器进行解释。
我们以某一卷积层的角度来分析:
通道(channel)
说到通道就不得不提多通道卷积,其是相对于单通道卷积的概念。多通道卷积时,卷积核各通道同步滑动,卷积核的各通道与输入特征图的对应通道同步卷积,并进行加和。如下图所示,当只有一个卷积核时多通道卷积的结果始终是单通道的输出特征图;同理,当有N个卷积核时,卷积结果便是N通道的输出特征图。
二维多通道卷积与三维单通道卷积的区别
相较于二维卷积,三维卷积多了一个depth维度,其可以是视频的连续帧或立体图像的切片。从概念上看,二者存在一定的相似度,其主要区别在于卷积核的移动范围——三维单通道卷积的卷积核在输入3D图像的三个维度(depth,height,width)上均进行了滑窗操作,而二维卷积始终是在两个维度上进行滑窗。
从效果上来说,二维多通道卷积不同通道上的卷积核参数是不同的(如上图所示);而三维单通道的一个卷积核本身就是3D的,其参数在整个输入图像上是相同的。三维单通道的示意如下所示。
特征图(feature map)
即数据的存储图,每个卷积层都包含输入特征图(Input)和输出特征图(Output)。其包含高度、宽度、深度三个维度和通道数(channels)、批量尺寸(batch)两个参数(维度)。其shape为[f_batch, (f_depth), f_height, f_width, f_channels],( )中表示仅3d卷积具有。需要注意最开始的输入特征图的通道数取决于图片类型,如RGB是3通道。
卷积核(kernel)
包含高度(height)、宽度(width))、深度(depth)三个维度,并包含一个参数(维度):通道数(channels),其中深度这一维度只有在三维卷积时才有实际意义。
过滤器(filter)
包含卷积核的所有参数(维度),并附加一个参数(维度):卷积核个数。其shape为[(filter_depth), filter_height, filter_width, in_channels, out_channels]。其中in_channels便是kernel里的通道数,因为只有卷积核通道数跟输入特征图的通道数相匹配才能进行多通道卷积;out_channels便是filter里的卷积核个数,因为输出特征图的通道数等于卷积核的个数。
【注】再次强调tensorflow下的CNN只采用filter的概念,而没有kernel,这里引用kernel只是为了便于理解。很多文章里描述filter和kernel的关系为:filter是具有深度的kernel,注意此处的深度并非三维卷积核的深度维度,而是多通道的概念,这一点实际上与本文的说法相同。
再附上一张图,比较粗糙。
这个是tensorflow2下二维卷积的参数表,tensorflow1下的除了部分参数名换了,没有本质的区别。