深度可分离卷积及其代码实现
·
深度可分离卷积(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)、
更多推荐
已为社区贡献5条内容
所有评论(0)