参考:轻量级网络-Mobilenet系列(v1,v2,v3) - 知乎
盘点下每种类型的层计算可学习参数的数量
Input layer:输入层所做的只是读取输入图像,因此这里没有可以学习的参数。
Convolutional layers:一个卷积层,其输入为l个特征图,输出为k个特征图,过滤器尺寸为n*m。如下举例:
输入有l=32个特征图作为输入,k=64个特征图作为输出,滤波器大小为n=3,m=3,它是一个3*3*32的过滤器,因为我们的输入有32个维度。我们学习64个不同的3*3*32过滤器。因此权重的总数是n*m*l*k。然后,每个特征图也有一个偏置项,所以我们的参数总数为(n*m*l+1)*k。
Pooling layers:池化层,例如执行以下操作:用最大值替换2*2邻域。因此,无须在池化层中学习任何参数。
Fully-connected layers:在全连接层中,所有输入单元对每个输出单元都有一个单独的权重。对于n个输入和m个输出,权重数为n*m。此外,对每个输出节点都有一个偏差,因此有(n+1)*m个参数。
Output layer:输出层是一个普通的全连接层,所以有(n+1)*m个参数,其中n是输入的数量,m是输出的数量。
使用LeNet举例计算:
层 | 输入 | Filter | Stride | Padding | 输出 | 参数量计算公式 | 参数量 |
Input | 32*32*1 | 32*32*1 | 0 | ||||
Conv1 | 32*32*1 | 5*5*6 | 1 | 0 | 28*28*6 | (5*5*1+1)*6 | 156 |
Maxpool1 | 28*28*6 | 2*2 | 2 | 0 | 14*14*6 | 0 | |
Conv2 | 14*14*6 | 5*5*16 | 1 | 0 | 10*10*16 | (5*5*6+1)*16 | 2416 |
Maxpool2 | 10*10*16 | 2*2 | 2 | 0 | 5*5*16 | 0 | |
FC1 | 5*5*16 | 120 | (5*5*16+1)*120 | 48120 | |||
FC2 | 120 | 84 | (120+1)*84 | 10164 | |||
FC3 | 84 | 10 | (84+1)*10 | 850 |
所以总的参数量为:156+2416+48120+10164+850=61706个
深度可分离卷积:
普通卷积层的特征提取与特征组合一次完成并输出,而深度可分离卷积先用厚度为1的3*3的卷积核(depthwise分层卷积),再用1*1的卷积核(pointwise卷积)调整通道数,将特征提取与特征组合分开进行。深度可分离卷积可大大减少模型的参数,其具体结构如下:
对比举例:
假设某一网络卷积层,其卷积核大小为3*3,输入通道为16,输出通道为32。
常规CNN的参数量为:(3*3*16+1)*32=4640个。
深度可分离卷积参数量计算:
先用16个大小为3*3的卷积核(3*3*1)作用于16个通道的输入图像,得到了16个特征图。在做融合操作之前,接着用32个大小为1*1的卷积核(1*1*16)遍历上述得到16个特征图。则参数量为:(3*3*1+1)*16+(1*1*16+1)*32=706个。
在进行depthwise卷积时只使用了一种维度为in_channels的卷积核进行特征提取(没有进行特征组合);在进行pointwise卷积时只使用了output_channels种维度为in_channles*1*1的卷积核进行特征组合。