深度可分离卷积(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)、

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