1、CNN输入输出的计算
公式:
OutputSize = ( InputSize + PadSize*2 - FilterSize ) / Stride + 1
输出大小 = (输入大小 + Pad大小 * 2 - 卷积核大小)/ 步长 + 1
公式中Pad之所以乘2,是因为对于宽度来讲,左右两边都加了Pad,公式中的Pad指单边大小,CNTK中pad=True时,padsize=1
注意事项:
0)详细参见该文
https://arxiv.org/pdf/1603.07285.pdf
1)当不能整除步长时,余数取整(加一或舍弃),例如对Mnist操作,输入28,Pad为1,卷积核5,Stride为2时,输出=( 28 + 1*2 - 5)/2 +1 = 25/2 + 1 = 12.5 + 1 = 13 + 1 = 14
也就是说,输入为28*28 ,经过(卷积核大小为5*5,Pad为1,步长为2)的卷积后,输出大小为14*14,如果过滤器Filter有10个,则输出Shape为10*14*14
2)Pad设为Same时的含义,参见该文
FULL:edge_row = kernel_row - 1; edge_cols = kernel_cols - 1;
SAME:edge_row = (kernel_row - 1) / 2;edge_cols = (kernel_cols - 1) / 2;
VALID:edge_row = edge_cols = 0;
其中edge_row即Pad,kernel_row就是卷积核大小
3)关于cnn各参数的关系,参见CNTK的cnn动画版描述
4)为什么卷积核都是奇数?
https://www.zhihu.com/question/279077251/answer/404918175
设原始图像为n*n维,卷积核尺寸为f*f,在没有padding和stride为1的情况下,输出尺寸为
(n-f+1)*(n-f+1)
在有padding的情况下,padding尺寸为p,输出尺寸为:(n+2p-f+1)*(n+2p-f+1)
在有same padding的情况下,我们希望输出尺寸与输入尺寸一致,所以
n+2p-f+1=n > p=(f-1)/2
所以我们可以看出,为了使得p取整数,我们需要使用奇数的卷积核尺寸,否则我们可能会面临非对称padding的情况,既左边多一点,或者右边多一点,这样是不合理的。
另外一个重要原因是奇数卷积核尺寸,我们有对称中心点,中心点左边和右边是对称的,上面和下面是对称的。而偶数卷积核则没有这样的中心点。
5) 对full、same、valid三个参数的对比说明(图)
https://blog.csdn.net/zy3381/article/details/43274029
6)cnn平易参考