卷积的实现
输入数据NCHW
[in, ic, ih, iw]: in=batch;ic=input channel ;ih=input height; iw=input width
输出数据
[on,oc,oh,ow]:on=output batch;oc=output channel;oh=output height;ow=output width
卷积核
[oc,ic,kh,kw]:oc=output channel;ic=input channel;kh=kernel height;kw=kernel width
这里卷积核可以有多维,要跟输入的channel维度一致。
卷积核可以有多个,有多少卷积核,输出的feature map就有多少通道。
oh=ih-kh+1
ow=iw-kw+1
strides
步进。filter在input上滑动时的步长,默认为1。一般做下采样时>1,比如h和w的strides为[2,2],则输出为[1, 14, 14, 10]。
引入步长后:oh = (ih - kh)/sh + 1;
ow = (iw - kw)/sw + 1
四维卷积实现如下:
def conv_4d(x, weights, bias, out_h, out_w, stride=1): batch_size = x.shape[0] input_channel = x.shape[1] output_channel = weights.shape[0] filter_height = weights.shape[2] filter_width = weights.shape[3] rs = np.zeros((batch_size, num_output_channel, out_h, out_w)) for bs in range(batch_size): for oc in range(output_channel): rs[bs,oc] += bias[oc] for ic in range(input_channel): for i in range(out_h): for j in range(out_w): ii = i * stride jj = j * stride for fh in range(filter_height): for fw in range(filter_width): rs[bs,oc,i,j] += x[bs,ic,fh+ii,fw+jj] * weights[oc,ic,fh,fw]
上面的函数包含以下几重循环:
- 批量数据循环(第一维):
bs in batch_size
,对每个样本进行计算; - 输出通道循环(第二维):
oc in output_channel
。这里先把bias
加上了,后加也可以; - 输入通道循环:
ic in input_channel
; - 输出图像纵坐标循环:
i in out h
; - 输出图像横坐标循环:
j in out_w
。循环4和5完成对输出图像的每个点的遍历,在下面的子循环中计算并填充值; - 卷积核纵向循环(第三维):
fh in filter_height
; - 卷积核横向循环(第四维):
fw in filter_width
。循环6和7完成卷积核与输入图像的卷积计算,并保存到循环4和5指定的输出图像的点上。
参考:
联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2016-03-31 Activity中获取view的高度和宽度为0的原因以及解决方案
2016-03-31 玩转Android Camera开发(二):使用TextureView和SurfaceTexture预览Camera 基础拍照demo