[英]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執行以下操作
換句話說,它吸收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.