用numpy库手写算子五: Depthwise_conv2d

本文探讨了如何使用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开发', '框架应用', '表单验证', '数据操作']

用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值