0

根據tf.nn.conv2d doc的理解,對於SAME卷積(無論跨度)第一個dot產品應該以(0,0) 爲中心,但正如您在步幅是奇數,第一點積似乎是圍繞着(1,1):在這個玩具示例tensorflow conv2d even和odd stride之間的不同起始索引

輸入形狀[5,5,1]

濾波器形狀是[3,3 , 1,1]

res = tf.nn.conv2d(X,F,strides = [1,x,x,1] ,填充= 'SAME')

跨距爲1個結果:

array([[ 1.49573362, 2.65084887, 2.96818447, 3.04787111, 1.89275599], 
    [ 3.1941781 , 4.47312069, 4.10260868, 4.13415051, 2.85520792], 
    [ 2.65490007, 3.41439581, 2.93415952, 3.65811515, 2.89861989], 
    [ 2.22547054, 2.98453856, 2.89428496, 3.29111433, 2.53204632], 
    [ 0.52702606, 1.16226625, 1.75986075, 2.20483446, 1.56959426]], dtype=float32) 

步幅2結果:

array([[ 1.49573362, 2.96818447, 1.89275599], 
    [ 2.65490007, 2.93415952, 2.89861989], 
    [ 0.52702606, 1.75986075, 1.56959426]], dtype=float32) 

步幅3結果:

array([[ 4.47312069, 2.85520792], 
    [ 1.16226625, 1.56959426]], dtype=float32) 

這是一個錯誤或者我錯過了什麼?

+0

您是否嘗試製作一個具有可實際計算的值的玩具示例? 「正如你可以在下面看到的......」我不瞭解你,但我什麼都看不到:很多隨機數字。 –

+0

是的,我做過了,但您只需比較輸出與步幅1與步幅1的輸出,因爲步幅結果是步幅1結果的子採樣版本。例如,您可以看到步幅3的(0,0)結果是步幅1的(1,1)結果。 – Hillel

回答

0

正在發生的事情是,如果額外零列的數量(來自填充)是奇數,tensorflow將在末尾添加列。

在stride = 1的示例中,它需要添加兩列,所以它在開始處和末尾添加一列(意思是每邊的開始,結束:左,右,上,下)。步幅= 2也會這樣做。

但是,對於stride = 3,它只需添加一列,並在末尾(右側和底部)執行。如果需要添加5列,則會在開始處(左側,頂部)和末尾(右側,底部)添加2個

相關問題