一、前言
之前使用shufflenet-nanodet
时,思考过它里面的shuffle op
的部署,因为很多开发板不支持5 维 tensor
,所以python
中的shuffle
方式,是没法继续使用的,所以就要用其他的思路来做。去年事情多,一直没有空把这个心得记录下来,现在有空了,特此记录,方便自己并抛砖引玉,如有错误,还请指出,谢谢!
二、试验
(一)思路
shufflenet
的代码来自nanodet
,至于它是否与原版一致,我没去比较。
上文说过的,python
的shuffle
方式没法用,乍一看可能觉得没法继续。但是仔细想想,shuffle
操作只是对通道这一维度做了shuffle
,其他维度是没有动的。
上图是一个shuffle + 卷积
的粗略展示,很直白了。python
里我们是对tensor
进行shuffle
操作。部署到板端时,由于硬件的限制,所以我们对权值进行shuffle
操作,最后的结果是一致的,而且还省略了一个op
。
(二)试验
shuffle op
代码如下:
def channel_shuffle(x, groups):
# type: (torch.Tensor, int) -> torch.Tensor
batchsize, num_channels, height, width = x.data.size()
channels_per_group = num_channels // groups
# reshape
x = x.view(batchsize, groups, channels_per_group, height, width)
x = torch