关于CNN中特征图大小的计算公式

先给出的卷积层输出大小的的计算公式(这里假设输入矩阵和卷积核都是方阵,不是方阵其实也类似):

n’= (n-k)/s+1

其中,n’是卷积层输出的size,n是输入方阵的size, k是卷积核的size, s是移动的步长。即输入n*n 的矩阵,用k*k的卷积核对输入进行卷积,得到大小为n’*n’的特征图。

一直疑惑要怎么理解这个式子,虽然验证过多个卷积计算,证明feature map的大小确实等于这个式子的计算结果,但是一直想以一种更直白的方式去理解这个式子。

首先,卷积层输出的feature map的长度(即输出矩阵有几列),实际上就是水平方向上做的卷积次数。输出矩阵的高度同理。

第二,在计算水平方向上的一行的卷积次数时,不妨将卷积的关注点从k*k的卷积核转移到卷积核中的一个数上,因为卷积核平移的时候所有数字移动次数都是相同的。那么应当关注哪一个点呢,这是第三步要说的。

第三,我们要关注卷积核的平移,理论上可以关注卷积核中的任意一个数。但是这里我们选择只关注卷积核的右上角的那个小格子a,由这个数的平移方式可以得知在水平方向上平移了多少次,这个格子a一旦移到了输入矩阵的外部,那么那次移动后的计算则因为缺少输入数据而无效。那么接下来的问题就是,怎么计算这个点在输入矩阵上的移动次数。这个是重点,看第四步。

第四,直观上第一个想到的应该是,移动次数 = 总长度/移动步长,即,n’= n/s. 考虑一下这个式子的问题在哪里,有没有发现,卷积核的长度与步长不一定是相同的。也就是说,初始状态下,右上角那个小格子a在该行的第k个位置上而不是第s个位置上,点a在第一行上的移动轨迹应该是:k,k+s,k+2s,…,而不是s,2s,3s,…,因此点a一共移动了(n-k)/s次,最后再加上在初始位置上也做了一次卷积,因此一共做了(n-k)/s+1次卷积,而这就是输出特征图feature map的长度(输出矩阵的列数)。

猜你喜欢

转载自www.cnblogs.com/byugo/p/10634464.html
今日推荐