1. 程式人生 > >padding引數為SAME和VALID的區別

padding引數為SAME和VALID的區別

1..講解

卷積:conv2

  • "VALID" = without padding:

       inputs:1234567891011(1213)|________________|                dropped
                                     |_________________|
  • "SAME" = with zero padding:

                   pad||pad
       inputs:0|12345678910111213|00|________________||_________________||________________
    |

In this example:

  • Input width = 13
  • Filter width = 6
  • Stride = 5
  • "VALID" only ever drops the right-most columns (or bottom-most rows).
  • "SAME" tries to pad evenly left and right, but if the amount of columns to be added is odd, it will add the extra column to the right, as is the case in this example (the same logic applies vertically: there may be an extra row of zeros at the bottom).

The TensorFlow Convolution example gives an overview about the difference betweenSAME andVALID :

  • For the SAME padding, the output height and width are computed as:

    out_height = ceil(float(in_height) / float(strides[1]))

    out_width = ceil(float(in_width) / float(strides[2]))

And

  • For the VALID

    padding, the output height and width are computed as:

    out_height = ceil(float(in_height - filter_height + 1) / float(strides[1]))

    out_width = ceil(float(in_width - filter_width + 1) / float(strides[2]))

池化:max_pool

I'll give an example to make it clearer:

  • x: input image of shape [2, 3], 1 channel
  • valid_pad: max pool with 2x2 kernel, stride 2 and VALID padding.
  • same_pad: max pool with 2x2 kernel, stride 2 and SAME padding (this is theclassic way to go)

The output shapes are:

  • valid_pad: here, no padding so the output shape is [1, 1]
  • same_pad: here, we pad the image to the shape [2, 4] (with-inf and then apply max pool), so the output shape is [1, 2]
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')

valid_pad.get_shape()==[1,1,1,1]# valid_pad is [5.]
same_pad.get_shape()==[1,1,2,1]# same_pad is  [5., 6.]

2.示例+講解

輸出5×5的feature map

  1. input = tf.Variable(tf.random_normal([1,5,5,5]))  
  2. filter = tf.Variable(tf.random_normal([3,3,5,1]))  
  3. op = tf.nn.conv2d(input, filter, strides=[1111], padding='SAME')  

6.如果卷積核有多個

  1. input = tf.Variable(tf.random_normal([1,5,5,5]))  
  2. filter = tf.Variable(tf.random_normal([3,3,5,7]))  
  3. op = tf.nn.conv2d(input, filter, strides=[1111], padding='SAME')  
此時輸出7張5×5的feature map

7.步長不為1的情況,文件裡說了對於圖片,因為只有兩維,通常strides取[1,stride,stride,1]

  1. input = tf.Variable(tf.random_normal([1,5,5,5]))  
  2. filter = tf.Variable(tf.random_normal([3,3,5,7]))  
  3. op = tf.nn.conv2d(input, filter, strides=[1221], padding='SAME')  
此時,輸出7張3×3的feature map
  1. x.x.x  
  2. .....  
  3. x.x.x  
  4. .....  
  5. x.x.x  
8.如果batch值不為1,同時輸入10張圖
  1. input = tf.Variable(tf.random_normal([10,5,5,5]))  
  2. filter = tf.Variable(tf.random_normal([3,3,5,7]))  
  3. op = tf.nn.conv2d(input, filter, strides=[1221], padding='SAME')  
每張圖,都有7張3×3的feature map,輸出的shape就是[10,3,3,7]

