tf.nn.conv2d中padding参数的规则介绍

文章来源:《深度学习之TensorFlow:入门、原理与进阶实战》

padding属性的意义是定义元素边框和元素内容之间的空间。

在tf.nn.conv2d函数中,当变量padding为VALID和SAME,函数具体是怎么计算的呢?其实是有公式的。为了方便演示,先定义几个变量:

  • 输入的尺寸高和宽定义成:in_height,in_width
  • 卷积核的高和宽定义成filter_height、filter_width
  • 输入的尺寸中高和宽定义成output_height、out_width
  • 步长的高宽方向定义成strides_height、strides_width.

一 VALID情况:边缘不填充

输入宽和高的公式分别为:
output_width=(in_width-filter_width+1)/strides_width #(结果向上取整)
output_height=(in_height-filter_height+1)/strides_height #(结果向上取整)

二 SAME情况:边缘填充

# 输出的宽和高将与卷积核没关系,具体公式如下:
output_width=in_width/strides_width #(结果向上取整)

output_height=in_height/strides_height #(结果向上取整)

# 这里有一个很重要的知识点——补零的规则,见如下公式:
pad_height=max((out_height-1)*strides_height+filter_height-in_height,0)

pad_width=max((out_width-1)*strides_width+filter_width-in_width,0)

pad_top=pad_height/2

pad_bottom=pad_height-pad_top

pad_left=pad_width/2

pad_right=pad_width-pad_left

上面公式中

  • pad_height:代表高度方向上要填充0的行数。
  • pad_width:代表宽度方向要填充0的列数。
  • pad_top、pad_bottom、pad_left、pad_right分别代表上、下、左、右这4个方向填充0的行、列数。

三 规则举例

下面通过一个例子来理解一下padding规则。

假设用一个一维数据来举例,输入是13,filter是6,步长是5,对于padding的取值有如下表示:

3.1 当padding='VALID’

生成宽度为(13-6+1)/5=2(向上取整)个数字。

inputs:

(1 2 3 4 5 6) 7 8 9 10 11 12 13
1 2 3 4 5 (6 7 8 9 10 11) 12 13

12和13丢弃

3.2 当padding=‘SAME’,

生成的宽度为13/5=3(向上取整)

Padding的方式可以如下计算:

Pad_width=(3-1)*5+6-13=3
Pad_left=pad_width/2=3/2=1
Pad_rigth=Pad_width-pad_left=2
在左边补一个0,右边补2个0

input:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 0 0
(0 1 2 3 4 5) 6 7 8 9 10 11 12 13 0 0
0 1 2 3 4 (5 6 7 8 9 10) 11 12 13 0 0
0 1 2 3 4 5 6 7 8 9 (10 11 12 13 0 0)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章