基于TensorFlow理解CNN中的padding参数

1 TensorFlow中用到padding的地方

在TensorFlow中用到padding的地方主要有tf.nn.conv2d(),tf.nn.max_pool(),tf.nn.avg_pool()等,用法如下:

tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None,name=None) #来进行(二维数据)卷积操作

tf.nn.max_pool_with_argmax(input, ksize, strides, padding, Targmax=None, name=None) #实现最大池化

tf.nn.max_pool(value, ksize, strides, padding, name=None) #实现平均池化

当使用上边函数的时候需要传入所需的值,padding的值为字符串,可选值为'SAME' 和 'VALID' 。

2 为什么要padding

先介绍什么是padding。padding参数的作用是决定在进行卷积或池化操作时,是否对输入的图像矩阵边缘补0,'SAME' 为补零,'VALID' 则不补。其原因是因为在操作过程中过滤器可能不能将某个方向上的数据刚好处理完。

再说为什么要进行padding。举个例子来说:当步长为5,卷积核尺寸为6×6时,当padding为VALID时,则可能造成数据丢失(如上边的图),当padding为SAME时,则对其进行补零(如下边的图)。

最后从下图理解VALID与SAME两种模式的操作:“VALID”模式表示:当filter全部在image里面的时候,进行卷积运算。“SAME”模式表示:当filter的中心(K)与image的边角重合时,开始做卷积运算。

VALID 模式

SAME 模式

3 关于padding的计算

首先,定义变量:

  • 输入图片的宽和高:i_w 和 i_h
  • 输出特征图的宽和高:o_w 和 o_h
  • 过滤器的宽和高:f_w 和 f_h
  • 宽和高方向的步长:s_w 和 s_h
  • 宽和高方向总的补零个数:pad_w 和 pad_h
  • 顶部和底部的补零个数:pad_top 和 pad_bottom
  • 左部和右部的补零个数:pad_left 和 pad_right

3.1 VALID模式

输出的宽和高为:

o_w = (i_w - f_w + 1)/ s_w #(结果向上取整)
o_h = (i_h - f_h + 1)/ s_h  #(结果向上取整)

3.2 SAME模式

输出的宽和高为:

o_w = i_w / s_w#(结果向上取整)
o_h = i_h / s_h#(结果向上取整)

各个方向的补零个数为:max()为取较大值,

pad_h = max(( o_h -1 ) × s_h + f_h - i_h , 0)
pad_top = pad_h / 2  # 注意此处向下取整
pad_bottom = pad_h - pad_top

pad_w = max(( o_w -1 ) × s_w + f_w - i_w , 0)
pad_left = pad_w / 2 # 注意此处向下取整
pad_right = pad_w - pad_left

猜你喜欢

转载自www.cnblogs.com/Terrypython/p/10809584.html
今日推荐