文章來源:《深度學習之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)