之前一直對tensorflow的padding一知半解徒像,直到查閱了tensorflow/core/kernels/ops_util.cc中的Get2dOutputSizeVerbose函數(shù)盟庞,才恍然大悟洪添,下面是具體的介紹
實際上tensorflow官方API里有介紹S倒印赁咙!不科學(xué)上網(wǎng)貌似打不開
根據(jù)tensorflow中的conv2d函數(shù),我們先定義幾個基本符號
1砰盐、輸入矩陣 W×W闷袒,這里只考慮輸入寬高相等的情況,如果不相等岩梳,推導(dǎo)方法一樣囊骤,不多解釋。
2冀值、filter矩陣 F×F也物,卷積核
3、stride值 S列疗,步長
4滑蚯、輸出寬高為 new_height、new_width
當(dāng)然還有其他的一些具體的參數(shù)抵栈,這里就不再說明了告材。
我們知道,padding的方式在tensorflow里分兩種古劲,一種是VALID斥赋,一種是SAME,下面分別介紹這兩種方式的實際操作方法产艾。
1疤剑、如果padding = ‘VALID’
new_height = new_width = (W – F + 1) / S (結(jié)果向上取整)
也就是說,conv2d的VALID方式不會在原有輸入的基礎(chǔ)上添加新的像素(假定我們的輸入是圖片數(shù)據(jù)闷堡,因為只有圖片才有像素)隘膘,輸出矩陣的大小直接按照公式計算即可。
2杠览、如果padding = ‘SAME’
new_height = new_width = W / S (結(jié)果向上取整)
在高度上需要pad的像素數(shù)為
pad_needed_height = (new_height – 1) ?× S + F - W
根據(jù)上式弯菊,輸入矩陣上方添加的像素數(shù)為
pad_top = pad_needed_height / 2 ?(結(jié)果取整)
下方添加的像素數(shù)為
pad_down = pad_needed_height - pad_top
以此類推,在寬度上需要pad的像素數(shù)和左右分別添加的像素數(shù)為
pad_needed_width = (new_width – 1) ?× S + F - W
pad_left = pad_needed_width ?/ 2 (結(jié)果取整)
pad_right = pad_needed_width – pad_left
至此踱阿,關(guān)于tensorflow的卷積padding操作介紹完畢误续,下面是關(guān)于此操作的源碼(Get2dOutputSizeVerbose函數(shù)的部分節(jié)選)吨悍,我也不會用MarkDown,索性直接截圖了蹋嵌,以供參考