这是tf.nn.conv2d的文档:给定形状为[batch,in_height,in_width,in_channels]的输入张量和形状为[filter_height,filter_width,in_channels,out_channels]的过滤器/内核张量。以下
换句话说,它吸收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%!
答案 0 :(得分:0)
对于您来说,事情很慢,因为您正在使用循环。向量操作的实现将更快,但效率不如tf.nn.conv2d或tf.nn.convolution等高级API。这篇文章应该能够帮助您在numpy中进行同样的矢量化实现:https://wiseodd.github.io/techblog/2016/07/16/convnet-conv-layer/