Tensorflow中的padding操作
阿新 • • 發佈:2018-12-13
圖示說明
-
用一個3x3的網格在一個28x28的影象上做切片並移動
-
移動到邊緣上的時候,如果不超出邊緣,3x3的中心就到不了邊界
-
因此得到的內容就會缺乏邊界的一圈畫素點,只能得到26x26的結果
-
而可以越過邊界的情況下,就可以讓3x3的中心到達邊界的畫素點
-
超出部分的矩陣補零
程式碼說明
根據tensorflow中的conv2d函式,我們先定義幾個基本符號
-
輸入矩陣 W×W,這裡只考慮輸入寬高相等的情況,如果不相等,推導方法一樣,不多解釋。
-
filter矩陣 F×F,卷積核
-
stride值 S,步長
-
輸出寬高為 new_height、new_width
在Tensorflow中對padding定義了兩種取值:VALID、SAME。下面分別就這兩種定義進行解釋說明。
VALID
new_height = new_width = (W – F + 1) / S #結果向上取整
- 含義:new_height為輸出矩陣的高度
- 說明:VALID方式不會在原有輸入矩陣的基礎上新增新的值,輸出矩陣的大小直接按照公式計算即可
SAME
new_height = new_width = W / S #結果向上取整
- 含義:new_height為輸出矩陣的高度
- 說明:對W/S的結果向上取整得到W"包含"多少個S
pad_needed_height = (new_height – 1) × S + F - W
- 含義:pad_needed_height為輸入矩陣需要補充的高度
- 說明:因為new_height是向上取整的結果,所以先-1得到W可以完全包裹住S的塊數,之後乘以S得到這些塊數的畫素點總和,再加上filer的F並減去W,即得到在高度上需要對W補充多少個畫素點才能滿足new_height的需求
pad_top = pad_needed_height / 2 #結果取整
- 含義:pad_top為輸入矩陣上方需要新增的高度
- 說明:將上一步得到的pad_needed_height除以2作為矩陣上方需要擴充0的畫素點數
pad_bottom = pad_needed_height - pad_top
- 含義:pad_bottom為輸入矩陣下方需要新增的高度
- 說明:pad_needed_height減去pad_top的剩餘部分補充到矩陣下方
以此類推,在寬度上需要pad的畫素數和左右分別新增的畫素數為
pad_needed_width = (new_width – 1) × S + F - W
pad_left = pad_needed_width / 2 #結果取整
pad_right = pad_needed_width – pad_left
原始碼示例
tensorflow/python/ops/nn_ops.py中關於padding的原始碼部分
個人理解: