大家好,欢迎来到IT知识分享网。
常规卷积
常规卷积中,连接的上一层一般具有多个通道(这里假设为n个通道),因此在做卷积时,一个滤波器(filter)必须具有n个卷积核(kernel)来与之对应。一个滤波器完成一次卷积,实际上是多个卷积核与上一层对应通道的特征图进行卷积后,再进行相加,从而输出下一层的一个通道特征图。在下一层中,若需要得到多个通道的特征图(这里假设为m个通道),那么对应的滤波器就需要m个。
用通俗的话来概括卷积,他起到的作用就是两个:一个是对上一层的特征图进行尺寸调整,另一个是则是对上一层的特征图数量进行调整,也就是通道数的调整。
这里不理解的可以看吴恩达有关三维卷积的讲解视频:
深度可分离卷积
深度可分离卷积,其实只对常规卷积做了一个很小的改动,但是带来的确实参数量的下降,这无疑为网络的轻量化带来了好处。
对于来自上一层的多通道特征图,首先将其全部拆分为单个通道的特征图,分别对他们进行单通道卷积,然后重新堆叠到一起。这被称之为逐通道卷积(Depthwise Convolution)。这个拆分的动作十分关键,在这一步里,它只对来自上一层的特征图做了尺寸的调整,而通道数没有发生变化。于是将前面得到的特征图进行第二次卷积,这是采取的卷积核都是1×1大小的,滤波器包含了与上一层通道数一样数量的卷积核。一个滤波器输出一张特征图,因此多个通道,则需要多个滤波器。这又被称之为逐点卷积(Pointwise Convolution)。
参数量对比
假设存在这样一个场景,上一层有一个64×64大小,3通道的特征图,需要经过卷积操作,输出4个通道的特征图,并且要求尺寸不改变。我们可以对比一下采用常规卷积和深度可分离卷积参数量各是多少。
import torch.nn as nn
from torchsummary import summary
class normal_conv(nn.Module):
def __init__(self, in_channels, out_channels):
super(normal_conv, self).__init__()
self.conv = nn.Conv2d(in_channels,
out_channels,
kernel_size=3,
stride=1,
padding=1,
bias=True)
def forward(self, x):
return self.conv(x)
class sep_conv(nn.Module):
def __init__(self, in_channels, out_channels):
super(sep_conv, self).__init__()
self.deepthwise_conv = nn.Conv2d(in_channels,
in_channels,
kernel_size=3,
stride=1,
padding=1,
bias=True,
groups=in_channels)
self.pointwise_conv = nn.Conv2d(in_channels,
out_channels,
kernel_size=1,
stride=1,
padding=0,
bias=True,
groups=1)
def forward(self,x):
d = self.deepthwise_conv(x)
p = self.pointwise_conv(d)
return p
input_size = (3,64,64)
conv1 = normal_conv(3,4)
conv2 = sep_conv(3,4)
print("使用常规卷积所需要的参数:")
print(summary(conv1,input_size,batch_size=1))
print("使用深度可分离卷积所需要的参数:")
print(summary(conv2,input_size,batch_size=1))
输出结果:
使用常规卷积所需要的参数:
----------------------------------------------------------------
Layer (type) Output Shape Param #
================================================================
Conv2d-1 [1, 4, 64, 64] 112
================================================================
Total params: 112
Trainable params: 112
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.05
Forward/backward pass size (MB): 0.12
Params size (MB): 0.00
Estimated Total Size (MB): 0.17
----------------------------------------------------------------
None
使用深度可分离卷积所需要的参数:
----------------------------------------------------------------
Layer (type) Output Shape Param #
================================================================
Conv2d-1 [1, 3, 64, 64] 30
Conv2d-2 [1, 4, 64, 64] 16
================================================================
Total params: 46
Trainable params: 46
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.05
Forward/backward pass size (MB): 0.22
Params size (MB): 0.00
Estimated Total Size (MB): 0.27
----------------------------------------------------------------
None
可以看到,参数由112下降到了46,通道越多这种效果越明显。
参考文献
- https://blog.csdn.net/weixin_30793735/article/details/88915612
- https://yinguobing.com/separable-convolution/
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/30885.html