首页 > 编程知识 正文

分组卷积计算量,可分离卷积计算量

时间:2023-05-04 10:41:31 阅读:286489 作者:1513

一、分组卷积 (1) ALexNet网络

分组卷积(Group Convolution),最早见于AlexNet网络,它被用来切分网络,使其在2个GPU上并行运行,AlexNet网络结构如下:

AlexNet将网络分成了两部分,最后输出的时候再进行合并,该网络好处有以下几点:
1.总的参数量减少了,提高了网络的计算效率(后面会详细介绍参数量减少的原因)
2.AlexNet首次采用最大值池化,避免了平均池化层的模糊化的效果,并且步长比池化的核的尺寸小,这样池化层的输出之间有重叠,提升了特征的丰富性.
3.AlexNet使用ReLU代替了Sigmoid,其能更快的训练,同时解决sigmoid在训练较深的网络中出现的梯度消失,或者说梯度弥散的问题.
4. 全连接中使用dropout方法防止过拟合
5. 提出了LRN层局部响应归一化,对局部神经元创建了竞争的机制,使得其中响应小打的值变得更大,并抑制反馈较小的.
注意:LRN全称为Local Response Normalization,即局部响应归一化层,LRN函数类似Dropout,是一种防止过拟合的方法。这个函数很少使用,基本上被类似Dropout这样的方法取代。

(二) 标准卷积网络参数的计算

如左图:如果输入featuer map 尺寸为C * H * W ,卷积核有N 个,输出feature map 与卷积核的数量相同为N ,每个卷积核的尺寸为C * K * K, N个卷积核的总参数量为NCK*K.

(三) 分组卷积网络参数的计算

如右图:如果输入feature map 尺寸为C * H * W ,输出feature map 数量为N 个,如果设定要分成G 个组, 则每组的输入数量C / G, 每组的输出feature map 数量为N/G,每个卷积核的尺寸为C/G * K * K ,卷积核的总数仍为N个,每组卷积核的数量为N/G ,卷积核只与其同组的输入map进行卷积,卷积核的总参数量为N * C/G * K *K ,可见总参数量减少为原来的1/G.

二、深度可分离卷积

当分组数量等于输入map数量,输出map数量也等于输入map数量,即G = N = C , N 个卷积核每个尺寸为1 * K * K时,分组卷积就变成了深度卷积。(用深度卷积主要进行像素的融合)
如下图所示:深度可分离卷积的操作过程。

深度可分离的卷积包括两个步骤:深度卷积和1x1卷积。
利用3x3的深度卷积做像素级别的融合,1x1的逐点卷积作通道融合,分离说的是像素融合和通道融合分开进行,以便于减少参数量。

(四) 三种卷积网络参数计算 # 用torch实现标准卷积网络和分组卷积网络,并对参数进行计算。import torch.nn as nn# 输入通道* 卷积核尺寸 * 输出通道 + 偏置个数 4 * 3 * 3 * 8 + 8 = 298conv1 = nn.Conv2d(4, 8, 3, 1)conv2 = nn.Conv2d(4, 8, 3, 1, groups=2) # 这里必须注意,分组的组数必须是输入通道和输出通道的倍数。conv3 = nn.Conv2d(4,8,3,1,groups=4) # 深度卷积,输入通道数等于分组通道数params1 = conv1.parameters()params2 = conv2.parameters()params3 = conv3.parameters()# e.numel() 表示元素e的个数print("标准卷积参数个数: %s " % sum([e.numel() for e in list(params1)])) # 296# 分组后的参数是标准网络参数的1/G , 因为标准网络的参数是288 + 8 所以 分组后的参数就是288/2 + 8=80 print("分组卷积参数个数: %s"% sum([e.numel() for e in list(params2)])) # 152print("深度卷积参数个数 %s"% sum([e.numel() for e in list(params3)])) # 288 /4 +8 =80# 所以可以看到分组后参数减少了,这也是分组卷积神经网络的一个重要应用。 注意 nn.Conv2d(3, 6, 3, 1, groups=3) # 这里必须注意,分组的组数必须是输入通道和输出通道的倍数。分组后参数的个数减少成了标准卷积网络的 1/G 倍,G 为分组的组数深度可分离卷积的参数量最少。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。