MobileNetV1
传统卷积
计算量
卷积核个数×卷积核宽×卷积核高×卷积核通道数×(输出高×输出宽)
N×Wk×Hk×C×Wo×Ho
输出的高和宽就代表了卷积核在输入图像上卷积的次数,括号前计算的是每次卷积所有参数量,括号内是卷积次数,相乘就是总的计算量。
以上图kernal=3 cannel=3,N=4为例
计算量 S1=4×3×3×3×Wo×Ho
深度可分离卷积
逐通道卷积(Depthwise Conv)
按通道提取的信息
nn.Conv2d(in_channel, out_channel, kernel_size, stride, padding, groups=groups, bias=False),
当传入的groups=in_channel时,表示逐通道卷积。
逐点卷积(Pointwise Convolution)
按点提取的信息
将深度卷积的结果做拿来做逐点卷积就组成了深度可分离卷积
nn.Conv2d(hidden_channel, out_channel, kernel_size=1, bias=False)
逐点卷积实现时也就是卷积核大小为1的卷积
计算量
计算量是逐通道卷积加上逐点卷积
逐通道卷积:卷积核个数×卷积核宽×卷积核高×输出高×输出宽
逐点卷积:卷积核个数×卷积核深度×输出高×输出宽
与普通卷积的计算量之比=1/N+1/k*k
用上面普通卷积的例子来对比
计算量 S2=(3×3×3×Wo×Ho)+(4×3×1×1×Wo×Ho)
S2/S1 = 1/4+1/9≈0.36
相当于N取4时,参数是原来的0.36倍
V1网络结构
MobileNetV2
倒残差结构Bottleneck block
先进行一个映射将输入数据扩充维度,一般扩充三倍效果比较好
然后进行深度可分离卷积,再逐点卷积时降低维度,将输出值映射成较小的模块,携带更少的数据,从而解决在移动设备上显存不够的问题。
传统的残差结构,通过1×1卷积减少通道个数再进行3×3卷积后通过1×1升维。
倒残差,先通过1×1升维再计算3×3的逐通道卷积+逐点卷积,同时吧relu替换成了relu6
![](https://img-blog.csdnimg.cn/b038d18bf0ad42da95930d92d418afd9.png)
v1与v2的比较
升维降维时的特征损失的解释
将输入映射成高纬,再降维后,会造成一定的特征损失
将n映射为2,3时损失特征最多,维度更高时损失特征少
具体的映射方式,例如输入X是一组2*10的,有两个维度10组数据,要将其升到s维
通过一个矩阵T将其升维,再通过矩阵T的逆将其降维
降维
V2整体网络结构
t为膨胀系数,表示升维时要扩充多少倍
c为通道数
n表示每个模块重复次数
s为每个模块重复第一次的步长,第一次之后s全都为1
原文中给出的bottleneck有两种,只有当s为1切输入维度等于输出维度时才使用带有残差连接的bottleneck