group conv 和 depthwise conv

最近在项目中遇到conv层计算量过大的问题,于是就尝试了一些方法。解决conv计算量大的问题,最粗暴的方法当然是直接减小filters的大小,但这种方法带来的负面作用可能是conv层的效果会出现一定的回退。通过查资料和别人介绍,知道了group conv和depthwise conv两种优化方式,这两天研究了一下这两个方法,对它们的实现有了一定的了解,在这里记录一下。

group conv

对于我们普通的卷积,假如我们的输入是100x256的矩阵,通过一个kernel_size=3,filters=512的conv层,那我们的参数量应该为3x256x512,输出为100*512的矩阵。
改成group conv,假设group_size=4,首先将输入拆成4个100x64,然后通过4个3x64x128的conv,最后将结果concat在一起,输出仍然是100x512。
与普通conv对比,我们可以发现,group conv实际上对应计算的是普通conv的对角线部分。下图中,黄色部分即是group conv计算的部分。
黄色部分即是group conv计算的部分
比较两者参数量,我们可以看出普通conv的参数量为3x256x512,group conv的参数量为4x3x64x128,意味着参数量为原来的1/4(跟group_size相关)。
tensorflow实现的如下:

input_split = tf.split(input, 4, axis=2)
output = tf.concat([tf.layers.conv1d(input_split[i], 128, 3, padding='same', activation=tf.nn.relu, name="conv_{}".format(i)) for i in range(4)], axis=2)

depthwise conv

我们更进一步的将输入100x256的矩阵,拆分成256个100x1的矩阵,然后通过由256个3x1x1组成的conv组(我们可以看到,如果将3x1x1换成3x1x2,其实就等效于上面的group conv)。我们将输出concat在一起,输出一个大小仍为100x256的矩阵。然后我们再通过一个1x256x512的conv层,得到大小为100x512的输出。
在depthwise conv中,分成了两步,第一步每个通道独立做卷积(depthwise conv),第二步通道之间做卷积(pointwise conv)。
最终,depthwise conv的参数量为256x3x1x1+1x256x512,对比普通的conv,参数量大约为1/3(跟kernel_size大小相关)。

上面就是我对group conv和depthwise conv的理解,可能理解存在错误,希望有人批评指正。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值