文章目录
- 经典CNN网络
- 经典网络的改进点
- AlexNet
- ZFNet
- VGGNet
- GoogleNet Inception
- Inception V3
- ResNet50
- MobileNet
- ShuffleNet
- EffcientNet
经典CNN网络
- AlexNet
- ZFNet
- VGG
- GoogleNet Inception
- Inception V3
- ResNet50
- MobileNet
- ShuffleNet
- EffcientNet
经典网络的改进点
名称 | 改进点 |
VGG16 | 1、使用非常多的3*3卷积串联,利用小卷积代替大卷积,该操作使得其拥有更少的参数量,同时会比单独一个卷积层拥有更多的非线性变换。2、探索了卷积神经网络的深度与其性能之间的关系,成功构建16层网络(还有VGG19的19层网络)。 |
ResNet50 | 1、使用残差网络,其可以解决由于网络深度加深而产生的学习效率变低与准确率无法有效提升的问题。2、采用bottleneck design结构,在3x3网络结构前利用1x1卷积降维,在3x3网络结构后,利用1x1卷积升维,相比直接使用3x3网络卷积效果更好,参数更少。 |
InceptionV3 | 1、Inception系列通用的改进点是使用不同大小的卷积核,使得存在不同大小的感受野,最后实现拼接达到不同尺度特征的融合。2、利用1x7的卷积和7x1的卷积代替7x7的卷积,这样可以只使用约(1x7 + 7x1) / (7x7) = 28.6%的计算开销;利用1x3的卷积和3x1的卷积代替3x3的卷积,这样可以只使用约(1x3 + 3x1) / (3x3) = 67%的计算开销。 |
MobileNet | 1、是一种轻量级的深层神经网络,为一定设备设计。 2、采用depthwise separable convolution结构,3x3卷积核厚度只有一层,然后在输入张量上一层一层地滑动,所以一个卷积核就对应了一个输出通道,当卷积完成后,在利用1x1的卷积调整厚度,实现参数减少。 |
ShuffleNet | 1、新架构利用两个新的操作,逐点组卷积(分组卷积)和通道洗牌,在保持准确性的同时大大降低了计算成本 |
EffcientNet | 1、采用特殊的卷积模块,显著降低计算负担 |
AlexNet
ZFNet
采用了AlexNet的结构,有两个小修改
- 第一层的滤波器尺寸从11 * 11减小为7 * 7
- 第一层的stride(步长)从4将为2
VGGNet
- 2014的亚军,Simonyan和Zisserman发表
- 使用了非常统一的结构,和AlexNet类似,使用了更小的滤波器,使用了大量的滤波器
- 使用4个GPU训练了3个多星期
- 非常普遍的用于特征提取/图像表达
- 但是VGG包含了1亿3千8百万个参数
下面为网络结构图
1、一张原始图片被resize到(224,224,3)。
2、conv1两次[3,3]卷积网络,输出的特征层为64,输出为(224,224,64),再2X2最大池化,输出net为(112,112,64)。
3、conv2两次[3,3]卷积网络,输出的特征层为128,输出net为(112,112,128),再2X2最大池化,输出net为(56,56,128)。
4、conv3三次[3,3]卷积网络,输出的特征层为256,输出net为(56,56,256),再2X2最大池化,输出net为(28,28,256)。
5、conv3三次[3,3]卷积网络,输出的特征层为256,输出net为(28,28,512),再2X2最大池化,输出net为(14,14,512)。
6、conv3三次[3,3]卷积网络,输出的特征层为256,输出net为(14,14,512),再2X2最大池化,输出net为(7,7,512)。
7、利用卷积的方式模拟全连接层,效果等同,输出net为(1,1,4096)。共进行两次。
8、利用卷积的方式模拟全连接层,效果等同,输出net为(1,1,1000)。
最后输出的就是每个类的预测。
GoogleNet Inception
- TOP-5错误率为6.67%
- 使用了Batch Normalization,图像增强(扭曲),RMSprop优化器
- 使用了比较小的滤波器,虽然有22层,但是总的参数为4百万,少于AlexNet的6千万
Inception Net想要解决的三个问题
- 需要不同尺寸的滤波器对待不同大小的对象
- 太深的网络容易过拟合,而且容易梯度消失
- 将比较大的滤波器的卷积层直接连接计算量太大
方法
第一次改进:使用不同尺寸的滤波器在同一层
第二次改进:使用不同尺寸的滤波器在同一层,并且使用1*1Convolution 将输入channel压缩减小计算量
Inception V3
Inception系列的网络的特点是采用不同大小的卷积核,使得存在不同大小的感受野,最后实现拼接达到不同尺度特征的融合。
- Factorizing Convolutions (卷积分解)
- Efficient Grid Size Reduction
- Inception-v3 Architecture
把一个5x5的卷积可以改成两次3x3的卷积
把一个3x3的卷积改成两次3x1和1x3的卷积
把一个3x3的卷积改成两次3x1和1x3的卷积,1x3和3x1分别作为输出
网络结构
ResNet50
ResNet50最大的特点是使用了残差网络。
残差网络的特点是将靠前若干层的某一层数据输出直接跳过多层引入到后面数据层的输入部分。
意味着后面的特征层的内容会有一部分由其前面的某一层线性贡献。
其结构如下
ResNet50有两个基本的块,分别名为Conv Block和Identity Block,其中Conv Block输入和输出的维度是不一样的,所以不能连续串联,它的作用是改变网络的维度;Identity Block输入维度和输出维度相同,可以串联,用于加深网络的。
Conv Block的结构如下:
Identity Block的结构如下:
这两个都是残差网络结构。
总的网络结构如下:
MobileNet
MobileNet模型是Google针对手机等嵌入式设备提出的一种轻量级的深层神经网络,其使用的核心思想便是depthwise separable convolution。
对于一个卷积点而言:
假设有一个3×3大小的卷积层,其输入通道为16、输出通道为32。具体为,32个3×3大小的卷积核会遍历16个通道中的每个数据,最后可得到所需的32个输出通道,所需参数为16×32×3×3=4608个。
应用深度可分离卷积,用16个3×3大小的卷积核分别遍历16通道的数据,得到了16个特征图谱。在融合操作之前,接着用32个1×1大小的卷积核遍历这16个特征图谱,所需参数为16×3×3+16×32×1×1=656个。
可以看出来depthwise separable convolution可以减少模型的参数。
如下这张图就是depthwise separable convolution的结构
在建立模型的时候,可以使用Keras中的DepthwiseConv2D层实现深度可分离卷积,然后再利用1x1卷积调整channels数。
通俗地理解就是3x3的卷积核厚度只有一层,然后在输入张量上一层一层地滑动,每一次卷积完生成一个输出通道,当卷积完成后,在利用1x1的卷积调整厚度。
如下就是MobileNet的结构,其中Conv dw就是分层卷积,在其之后都会接一个1x1的卷积进行通道处理,
ShuffleNet
- 引入了一种名位ShuffleNet的计算效率高的CNN架构,该架构专为具有非常有限的计算能力的移动设备而设计
- 新架构利用两个新的操作,逐点组卷积(分组卷积)和通道洗牌,在保持准确性的同时大大降低了计算成本
- 在ImageNet分类和MS COCO对象检测的实验证明了ShuffleNet由于其他结构的性能,例如:在40 MFLOP的计算预算下,在ImageNet分类任务上必最近的MobileNet更低的TOP1错误(绝对7.8%)。在基于ARM的移动设备上,ShuffleNet实现了比AlexNet大约13倍的实际加速,同时保持了相当的精度。
分组卷积(group convolution)和 通道洗牌(channel shuffle)
网络结构
经典结构(stage对应)
Convolution V.S. Group Convolution
Channel Shuffle
具体操作如下:
通道随机混合操作(Channel Shuffle Operation)可以看成“重塑-转置-重塑”
这里假设把4个Feature Maps级联后,共1024个Channels。现在我们想把这个1024个Channels随机打乱混合。首先把Channels重塑为(g, c),其中 g 表示分组数目,c=1024/g。然后把它转置一下为(c, g)。然后把它重塑为1024个通道。
import torch
def channel_shuffle(x, groups):
batchsize, num_channels, height, width = x.data.size()
channels_per_group = num_channels // groups
# reshape
x = x.view(batchsize, groups,
channels_per_group, height, width)
# transpose
# - contiguous() required if transpose() is used before view().
# See https://github.com/pytorch/pytorch/issues/764
x = torch.transpose(x, 1, 2).contiguous()
# flatten
x = x.view(batchsize, -1, height, width)
return x
总结
- 分组卷积(group convolution)和 通道洗牌(channel shuffle)
- 分组卷积减少计算量:如果输入feature map的尺寸为M * M,卷积核尺寸为N * N,假设输入4个通道,输出为8个通道,如果不分组,计算量为M * M * N * N * 4 * 8,如果分为两组,每组取2个输入通道,4个输出通道,那么计算量为(M * M * N * N * 2 * 4 ) * 2 = M * M * N * N * 4 * 4,相比而言,计算量减少一半
- 如果分组更多,那么计算量减少更多,论文中推荐分为8组
EffcientNet
- 随着卷积神经网络在终端产品种的应用不断增加,模型需要在嵌入式移动硬件上高校运行。因此,轻量级的模型已经成为热门的研究课题,包括二进制网络到定制的卷积层的各种方法。
- 本文提出了一终新颖的卷积模块,它可以显著降低计算负担,同时超越当前最先进的技术水平。我们的模型,名为EffNet,针对一开始很轻量级的模型进行进一步优化,旨在解决现有模型(如MobileNet和ShuffleNet)中的问题。
EffNet MobileNet ShuffleNet比较
卷积分解
计算量分析
池化分解
- 第一次卷积在一个方向上面池化
- 第二次卷积在另一个方向上面池化