簡體   English   中英

將張量流轉換為numpy / scipy操作?

[英]Translating tensorflows conv2d to numpy/scipy operations?

這是tf.nn.conv2d的文檔:給定形狀為[batch,in_height,in_width,in_channels]的輸入張量和形狀為[filter_height,filter_width,in_channels,out_channels]的過濾器/內核張量,此op執行以下操作

  1. 將濾鏡展平為具有[filter_height * filter_width * in_channels,
  2. 從輸入張量中提取圖像補丁,以形成形狀為[batch,out_height,out_width,filter_height * filter_width * in_channels]的虛擬張量。
  3. 對於每個色塊,將濾波器矩陣和圖像色塊向量右乘。

換句話說,它吸收n張圖像的張量,並使用out_channel濾波器進行卷積。

我正在嘗試轉換為僅使用numpy操作的代碼,並且代碼如下:

def my_conv2d(x, kernel):
   nf = kernel.shape[-1]  # number of filters
   rf = kernel.shape[0]  # filter size
   w = kernel
   s = 1 # stride

   h_range = int((x.shape[2] - rf) / s) + 1  # (W - F + 2P) / S
   w_range = int((x.shape[1] - rf) / s) + 1  # (W - F + 2P) / S
   np_o = np.zeros((1, h_range, w_range, nf))
   for i in range(x.shape[0]):
     for z in range(nf):
       for _h in range(h_range):
         for _w in range(w_range):
           np_o[0, _h, _w, z] = np.sum(x[i, _h * s:_h * s + rf, _w * s:_w * s 
                                + rf, * w[:, :, :, z])                     
    return np_o

問題是代碼非常慢。 是否有任何numpy或scipy函數可以復制tensorflows的conv2d正在執行的操作,且效率相似? 我已經看過https://docs.scipy.org/doc/scipy/reference/generation/scipy.signal.convolve2d.html並且它確實進行了卷積運算,這意味着我必須將2d張量與2d內核一起傳遞(它確實不做多個過濾器)。 以前的stackoverflow問題都沒有幫助很大。

謝謝

編輯:做了一些測試,我的代碼比做tf.nn.conv2d慢44000%!

對於您而言,事情很慢,因為您正在使用循環。 向量操作的實現將更快,但效率不如tf.nn.conv2d或tf.nn.convolution等高級API。 這篇文章應該能夠幫助您在numpy中實現其向量化: https : //wiseodd.github.io/techblog/2016/07/16/convnet-conv-layer/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM