tensorflow卷積神經網絡中的padding參數最詳細解釋!
當使用tensorflow創建卷積神經網絡時,肯定要用到卷積層和池化層,tendorflow關於建立卷積層和池化層的API都有padding這個參數,如下所示:
- tf.nn.conv2d(input,filter,strides,padding)
- tf.nn.max_pool(input,ksize,strides,padding)
padding有兩種可選值:‘VALID’和‘SAME’。
取值爲‘VALID’時padding=0,並不會對輸入(input)做填充;
取值爲‘SAME’時padding>0,將會對輸入(input)做填充,填充值都是0值。
下面我將分別對卷積和池化中padding取值爲‘VALID’和‘SAME’的區別做詳細的解釋。
---------------------------------------------------------------------------------------------------------
-
卷積 tf.nn.conv2d(input,filter,strides,padding)
在tf.nn.conv2d中,padding是在圖片周圍做填充。
-
padding='VALID'時不會對圖片做填充;
-
padding='SAME'時情況比較特殊,注意!,這裏還要分爲兩種情況:stride=1和stride>1
1.當且僅當stride=1時,padding='SAME'意味着卷積後的輸出與輸入size保持一致。例如input的size是5×5,kernel(filter)的size是3×3,令padding='SAME'時(此時padding=1,即在input周圍填充了一圈0),output的size將會與input的size保持一致爲5×5。
當我們使用tensorflow時,取padding='SAME'時,它自動爲我們算出padding的值。既然是詳解,那麼我們來算一下取padding='SAME'時,padding的值應該取幾?先說結論:假如kernel的size是k×k,那麼padding=(k-1)/2。
解釋:o=(i+2p-k+1)
o爲output的size,i爲input的size,k爲kernal的size,p爲padding的取值。以上圖爲例,i=5,padding=1,k=3,kernel還要向右移動4步加上開始總共生成5個像素(即output的第一行),o就等於5。(如果對卷積過程比較熟悉應該不難理解)
2.當stride>1時,還是直接上公式:
o=((i+2p-k)/s+1)
是不是發現s=1就是上面的公式?當stride>1時,p的取值是能使(i+2p-k)能被s整除的最小值(p>k/2)。
以Alexnet的輸入層(227×227)到第二層(55×55)爲例子,k=11,stride=4,padding='VALID';
假如我們令padding='SAME',我們看一下輸出層size是多少?
能使(227+2p-11)被4整除的最小p值是4,所以o=((227+2×4-11)/4+1)=57,這時第二層的size就變成了57×57。代碼可以在這裏獲取,有興趣的可以看一下。
---------------------------------------------------------------------------------------------------------------------
-
池化 tf.nn.max_pool(input,ksize,strides,padding)
對於tf.nn.max_pool來說,padding='SAME'和'VALID'的區別我們來舉例說明:
-
輸入x
: 輸入圖像的shape 是 [2,3], 1個channel -
valid_pad
: kernel的size爲2×2, stride 2 ,padding='VALID'. -
same_pad
: kernel的size爲2×2, stride 2 ,padding='VALID'
輸出結果:
-
valid_pad
: 輸出的shape 是 [1, 1] -
same_pad
: 這裏我們將會把x的shape填充爲 shape [2, 4] (with-inf
and then apply max pool), 所以最終輸出的 shape 是 [1, 2]
廢話不說,上代碼: