【人工智能学习之卷积神经网络篇(三)】
1 分组卷积
1.1 问题引出
1 个 5 * 5 的卷积,能被 2 个 3 * 3 的卷积替代,
1 个 7 * 7 的卷积,能被 3 个 3 * 3 的卷积替代,后者的网络更深,
比较两者的参数量、计算量,谁更大?
1.2 分组卷积
如果你明白了上面这个问题,接下来让我们看看分组卷积:
对通道进行分组,然后每组分别卷积,卷积核只与其同组的输入通道进行卷积运算。
(卷积运算的输入数据和输出数据,通过通道层面实现了全连接。)
# 分组之后 如果原来是12 分成3组 每一组有4个通道,每个卷积核就是4个通道,输出通道是6,表示6个卷积核
# 因此输出的参数是 6 * 4 * 3 * 3
layer3 = nn.Conv2d(12, 6, 3, 1, groups=3)
print(layer3.weight.data.numel()) # 216
print(layer3.weight.shape) # 6, 4, 3, 3
layer1 = nn.Conv2d(6, 6, 3, 1, groups=1)
layer2 = nn.Conv2d(6, 6, 3, 1, groups=2)
layer3 = nn.Conv2d(6, 6, 3, 1, groups=3)
# 3 * 3 * 1 * 6
layer4 = nn.Conv2d(6, 6, 3, 1, groups=6) # 深度卷积DW(Depthwise Convolution)
print(layer1.weight.data.numel()) # 324
print(layer1.weight.shape) # 6, 6, 3, 3
print(layer2.weight.data.numel()) # 162
print(layer3.weight.data.numel()) # 108
print(layer4.weight.data.numel()) # 54
print(layer4.weight.shape) # 6, 1, 3, 3
优点:
- 减少参数数量: 分组卷积通过将输入通道划分成多个组,使得每个组内的卷积核共享参数,从而有效地减少了模型的参数数量,降低了计算和存储的开销。
- 降低计算复杂度: 由于参数数量减少,可以在一定程度上降低计算复杂度,特别是在资源受限的环境中,如移动设备和嵌入式系统。
缺点:
- 数据信息只存在本组里面, 通道之间的信息没有融合。
其中某些组可能会在学习过程中变得过于专注于某些特定的特征,而无法有效地与其他组共享信息。模型可能会受限于分组内的特征,而难以获取全局的特征。
2 深度可分离卷积
2.1 深度可分离卷积与普通卷积
深度可分离卷积就是将普通卷积拆分成为一个深度卷积和一个逐点卷积。
普通卷积运算:
输入一个12×12×3的一个特征图,经过5×5×3的卷积核卷积得到一个8×8×1的输出特征图。
那现在要得到 8 * 8 * 256的特征图,需要 256个 5 * 5 *3的卷积核。
深度卷积
卷积核的channel维度等于1,这样就是深度卷积,意为在每一个channel上做卷积。
与标准卷积网络不一样的是,我们将卷积核拆分成为但单通道形式,在不改变输入特征图像的深度的情况下,对每一通道进行卷积操作,这样就得到了和输入特征图通道数一致的输出特征图。如上图:输入12×12×3的特征图,经过5×5×1×3的深度卷积之后,得到了8×8×3的输出特征图。输入输出的通道数不变是3。这样就会有一个问题,通道数太少,特征图的维度太少,能获取到足够的有效信息。吗?
逐点卷积
逐点卷积就是1×1卷积。主要作用就是对特征图进行升维和降维。
在深度卷积的过程中,我们得到了8×8×3的输出特征图,我们用256个1×1×3的卷积核对输入特征图进行卷积操作,输出的特征图是8×8×256。
标准卷积核深度可分离卷积对比:
深度可分离卷积作用:
- 减少参数数量: 深度可分离卷积通过在深度卷积和逐点卷积阶段分别使用更少的参数,实现了总体上的参数数量减少。更容易在资源受限的环境中部署。
- 降低计算量: 深度可分离卷积的计算相对普通卷积计算较低,因为它在两个步骤中分别进行卷积,而不是在单个步骤中进行。这对于移动设备等资源受限的场景非常有用,可以提高模型的推理速度。
- 捕获空间特征和通道特征: 深度可分离卷积首先对输入的每个通道进行卷积(深度卷积),然后使用逐点卷积将这些通道的特征整合在一起。这有助于捕获输入数据中的空间特征和通道特征,提高模型的学习能力。
想象一下你在画一幅彩色画。每个颜色通道就像画布上的一种颜色,比如红色、绿色和蓝色。现在,我们要用深度可分离卷积来处理这个画。
首先,我们对每种颜色单独进行处理,就像你分别在红色、绿色和蓝色上涂颜色一样。这是深度卷积的部分,它有助