用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, ((0, 0),(0,0),(pad, pad),(pad, pad)), 'constant')
n, ic, ih, iw = x.shape
koc, kic, kh, kw = w.shape #(ic,1,kh,kw)
H_new = int(1 + (ih - kh) / stride)
W_new = int(1 + (iw - kw) / stride)
out = np.zeros((n, ic, H_new, W_new))
for i in range(H_new):
for j in range(W_new):
x_windows = x[:, :, i * stride : i * stride + kh, j * stride : j * stride + kw]
for k in range(n):
for l in range(ic):
out[k, l, i, j] = np.sum(x_windows[k , l] * w[l])
if b != None:
out[k, l, i, j] += b
return out
本文探讨了如何使用numpy库手动实现Depthwise卷积操作,这对于理解神经网络内部工作原理以及自定义框架的开发至关重要。Depthwise卷积将输入特征图(n, ic, h, w)通过一个(ic, 1, kh, kw)的卷积核转换为(n, ic, h_new, w_new),接着与(oc, ic, 1, 1)的pointwise卷积结合,最终输出(n, oc, h_new, w_new)的特征图。"
84992409,7823955,TP5框架自动验证详解,"['PHP开发', '框架应用', '表单验证', '数据操作']

517

被折叠的 条评论
为什么被折叠?



