55.5_输出大小的计算方法

55.5 输出大小的计算方法

从前面的例子可以看出,步幅越大,输出大小越小。另外,填充越大,输出大小越大。也就是说,输出大小受步幅和填充的影响。除步幅和填充之外,如果给定了输入数据和过滤器的大小,那么输出的大小就是唯一的。其

计算方法如下所示。

steps/step55.py

def get_conv_outsize(input_size, kernel_size, stride, pad): return (input_size + pad * 2 - kernel_size) // stride + 1

函数的所有参数都应为int类型。input_size是输入数据的大小,kernel_size是过滤器的大小,stride是步幅的大小,pad是填充的大小。

上面代码中的//是除法运算。计算结果不能被整除时,小数部分会被舍去。

下面实际使用这里实现的get_conv_outsize函数。结果如下所示

steps/step55.py

H,W=4,4 #input_shape  
KH,KW=3,3 #kernel_shape  
SH,SW=1,1 #stride(垂直方向的步幅,水平方向的步幅)  
PH,PW=1,1 #padding(垂直方向的填充,水平方向的填充)  
OH=get_conv_outsize(H,KH,SH,PH)  
OW=get_conv_outsize(W,KW,SW,PW)  
print(OH,OW)

运行结果

4 4

上面的代码成功计算出了输出大小。考虑到将来也要用这个get_conv_outsize函数,我们把它添加到dezero/util.py中。

介绍完卷积运算的基本内容后,本步骤也就结束了。在下一个步骤中,我们将探讨CNN机制的其他主题(通道和池化)。

步骤56

CNN 的机制(2)

上一个步骤介绍了在垂直方向和水平方向上排列的二维数据(二阶张量)的卷积运算。不过对图像来说,除在垂直方向和水平方向之外,数据还在通道方向上排列,因此DeZero要能处理这种三维数据(三阶张量)。本步骤,我们将使用与上一个步骤相同的做法来研究三阶张量的卷积运算,之后会探讨池化。