深度可分离卷积及其代码实现

深度可分离卷积(depthwise separable conv)

一共两步,第一步先进行逐通道卷积(Depthwise Convolution),第二步进行

逐点卷积(Pointwise Convolution)

普通卷积:输入是三个通道,输出是四个通道

这里需要4个卷积核(输出几个通道就要几个卷积核,这里输出四个通道所以需要四个卷积核)

每个卷积核是3*3*3

所以参数总量是4个3*3*3,等于108个参数

 深度卷积:

深度可分离卷积可分为两个过程,分别为逐通道卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution)

(1)逐通道卷积

这里参数量是3个3*3,等于27个

 这样卷积的话,通道数不可改变,而且通道之间的信息也没有进行交互

(2)逐点卷积

这里我们再用四个卷积核,每个卷积核大小为1*1*3

 这样的话,参数总量就是4*1*1*3+27=39

可以看到,参数量大大减少

上面两步合起来就是:

代码实现:

class DepthWiseConv(nn.Module):
    def __init__(self,in_channel,out_channel):

        #这一行千万不要忘记
        super(DepthWiseConv, self).__init__()

        # 逐通道卷积
        self.depth_conv = nn.Conv2d(in_channels=in_channel,
                                    out_channels=in_channel,
                                    kernel_size=3,
                                    stride=1,
                                    padding=1,
                                    groups=in_channel)
        # groups是一个数,当groups=in_channel时,表示做逐通道卷积

        #逐点卷积
        self.point_conv = nn.Conv2d(in_channels=in_channel,
                                    out_channels=out_channel,
                                    kernel_size=1,
                                    stride=1,
                                    padding=0,
                                    groups=1)
    
   def forward(self,input):
        out = self.depth_conv(input)
        out = self.point_conv(out)
        return out
#将普通卷积替换成深度可分离卷积
nn.Conv2d(32,128,kernal_size=3,stride=1,padding=1)

DepthWiseConv(32,128)

 

 

代码实现:

Conv2d(in_channel,out_channel,kernel_size,stride=1,padding=0,dilation=0,groups=1,bias=True)

,就代表在做深度可分离卷积(depth—wise conv)、

  • 43
    点赞
  • 298
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值