feature map: 首先,介绍下什么是CNN的feature map,我觉得叫特征映射最合适,如图为AlexNet的结构图,输入的是一个224*224*3的RGB图像,通过卷积层和池化层进行特征提取,后面的图层在全连接层之前都是3维的图层,并且是多层的2维图,例如feature map1的维度为55*55*96,即96个55*55的二维图,每一个2维图对应一个卷积核滤波操作后得到的特征映射,即不同的卷积核滤波后可以提取到不同的特征,换言之就是将图像的不同特征通过卷积滤波映射到不同的图层,故称之为feature map(特征映射)。
感受视野(receptive field):CNN中,某一输出层feature map中一个元素点(这里我们还是称之为像素点)对应的输入层区域的大小,被称作感受视野(receptive field)。例如,feature map2的一个像素点对应feature map1的一个5*5像素区域,其坐标取决于卷积核滤波的坐标位置。
卷积层\池化层感受视野大小:
卷积层\池化层输出的feature map的一个像素对应的输入层的感受视野大小等于滤波器的大小。那么多个像素点对应的输入层感受视野大小呢?我下面来推导一下:
感受视野大小必然有kernel size(ks, 卷积核大小)、stride(str,步长)、padding(pad,全零填充,保持原有尺寸)、output size(ops,输出像素点尺寸(二维))和input size(ips,输入像素点尺寸(二维),也就是感受视野尺寸),我们首先推导出卷积的输入尺寸(感受视野大小)和输出尺寸间的关系如下:
(1)
反过来可以推导出和关系:
(2)
注意这里是单层卷积\池化层的输入输出关系。
这里给出alexnet的感受视野表(各个网络层对应的原始输入图片的感受视野),我们通过对符号加下标层号的方式来表示第几层,例如第3层Conv2的表示为,我们现在利用之前公式(1)推导Conv2在原始图像的感受视野宽度,这里特指Conv2的一个像素点对应最初RGB图像输入像素点宽度(卷积核长宽相同,这里只以宽度为例,其实是一样的):
Conv2层(即Conv2卷积后输出的特征图)在Pooling1层的感受视野宽度为:
Conv2层在Conv1层的感受视野宽度为:
Conv2层在输入图像的感受视野宽度为:
其他层同样可用类似方法计算。
下面推导出一种更简单的递推计算感受视野(这里特指对输入图像的感受视野)的公式,设第层的感受视野是,显然
接着我们推导,同样其视野宽为一个kernel所有像素点视野宽的并集,kernel滤波的第一个像素点对应的视野宽度为,从第二个点开始额外增加的视野宽,取决于第一层的步长,从第二个点开始每个点都会将视野拓宽,故可以得到
接着我们推导,同样其视野宽为一个kernel所有像素点视野宽的并集且kernel滤波的第一个像素点对应的视野宽度为,从第二个点开始由于第二层步长为,其在第二层的视野拓宽了,而由于第二层每一个点都会在第一层拓宽,故从第二个点开始每个点都会将视野拓宽,故可以得到
显然根据递推关系,我们可以得到和间的递推关系(注意这里要满足卷积核宽度大于步长,当然这通常是满足的):
(3)
输入层1,可以看作卷积核为1,步长为1,同样满足此公式,我们可以马上通过AlexNet表验证下前三层:
坐标转换:
这里坐标的定义以图的左上角为(0,0)点,向右向下均为正像素点个数-1,设层坐标像素的坐标点为,注意对于视野区域这里的坐标是指其中心点坐标,那么我们容易得到相邻层坐标的关系:
(4)
注意这里的padding是指左边和上边的零点个数,举个例子,一个的原图,用的卷积核滤波,则生成的特征图,若,可以反推出:
公式(1)(2)(3)(4)是经常用到的,希望做CNN相关的小伙伴们能熟记于心,不但编程需要,面试的时候也经常问哦(●'◡'●)。