最後,把程式總結一下:

  1. import tensorflow as tf  
  2. #case 2
  3. input = tf.Variable(tf.random_normal([1,3,3,5]))  
  4. filter = tf.Variable(tf.random_normal([1,1,5,1]))  
  5. op2 = tf.nn.conv2d(input, filter, strides=[1111], padding='VALID')  
  6. #case 3
  7. input = tf.Variable(tf.random_normal([1,3,3,5]))  
  8. filter = tf.Variable(tf.random_normal([3,3,5,1]))  
  9. op3 = tf.nn.conv2d(input, filter, strides=[1111], padding='VALID')  
  10. #case 4
  11. input = tf.Variable(tf.random_normal([1,5,5,5]))  
  12. filter = tf.Variable(tf.random_normal([3,3,5,1]))  
  13. op4 = tf.nn.conv2d(input, filter, strides=[1111], padding='VALID')  
  14. #case 5
  15. input = tf.Variable(tf.random_normal([1,5,5,5]))  
  16. filter = tf.Variable(tf.random_normal([3,3,5,1]))  
  17. op5 = tf.nn.conv2d(input, filter, strides=[1111], padding='SAME')  
  18. #case 6
  19. input = tf.Variable(tf.random_normal([1,5,5,5]))  
  20. filter = tf.Variable(tf.random_normal([3,3,5,7

    相關推薦

    padding引數SAMEVALID區別

    1..講解 卷積:conv2 "VALID" = without padding: inputs:1234567891011(1213)|________________| dropped

    函式中的引數object... object[] 的區別

    先給出兩個示例函式 方法1: public void testobject(object... params){ ///省略此處程式碼 } 方法2: public void testobject(object[] params){ ///省略此處程式碼 }   區別

    tensorflow中的padding型別SAMEVALID

    SAME:意味著輸出的特徵圖與輸入的特徵圖有相同的空間維度。zero padding被引入使輸入圖與輸出圖的形狀匹配。 VALID:沒有padding tensorflow中的padding操作適用於卷積和池化操作。 VALID:只會捨棄最右面的列 SAME:均勻地在

    tf.nn.conv2d函式、padding型別SAMEVALID、tf.nn.max_pool函式、tf.nn.dropout函式、tf.nn.softmax函式、tf.reduce_sum函式

    tf.nn.conv2d函式: 該函式是TensorFlow裡面實現卷積的函式。 函式形式: tf.nn.conv2d (input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None,

    TensorFlow中padding卷積的兩種方式“SAMEVALID

    最近在用tensorflow搭建卷積神經網路,遇到了一個比較棘手的問題,我一直理解的padding有兩個值,一個是SAME,一個是VALID,如果padding設定為SAME,則說明輸入圖片大小和輸出圖片大小是一致的,如果是VALID則圖片經過濾波器後可能會變小

    函式的引數引用指標的區別

    C++之所以增加引用型別, 主要是把它作為函式引數,以擴充函式傳遞資料的功能。 到目前為止我們介紹過函式引數傳遞的兩種情況。 1) 將變數名作為實參和形參 這時傳給形參的是變數的值,傳遞是單向的。如果在執行函式期間形參的值發生變化,並不傳回給實參。因為在

    request.getParameter("name")獲取引數null""空字串的區別

    1.獲取到的值為" "空字串 當url裡有name屬性,但是沒有值的時候後臺用request.getParameter("name")獲取的是空字串"" 2.獲取到的值為null 當url裡沒有

    tensorflow中 “same”與“valid區別

    在valid情況下,  輸出形狀計算方法為: new_height=new_width=[(W-F+1)/S] 在same情況下,輸出形狀計算方法為: new_height=new_width=[W/S] 其中W為輸入的尺寸,F為濾波器尺寸,S為步長,[ ]為向上取整函式

    當資料請求引數檔案其他型別引數時的寫法

    @POST("/user/snatchOrder/updateUserInformation") @Multipart //引數有檔案時用這個 Observable<Object> getmylisticon(@Part MultipartBody.Part

    深度學習【3】keras:儲存keras學習好的深度神經網路模型引數二進位制txt檔案

    http://blog.csdn.net/linmingan/article/details/50906141 由於工程需要,儲存為hdf5的keras權值在c/c++中的讀取比較不方便。因此將keras中的權值剝離出來,並儲存為二進位制檔案或者txt檔案。在進行程式碼的編

    卷積運算中的兩種padding的取值,VALIDSAME

    模板來源於(https://blog.csdn.net/wuzqchom/article/details/74785643) 加入了一些自己的理解 在用tensorflow寫CNN的時候,呼叫卷積核api的時候,會有填padding方式的引數,找到原始碼中的函式定義如下(max pooling也

    函式引數值傳遞、引用傳遞指標傳遞的區別

    1)值傳遞:int func(int value) { value++; return value; // 一般需要返回值 } int a=2; int b=func(a); //b==3;a==2;按值

    c89c99中/運算符%運算符負數時的區別

    區別 str tro c99 根據 負數 cpu strong 除法 運算式 -8 / 5 = -1.6,在C89中取值為 -1 或 -2,C99的出現,CPU對除法的結果向零取整,上述運算式結果為 -1。 在C89和C99中都要確保 (a / b) * b + a % b

    Mysql varchar 把默認值設置null空的區別

    指向 變量 因此 區別 char 轉換 強行 含義 提高 ‘\0‘,這個表示空,需要消耗存儲空間的。NULL,則表示連這個\0都沒有。 NULL,你可以近似理解為變量未賦值(定義了變量,但是未使用,變量不指向具體存儲空間,因此,理論上不消耗存儲空間),同時,它理論上不可

    HTTP ------ connection close keep-alive 的區別

    圖片 tcp連接 三次握手 字段 tcp 其它 時代 http 網頁 keep-alive和close這個要從TCP握手講起HTTP請求是基於TCP連接的,TCP的請求會包含(三次握手,中間請求,四次揮手)在HTTP/1.0時代,一個HTTP請求就要三次握手和四次揮手,當一

    字串null字串" "有什麼區別

    做成員變數(欄位/屬性/類變數)時,如果只寫String str;那麼是預設賦值為null的。做區域性變數(方法裡的變數)時,如果只寫String str;是不會預設賦值null的,這裡僅聲明瞭一個str變數,在棧記憶體中有定義,但沒有任何值,null其實也是一種值。此時任何呼叫str的操作,編譯時

    今日頭條文章js生成cpas引數轉換phppython演算法【原創】

    今日頭條js生成cp和as引數轉換為php和python演算法 【原創】 cp 和 as 引數實際是對當前時間戳的加密後得到的 JS !function(t) {     var i = {};    

    我的mqtt協議和emqttd開源專案個人理解(25) - 協議裡面Clean Session01的區別

    一、基本概念 Session 會話 定義 定義:某個客戶端(由ClientID作為標識)和某個伺服器之間的邏輯層面的通訊 生命週期(存在時間):會話 >= 網路連線 CleanSession 標記 在Connect時,由客戶端設定  0 —

    在遊戲中何音效混音的區別

    記得看過一本書,書上說聲音是電影的50%.電影的視覺效果搭配上恰當的聲音就能夠營造出一部精彩的電影,醞釀最純的情緒,使故事飽滿而又深刻,那更何況如今火熱的遊戲。自然也少不了音效的功勞,可以說其發展前景不容小噓。         據統計資料

    關於引用變數進行引用傳遞時傳遞變數空的區別

    /** * */ /** * @author jueying: * @version 建立時間:2018-10-27 下午02:02:27 * 類說明 */ /** * @author jueying * */ class A { public