卷積操作特征圖輸出大小


卷及神經網絡的卷積操作對輸入圖像的邊緣位置有兩種處理方式:
  1. 有效填充
  2. 邊緣填充
有效填充:濾波器的采樣范圍不超過圖片的邊界,strides=1時,輸出特征圖的大小計算方法為input_height - filter_height +1
相同填充,濾波器采樣范圍超過邊界,且超過邊界部分使用0填充,strides = 1 時,輸出特征圖的大小和輸入圖一樣,即output_height=input_height
 
 
有效填充
 
相同填充
 
 
在tensorflow中,這兩種操作的的輸出特征圖大小如何計算呢?
 
記輸入形狀為【input_height,input_width,input_depth】
 
采用same padding
當strides設為2時,則輸出的特征圖的大小為【input_height/2, input_width/2, output_depth】
注意:如果input_height/2為上取整,即input_height=11時,在此有input_height/2 = 6
>>> import tensorflow as tf
>>> aa = tf.truncated_normal([100,11,11,3])
>>> aa.shape
TensorShape([Dimension(100), Dimension(11), Dimension(11), Dimension(3)])
>>> bb = tf.layers.conv2d(aa, 3, 4, 2,padding='same')
>>> bb.shape
TensorShape([Dimension(100), Dimension(6), Dimension(6), Dimension(3)])

 

當strides設為3時,則輸出的特征圖的大小為【input_height/3, input_width/3, output_depth】
同理當input_height=11時,在此有input_height/3 = 4
>>> import tensorflow as tf
>>> aa = tf.truncated_normal([100,11,11,3])
>>> aa.shape
TensorShape([Dimension(100), Dimension(11), Dimension(11), Dimension(3)])
>>> bb = tf.layers.conv2d(aa, 3, 4, 3,padding='same')
>>> bb.shape
TensorShape([Dimension(100), Dimension(4), Dimension(4), Dimension(3)])
>>> bb = tf.layers.conv2d(aa, 3, 4, (2,3),padding='same') >>> bb.shape TensorShape([Dimension(100), Dimension(6), Dimension(4), Dimension(3)])

 

 
采用valid padding
 當strides設為1時,則輸出的特征圖的大小為【input_height - kernel_size + 1, input_width - kernel_size + 1, output_depth】
>>> import tensorflow as tf
>>> aa = tf.truncated_normal([100,11,11,3])            #創建形狀為11*11*3的tensor(前面的100為batch size,可忽略)
>>> bb = tf.layers.conv2d(aa, 3, 4, 1,padding='valid') #strides設為1
>>> bb.shape
TensorShape([Dimension(100), Dimension(8), Dimension(8), Dimension(3)]) #輸出大小為 8*8*3
>>> bb = tf.layers.conv2d(aa, 3, 3, 1,padding='valid')
>>> bb.shape
TensorShape([Dimension(100), Dimension(9), Dimension(9), Dimension(3)])

 

當strides設為k時,則輸出的特征圖的大小為【(input_height - kernel_size + 1)/k, (input_width - kernel_size + 1)/k, output_depth】
注意:除法向上取整

>>> bb = tf.layers.conv2d(aa, 3, 4, 2,padding='valid')  
>>> bb.shape
TensorShape([Dimension(100), Dimension(4), Dimension(4), Dimension(3)])

>>> bb = tf.layers.conv2d(aa, 3, 4, 3,padding='valid')
>>> bb.shape
TensorShape([Dimension(100), Dimension(3), Dimension(3), Dimension(3)])

>>> bb = tf.layers.conv2d(aa, 3, 4, 4,padding='valid')
>>> bb.shape
TensorShape([Dimension(100), Dimension(2), Dimension(2), Dimension(3)])

 

以下幾個可以驗證上述結論:

>>> bb = tf.layers.conv2d(aa, 3, 3, 2,padding='valid')
>>> bb.shape
TensorShape([Dimension(100), Dimension(5), Dimension(5), Dimension(3)])
>>> bb = tf.layers.conv2d(aa, 3, 3, 3,padding='valid')
>>> bb.shape
TensorShape([Dimension(100), Dimension(3), Dimension(3), Dimension(3)])
>>> bb = tf.layers.conv2d(aa, 3, 3, 4,padding='valid')
>>> bb.shape
TensorShape([Dimension(100), Dimension(3), Dimension(3), Dimension(3)])
>>> bb = tf.layers.conv2d(aa, 3, 3, 5,padding='valid')
>>> bb.shape
TensorShape([Dimension(100), Dimension(2), Dimension(2), Dimension(3)])

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM