GhostNet 幽灵网络结构,keras 实现

由于疫情在家,基本没有什么事情干。在看看论文在CVPR2020中我看到了一篇比较有趣的论文,大家在跑CNN网络的时候,如果你去看一下不同通道的特征图,你会发现有一些特征图很类似,用肉眼看大家也不会觉得有什么区别。当时对于我们这些小菜鸟来说,这也没有什么问题,只要我们要的结果出来就好,准确度上去就可以了。我们也不会去在意这些事,这个时候我们就和大牛体现出差距了,大牛观察到这些问题,想到这些什么原因,怎么解决。在CVPR2020的这篇论文GhostNet: More Features from Cheap Operations。可以看到作者发现了这个特性,并加以了利用。

 在上面这幅图中我们可以看到许多类似的特征图,上图来自论文中。这个时候作者想到可以不可人工合成这些特征,通过一些简单的线性变换得到这些特征呢,这样大大减小了整个网络的运算量。作者先利用卷积生成一组特征,然后利用这一小部分特征做简单变换得到另一组特征(作者把这个简单变换后的特征叫做原始特征的鬼魂或者幽灵,我也不知道他为啥取这个名字),在将这两组特征串联,这样就实现了增加特征通道数,又不增加过多的卷积运算的效果。 

这里的思路是很巧妙的,有时候不得不佩服大牛们的想法。一些我们习以为常的现象他们把直接用上了。

使用keras 很容易对于上述网络进行实现。

def slices(x,channel):
    y = x[:,:,:,:channel] 
    return y
def GhostModule(x,outchannels,ratio,convkernel,dwkernel,padding='same',strides=1,data_format='channels_last',
                use_bias=False,activation=None):
    conv_out_channel = math.ceil(outchannels*1.0/ratio)
    x = Conv2D(int(conv_out_channel),(convkernel,convkernel),strides=(strides,strides),padding=padding,data_format=data_format,
               activation=activation,use_bias=use_bias)(x)
    if(ratio==1):
        return x
    
    dw = DepthwiseConv2D(dwkernel,strides,padding=padding,depth_multiplier=ratio-1,data_format=data_format,
                         activation=activation,use_bias=use_bias)(x)
    #dw = dw[:,:,:,:int(outchannels-conv_out_channel)]
    dw = Lambda(slices,arguments={'channel':int(outchannels-conv_out_channel)})(dw)
    x = Concatenate(axis=-1)([x,dw])
    return x

我们可以把这个模块应用到某些网络的特定模块里面。从而提到网络的准确度。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值