1. 程式人生 > >Tensorflow中的padding操作

Tensorflow中的padding操作

圖示說明

padding操作圖示

  • 用一個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的原始碼部分

padding原始碼部分

個人理解: