當前位置:
首頁 > 知識 > TensorFlow中CNN的兩種padding方式「SAME」和「VALID」

TensorFlow中CNN的兩種padding方式「SAME」和「VALID」

在用tensorflow寫CNN的時候,調用卷積核api的時候,會有填padding方式的參數,找到源碼中的函數定義如下(max pooling也是一樣):


def conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None,

data_format=None, name=None)

源碼中對於padding參數的說明如下:


padding: A string from: "SAME", "VALID".

The type of padding algorithm to use.

說了padding可以用「SAME」和「VALID」兩種方式,但是對於這兩種方式具體是什麼並沒有多加說明。

這裡用Stack Overflow中的一份代碼來簡單說明一下,代碼如下:

x = tf.constant([[1., 2., 3.],
[4., 5., 6.]])
x = tf.reshape(x, [1, 2, 3, 1]) # give a shape accepted by tf.nn.max_pool
valid_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding="VALID")
same_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding="SAME")
print(valid_pad.get_shape())
print(same_pad.get_shape())
1
2
3
4
5
6
7
8
9
10

最後輸出的結果為:


(1, 1, 1, 1)

(1, 1, 2, 1)

可以看出「SAME」的填充方式是比「VALID」的填充方式多了一列。

讓我們來看看變數x是一個2x3的矩陣,max pooling窗口為2x2,兩個維度的strides=2。

第一次由於窗口可以覆蓋(橙色區域做max pool操作),沒什麼問題,如下:

123456

接下來就是「SAME」和「VALID」的區別所在,由於步長為2,當向右滑動兩步之後「VALID」發現餘下的窗口不到2x2所以就把第三列直接去了,而「SAME」並不會把多出的一列丟棄,但是只有一列了不夠2x2怎麼辦?填充!

12304560

如上圖所示,「SAME」會增加第四列以保證可以達到2x2,但為了不影響原來的圖像像素信息,一般以0來填充。(這裡使用表格的形式展示,markdown不太好控制格式,明白意思就行),這就不難理解不同的padding方式輸出的形狀會有所不同了。


在CNN用在文本中時,一般卷積層設置卷積核的大小為n×k,其中k為輸入向量的維度(即[n,k,input_channel_num,output_channel_num]),這時候我們就需要選擇「VALID」填充方式,這時候窗口僅僅是沿著一個維度掃描而不是兩個維度。可以理解為統計語言模型當中的N-gram。

我們設計網路結構時需要設置輸入輸出的shape,源碼nn_ops.py中的convolution函數和pool函數給出的計算公式如下:

If padding == "SAME":
output_spatial_shape[i] = ceil(input_spatial_shape[i] / strides[i])
If padding == "VALID":
output_spatial_shape[i] =
ceil((input_spatial_shape[i] -
(spatial_filter_shape[i]-1) * dilation_rate[i])
/ strides[i]).
1
2
3
4
5
6
7
8

dilation_rate為一個可選的參數,默認為1,這裡我們可以先不管它。

整理一下,對於「VALID」,輸出的形狀計算如下:

new_height=new_width=?(W–F+1)

S

?

new_height=new_width=?(W–F+1)S?

對於「SAME」,輸出的形狀計算如下:

new_height=new_width=?W

S

?

new_height=new_width=?WS?

其中,W

W為輸入的size,F

F為filter為size,S

S為步長,??

??為向上取整符號。

TensorFlow中CNN的兩種padding方式「SAME」和「VALID」

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

藉助Jackson的JsonTypeInfo註解實現多態類的解析
mybatis分頁設置方法

TAG:程序員小新人學習 |