用numpy库手写算子五: Depthwise_conv2d
前言
我们经常可以调用pytorch,tensorflow库等来实现我们的神经网络,但是有的时候需要开发自己的框架,这个时候就得了解每一个算子的计算规则,了解这些计算规则也有助于我们了解他们的计算特性,然后就可以在底层优化上面有一定的针对性。
Depthwise_conv2d
对于一个输入为(n,ic,h,w)的input,其本来的正常的卷积核为(oc,ic,kh,kw)。但是depthwise换成了(ic,1,kh,kw),然后加一个(oc,ic,1,1)的pointwise。之后的pointwise也是相当于正常的卷积。
所以整个的计算过程就是(n,ic,h,w)经过一个(ic,1,kh,kw)变成了一个(n,ic,h_new,w_new)的feature_map,然后再和(oc,ic,1,1)做正常的卷积,就可以得到一个(n,oc,h_new,w_new)的输出,这个输出作为之后的feature_map传递下去。
总体代码
def dwconv_forward_naive(x, w, stride, pad, b = None):
x = np.pad(x, ((<