TensorFlow中CNN的两种padding方式“SAME”和“VALID”
来源
dilation_rate为一个可选的参数,默认为1,这里我们可以先不管它。
整理一下,对于“VALID”,输出的形状计算如下:
new_height=new_width=⌈(W–F+1)/S⌉
对于“SAME”,输出的形状计算如下:
new_height=new_width=⌈W/S⌉
其中,W为输入的size,F为filter为size,S为步长,⌈⌉为向上取整符号
总之,TensorFlow 使用如下等式计算 SAME 、PADDING
SAME Padding, 输出的高和宽,计算如下:
out_height = ceil(float(in_height) / float(strides1))
out_width = ceil(float(in_width) / float(strides[2]))
VALID Padding, 输出的高和宽,计算如下:
out_height = ceil(float(in_height - filter_height + 1) / float(strides1))
out_width = ceil(float(in_width - filter_width + 1) / float(strides[2]))
维度
综合目前所学的知识,我们应该如何计算 CNN 中每一层神经元的数量呢?
输入层(input layer)维度值为W, 滤波器(filter)的维度值为 F (height * width * depth), stride 的数值为 S, padding 的数值为 P, 下一层的维度值可用如下公式表示: (W−F+2P)/S+1。
我们可以通过每一层神经元的维度信息,得知模型的规模,并了解到我们设定的 filter size 和 stride 如何影响整个神经网络的尺寸。
正解
H = height, W = width, D = depth
我们有一个输入维度是 32x32x3 (HxWxD)
20个维度为 8x8x3 (HxWxD) 的滤波器
高和宽的stride(步长)都为 2。(S)
padding 大小为1 (P)
计算新的高度和宽度的公式是:
new_height = (input_height - filter_height + 2 * P)/S + 1
new_width = (input_width - filter_width + 2 * P)/S + 1
输出的维度(shape)是什么?
(32-8+2*1)/2+1=14
滤波器的个数20就是新的深度