将张量流转换为numpy / scipy操作?

时间:2018-11-28 20:11:35

标签: python numpy tensorflow scipy

这是tf.nn.conv2d的文档:给定形状为[batch,in_height,in_width,in_channels]的输入张量和形状为[filter_height,filter_width,in_channels,out_channels]的过滤器/内核张量。以下

  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/generated/scipy.signal.convolve2d.html,它确实进行了卷积运算,这意味着我必须在2d内核旁边传递2d张量(它不执行多个过滤器)。 以前的stackoverflow问题都没有帮助。

谢谢

编辑:做了一些测试,我的代码比做tf.nn.conv2d慢44000%!

1 个答案:

答案 0 :(得分:0)

对于您来说,事情很慢,因为您正在使用循环。向量操作的实现将更快,但效率不如tf.nn.conv2d或tf.nn.convolution等高级API。这篇文章应该能够帮助您在numpy中进行同样的矢量化实现:https://wiseodd.github.io/techblog/2016/07/16/convnet-conv-layer/