上图展示的是CNN卷积神经网络中卷积的过程,
定义输入矩阵为I (n×n),卷积核为F (f×f),输出矩阵为 O :
则卷积的过程为:Conv(I,W)=O
对于卷积,由浅入深三种形式,
Convolution operation without padding: filter, 单格平移,新图片缩小
Convolution operation with padding: padding 补齐外围pixel,新图片大小保持不变
Strided Convolution:跳格平移(2格或更多),新图片加倍缩小
其中,对于卷积计算后输出矩阵和输入矩阵不一致,当我们需要获取和input尺寸相同的Output时,padding就用上场了。padding是在原始input的周围进行填充,以保证卷积后的大小与原始 input 一致,让模型能足够深,如下图所示:
而Strided Convolution其实就是在过滤器移动过程中进行跳格计算,stride具备跳格能力,避免重复计算。
stride也会影响feature map的规模,例如stride=2时大概会使feature map规模缩小为1/2的大小。
输出图片几种情况下的尺寸计算公式,其中s为步长stride,p的值不固定,只是满足输出和输入尺寸相同情况下的padding值 p= (f-1)/2。
no padding: n - f + 1
padding: n + 2p - f + 1
跳格计算stride with padding: (n + 2p - f)/s + 1
还有一种情况是发生filter出格的情况
下图是吴恩达网易云课堂上的一个例子,
当n=7,p=0,f=3,s=3时,按照跳格计算公式得到的是个小数,长宽尺寸不自然。同时,从图中可以看到,s=3时,第一次filter从2开始,第二次是4,第三次从9开始,发生出格,出格部分没有真实数据,因此采用floor处理出格部分,即忽略第三次计算。
出格情况计算公式: np.floor((n + 2p - f)/s + 1)
对于刚才的情况,floor((n + 2p - f)/s + 1)=floor((7+0-3)/3+1)=2,即filter在第一行只进行了2次计算。