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的邊角重合時,開始做卷積運算。


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