CNN的强大之处在于它的多层结构能自动学习特征,并且可以学习到多个层次的特征:较浅的卷积层感受野较小,学习到一些局部区域的特征;较深的卷积层具有较大的感受野,能够学习到更加抽象一些的特征。这些抽象特征对物体的大小、位置和方向等敏感性更低,从而有助于分类性能的提高, 可以很好地判断出一幅图像中包含什么类别的物体,但是因为丢失了一些物体的细节,不能很好地给出物体的具体轮廓、指出每个像素具体属于哪个物体,因此做到精确的分割就很有难度。
在学习计算感受野(Receptive field)之前,先可视化一下感受野吧。举一个例子,原始图像为5x5,卷积核(Kernel Size)为3x3,padding 为1x1,stride为2x2,依照此卷积规则,连续做两次卷积。熟悉卷积过程的朋友都知道第一次卷积结果是3x3大小的feature map,第二次卷积结果是2x2大小的feature map。整个过程如图所示:
第一次卷积得到3*3的 feature map,RF为3*3 第二次卷积得到2*2的 feature map, 感受野为3x3 黄色feature map对应的感受野是7*7大小
如图所示,第一层卷积结束后,感受野是3x3。在第二层卷积结束了,感受野是7x7
公式一:这个算法从top往下层层迭代直到追溯回input image,从而计算出RF。
(N-1)_RF = f(N_RF, stride, kernel) = (N_RF - 1) * stride + kernel
其中,RF是感受野。N_RF和RF有点像,N代表 neighbour,指的是第N层feature map的一个feature在N-1层的RF,记住N_RF只是一个中间变量,不要和RF混淆。 stride是N-1层的步长,ksize是N-1层卷积核大小。
我来解释一下这个公式。首先,我们的问题是右一的红叉叉映射到左一中,应该是什么size?自然思路就是右一的红叉叉映射到中间是什么size?因为卷积核是3x3,所以右一的红叉叉(1个feature)映射到中间是3x3. 因为一个feature是通过kernel卷积而来, 所以最后一层(第N层)的感受野即为(1-1) * 2 + 3 = 3, 就是kernel size. 那么接下来我们如果算出来中间3x3的红框框映射到左一是什么size,不就解决了我们的问题嘛。聪明的我们就发现了从中间映射到左边的size是kernel_size+stride * (3-1). 抽象一下就是kernel_size +stride * (N_RF-1)嘛。接下来就很简单了,一层又一层的迭代下去直到迭代到第一层,就求出了RF。Note: kernel_size和stride是左一的,而N_RF是中间的, 代表中间在左一的感受野。
本题即为(3-1) * 2 +3=7此处问题: 为什么公式是这么写的?观察而来?
举例:第一层ksize=3,stride=2; 第二层ksize=3,stride=2; 第三层ksize=3,stride=1
则第三层输出的featuremap为3x3(逐点扫描), feature map上任一点的感受野为kernel size大小3x3.
(若第三层的stride=2, 则输出的feature map为2x2, 即四个顶点)
第四层在第三层的感受野是3,但stride和kernel size为第三层的参数
- (3-1) * 1 + 3 = 5
- (5-1) * 2 + 3 =11
- (11-1) * 2 + 3 =23
总的感受野为23
两个小卷积(3*3)对于5×5网络感知野相同的替代性。
3x3 是最小的能够捕获像素八邻域信息的尺寸。
两个 3x3 的堆叠卷积层的有限感受野是 5x5 ;三个 3x3 的堆叠卷积层的感受野是7x7,故可以通过小尺寸卷积层的堆叠替代大尺寸卷积层,并且感受野大小不变。
多个 3x3 的卷积层比一个大尺寸 filter卷积层有更多的非线性(更多层的非线性函数),使得判决函数更加具有判决性。(中间层有非线性的分解, 并且起到隐式正则化的作用)
多个 3x3的卷积层比一个大尺寸的 filter 有更少的参数,假设卷积层的输入和输出的特征图大小相同为 C,那么三个 3x3 的卷积层参数个数
3x(3x3xCxC)=27C^2
;一个7x7的卷积层参数为49C^2
;
网友评论