We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Earth Guardian https://ift.tt/MAKR87j redspider110
<p>卷积神经网络基础,以及经典模型的介绍: <code>LeNet-5, AlexNet, VGGNet, GoogLeNet, ResNet, MobileNet</code> 。 </p>
CNN: Convolutional Neural Networks 卷积神经网络也是由输入层、输出层和多个隐藏层组成,但是隐藏层可分为卷积层 Convolution ,池化层 Pooling 、全连接层 FCN:fully connected neural network 。在图像分类任务中,卷积和池化后的结果是每个输入图像的特征空间,然后将它喂给全连接层实现分类,即从输入图像到标签集的映射。目前主流的卷积神经网络,比如 VGG, ResNet 等都是由简单的 CNN 调整组合而来。下图为常见的卷积和池化的示例:
CNN: Convolutional Neural Networks
Convolution
Pooling
FCN:fully connected neural network
VGG, ResNet
CNN
上图示例输入为 277*277 的 RGB 图像,采用 96 个 11*11*3 的卷积核 kernels 同时扫描,得到输出的特征图是 96 个 267*267 的二维 feature map ; 267*267 是单个特征图的宽高, 96 是卷积核的个数,原本 3 通道元素在卷积的时候会被作为一个元素加起来。这些 feature map 可视化之后,可以看到:
277*277
RGB
11*11*3
kernels
267*267
feature map
Feature map
Receptive field
Convolutional Layer
卷积是一种有效提取图片特征的方法:使用一个正方形的卷积核,遍历图片上的每个像素点;图片与卷积核重合区域内相对应的每一个像素值乘以卷积核内对应点的权重,然后求和得到输出图片中的一个像素值。输入图像感受野区域和卷积核中对应位置相乘后求和,卷积核中的值表示权重;输出值为卷积核矩阵和感受野区域矩阵进行点积。根据线性代数理论,点积表示向量在某个特征(向量)上的投影再乘以这个特征(向量),直接意义表示向量在某个特征(向量)上的强度;也就是说,做一次点积相当于提取了一次特征。卷积层的意义:卷积核在输入图像上从左到右,从上到下滑动,提取整幅图像在卷积核上的特征。计算过程如下图所示:
图中显示了两个卷积示例,绿色部分和红色部分;绿色部分见图中计算结果,红色部分计算如下: (-1)*2+(-1)*9+(-1)*2+1*4+1*4=-5 。
(-1)*2+(-1)*9+(-1)*2+1*4+1*4=-5
假设输入图像大小为 n*n ,卷积核大小为 f*f ,滑动步长为 s ,输入图像 padding 位数为 p ,则输出图像大小为 (n+2p-f)/s + 1 。输入图像和卷积核做卷积后,输出特征图大小和个数就是由这些参数决定:
n*n
f*f
s
padding
p
(n+2p-f)/s + 1
stride
channels
卷积过程是一个提取对应特征图的过程,而特征提取由卷积核性质来决定;不同卷积核(即滤波器)对应的主观效果:
卷积核通常为正方形,大小为奇数,通常为 1*1, 3*3, 5*5, 7*7 。
1*1, 3*3, 5*5, 7*7
pooling
池化 pooling 是一种降采样操作 subsampling ,主要目标是降低特征图的特征空间,或者可以认为是降低特征图的分辨率。因为特征图参数太多,而图像细节不利于高层特征的抽取。池化分为最大池化和平均池化两类:
subsampling
2*2
假设输入大小为 n*n ,池化核大小为 f*f ,滑动步长为 s ,则输出大小为 (n-f)/s + 1 ;和卷积核计算公式一样,只不过池化时不涉及 padding ,池化也不会改变输入和输出的通道数。
(n-f)/s + 1
全连接 Fully Connected Network 层,就是普通的神经网络层;特点是每个神经元与前后相邻层的每一个神经元都有连接关系,即全连接。一张分辨率仅仅是 28*28 的黑白图像,就有接近 40 万个待优化参数;而现实中都为高分辨率的彩色图像,像素点非常多,且为红黄蓝三通道信息;而待优化参数过多,容易导致模型的过拟合。在图像分类中,先把输入图像通过卷积和池化后提取特征,降低参数数量,在接入全连接层输出预测的结果;全连接层就是把卷积层和池化层的输出展开成一维的输出结果。
Fully Connected Network
28*28
CNN 与传统的神经网络相比,主要有三大特色:局部感知、权重共享和多卷积核。
1000X1000
10x10
大型深层的卷积神经网络 CNNs (请注意这里是复数)通常由多个基础 CNN 组成,而基础 CNN 结构前后连接、层内调整组成,根据功能不同,我们称这些前后连接的结构处于不同阶段 Stage 。不同 Stage 里 CNN 会有不同的单元和结构,比如卷积核 kernel 大小、个数, padding, stride 等可能不同,激活函数 activition function 可能不同, pooling 操作可能不存在等等。
CNNs
Stage
kernel
padding, stride
activition function
LeNet5
LeNet 诞生于 1994 年,由 Yann LeCun 提出并实现,是最早的卷积神经网络之一。LeNet-5 模型相关资源:
LeNet
Yann LeCun
LeNet-5
LeNet-5 神经网络结构为:
LeNet-5 主要分为输入层,卷积层特征提取,全连接层分类识别。
32*32*1
5*5*1
(32-5)/1+1=28
28*28*6
Feature Map
w
b
5*5=25
(5*5*1+1)*6=156
28*28*156=122304
14*14*6
sigmoid
(1+1)*6=12
14*14
(2*2+1)*6*14*14=5880
5*5
(14-5)/1+1=10
10*10*16
(5*5*3+1)*6 + (5*5*4+1)*9 + (5*5*6+1)*1=1516
10*10
10*10*1516=151600
5*5*16
(1+1)*16=32
(2*2+1)*16*5*5=2000
(5-5)/1+1=1
1*1*120
(5*5*16+1)*120=48120
1*1
1*1*48120=48120
7*12
(120+1)*84=10164
RBF
84*10=840
AlexNet
AlexNet 是 Alex Krizhevsky, Ilya Sutskever 在多伦多大学 Geoff Hinton 的实验室设计出的一个深层卷积神经网络;该模型是 2012 年年提出并夺得了当年 ImageNet LSVRC 的冠军,且准确率远超第二名( top5 错误率为 15.3% ,第二名为 26.2% )。 AlexNet 可以说是具有历史意义的一个网络结构,在此之前深度学习已经沉寂了很长时间,从它诞生之后, ImageNet 以后举行的比赛,冠军都是用卷积神经网络 CNN 来做的,并且层次越来越深,使得 CNN 成为在图像识别分类的核心算法模型,带来了深度学习的大爆发。而仔细分析 AlexNet ,可以看出它实际上是参考了 LeNet-5 ,只是 LeNet 当年受到了计算机硬件性能的限制。
Alex Krizhevsky, Ilya Sutskever
Geoff Hinton
ImageNet LSVRC
top5
ImageNet
AlexNet 模型的相关资源:
AlexNet 一共有 5 个卷积层和 3 个全连接层,该模型的特点:
ReLU
Sigmoid, tanh
Sigmoid
ReLU: Rectified Linear Units
Dropout
Hinton
Overlapping Pooling
LRN: Local Response Normalization
LRN
top 1/5
1.4/1.2%
GPU
1.7/1.2%
其中 ReLU 激励函数和正则化使用 Dropout 成为后续 CNN 的标配。
所有激活函数都使用 ReLU ;所有的池化层都为 3*3 步长为 2 的最大池化。
3*3
227x227x3
11*11
(227+0-11)/4+1=55
55*55*96
(55-3)/2+1=27
27*27*96
27*27*48
(27+2*2-5)/1+1=27
27*27*128
13*13*128
(13+2-3)/1+1=13
13*13*192
13*13*196
6*6*128
1*1*2048
如下为 AlexNet 模型的简图:
VGG
VGGNet 是 Visual Geometry Group 牛津大学计算机视觉组和 Google DeepMind 公司的研究员一起研发的深度卷积神经网络,该模型是 2014 年提出并取得了 ImageNet-ILSVRC 竞赛的第二名(第一名是 GoogLeNet )和定位项目的第一名。VGGNet 首次将网络深度提升到了 19 层,并且使用较小的卷积核,证明了增加网络的深度能够在一定程度上影响网络最终的性能,使错误率大幅下降;该网络拓展性很强,迁移到其它图片数据上的泛化性也非常好, VGG 常被用来提取图像特征。VGG 模型相关资源:
VGGNet
Visual Geometry Group
Google DeepMind
ImageNet-ILSVRC
GoogLeNet
VGGNet 可以看成是加深版本的 AlexNet ,都是由卷积层、全连接层两大部分构成:
VGG16, VGG19 是常用模型,它们通常是从图像中提取 CNN 特征的首选算法;主要缺点在于参数量非常大,有 140M 左右需要更大的存储空间。
VGG16, VGG19
VGGNet 的特点可以通过下图体现:
VGGNet 结构简洁清晰,由 5 段卷积层(每段可能会有 3 到 5 个卷积层),3 个全连接层, Softmax 输出层构成,所有隐藏层的激活函数都采用 ReLU 函数,池化层采用最大池化 max-pooling 。
Softmax
max-pooling
224*224
SAME
2*3*3=18
1*5*5=25
3*3*3=27
7*7
1*7*7=49
7*7*512
1*1*4096
VGGNet 模型探讨并证明了以下观点:
VGG 模型中除了输入的图像是 224×224 的 RGB 图像,其他参数基本和 AlexNet 一致; VGG 中 BCDE 版本网络的参数初始化均来自于版本 A 网络(即参数预初始化),由于网络 A 较小,因此收敛较快,先训练一个网络 A ,然后将其训练好的参数作为后面网络的初始值(前面四个卷积层和最后的三个全连接层)。其它的参数进行随机初始化,从 (0,0.01) 的高斯分布中进行初始化。
224×224
BCDE
A
GoogLeNet 是 Google 公司设计的网络模型(其中 L 大写表示致敬 LeNet ),该模型在 2014 年取得 ImageNet-ILSVRC 分类挑战赛第一名(第二名是 VGGNet )。GoogLeNet 相关资源:
Google
L
通常提升网络性能主要是增加网络深度和宽度:深度指网络层次数,宽度指神经元数量。但是这会导致:
解决思路是在增加网络深度和宽度的同时,减少参数;为了减少参数,将全连接变成稀疏连接,但大部分硬件都是针对密集矩阵做的优化,所以稀疏矩阵中计算数虽然变少,但是计算量并没有质的提升。GoogLeNet 提出了 Inception 网络结构,用来构造一种神经元,搭建稀疏高计算性能的网络结构。
Inception
Network in Network 中最早提出 1*1 卷积核的概念; 1*1 卷积核可以起到降维(升维)的作用,并减少参数。比如当前层为 x*x*m 即图像大小为 x*x ,特征层数为 m ,然后如果将其通过 1*1 的卷积核,特征层数为 n ,那么只要 n<m 这样就能起到降维的目的。如果使用 1*1 的卷积核,这个操作实现的就是多个 feature map 的线性组合,实现通道个数上的变化。如果卷积后添加非线性记录,能提升网络的表达能力。
Network in Network
x*x*m
x*x
m
n
n<m
Inception Module 查看大图
Inception 结构:将前一层的数据,同时通过 1*1, 3*3, 5*5 的卷积,以及 3*3 的池化,最终再汇总到一起形成该结构的输出;既增加了网络的宽度,又增加了网络尺度的适应性;该结构使用不同尺寸卷积核来提取特征,每个卷积后都会通过 ReLU 增加网络的非线性特征。为了避免 3*3, 5*5 卷积计算量太大,以及最终的特征图厚度太大,分别在卷积前和池化后加上了 1*1 卷积核,有效降低特征图数量。可以理解为 Inception 结构有多个分支,每个分支提取不同的特征图,每个分支输出的特征图尺寸大小是相同的,但是厚度不一样,最终汇总成一个统一的输出;该结构设计了一个稀疏网络结构,但是能够产生稠密的数据,既增加神经网络表现,又保证计算资源的使用效率。
1*1, 3*3, 5*5
3*3, 5*5
GoogLeNet 结构,查看大图
模型特点:
模型细节,查看大图
GoogLeNet 模型细节中:#3x3 reduce, #5x5 reduce 表示在 3x3, 5x5 卷积之前使用的 1*1 卷积;这样起名易于理解 1*1 卷积核的作用。
#3x3 reduce, #5x5 reduce
3x3, 5x5
224x224x3
7x7
112x112x64
3x3
max pooling
(112-3)/2+1=56
56x56x64
56x56x192
(56-3)/2+1=28
28x28x192
Inception a
1x1
RuLU
28x28x64
28x28x96
28x28x128
5x5
28x28x16
28x28x32
64+128+32+32=256
28*28*256
Inception b
28x28x256
128+192+96+64=480
28*28*480
根据模型细节的详细参数,依次类推剩下各层。
Inception V2
Inception V2 版本最大的改变是将大尺寸卷积核分解成小尺寸卷积核,保持非对称结构,并将卷积和池化并行计算。
1*n
n*1
V1
Inception V2 版本的网络结构细节图:
其中的 Figure 5,6,7 分别表示:
Figure 5,6,7
1*3
3*1
Inception V3
Inception V3 版本在 V2 版本上做了比较小的改进,添加了如下功能:
V2
BN
Inception V3 网络结构添加部分:
Inception V4
Inception V4 是在 V3 版本上做了比较小的改进,使得网络结构变得更复杂:
V3
每个 Inception 结构和 Reducing 结构细节如下:
Reducing
Inception V4 的测试结果显示,即使不适用残差结构,也能得到较深的层次和很好的准确率。
Inception-ResNet
微软的残差网络流行后, GoogLeNet 在 Inception 中也引入了残差结构,并提出了 Inception-ResNet-V1, Inception-ResNet-V2 模型,其中 V1, V2 主要区别在于残差结构中卷积层数不一样:
Inception-ResNet-V1, Inception-ResNet-V2
V1, V2
每个 Inception 残差结构和 Reducing 结构细节如下:
GoogLeNet 的几篇论文中详细描述了各个版本的网络模型, Inception 结构的细节,以及各结构对应的分类结果。
ResNet
DRN: Deep Residual Networks 深度残差网络,即 ResNet: Residual Networks ,是微软研究院的 Kaiming He 等四人提出的,通过使用 ResNet Unit 成功训练出了 152 层的神经网络,在 2015 年 ImageNet 竞赛上的 classification, localization, detection 以及 Microsoft COCO 竞赛中 detection, segmentation ,全部获得第一名,而且对应论文 Deep Residual Learning for Image Recognition 也获得了 CVPR2016 的最佳论文。ResNet 相关资源:
DRN: Deep Residual Networks
ResNet: Residual Networks
Kaiming He
ResNet Unit
classification, localization, detection
Microsoft COCO
detection, segmentation
Deep Residual Learning for Image Recognition
CVPR2016
从 AlexNet 到 VGGNet ,可以看出深度学习网络层数越多,学习能力越好;但是对于常规网络 plain network ,直接堆叠深度,从实验效果来看:随着网络层级的不断增加,模型精度不断得到提升,而当网络层级增加到一定的数目以后,训练精度和测试精度迅速下降。这说明当网络变得很深以后,深度网络就变得更加难以训练了!
plain network
从神经网络的反向传播链式法则中可以知道,神经网络在反向传播过程中要不断地传播梯度,来调整参数矩阵;而当网络层数加深时,梯度在传播过程中会逐渐消失,导致无法对前面网络层的权重进行有效的调整;所以普通网络中层数超过一定深度后,反而错误率会出现上升!
ResNet 残差网络提出了一个网络结构,它借鉴了 Training Very Deep Networks 论文中的 Highway Networks 即跨层链接思想,使用了恒等映射 identity mapping 。
Highway Networks
identity mapping
这个残差模块中,通过捷径连接 shortcut connections 的方式,直接把输入 x 传到输出,使得输出结果变为 H(x)=F(x)+x ;当 F(x)=0 时,那么 H(x)=x ,即恒等映射。因此 ResNet 残差网络改变了学习目标,即将残差 F(x)=H(x)-x 结果训练逼近于 0 ,这样即使网络加深,准确率也不会下降。
shortcut connections
x
H(x)=F(x)+x
F(x)=0
H(x)=x
F(x)=H(x)-x
残差网络结构打破了神经网络层数的约束,可以使层数达到成百上千层。
残差网络在 VGG-19 上的对比效果:
VGG-19
左边展示 VGG19 ,中间为基于 VGG19 直接扩充到 34 层,右边为使用残差结构扩充到 34 层。残差结构中实线和虚线的区别:
VGG19
F(x)
3*3*64
3*3*128
H(x)=F(x)+Wx
W
实验结果如下:直接扩充错误率反而会上升,而 ResNet 扩充后错误率下降。
作者在提出 ResNet 50/100/150 深度残差网络时,为了减少计算量,提出了深度残差模型,也就是使用小卷积 1*1 来减少特征图。残差网络 ResNet 不仅解决了反向传播中退化问题,而且减少了参数的计算量。
ResNet 50/100/150
ResNet-V2
对于残差结构, BN 归一化和 ReLU 激活层的位置,对准确率有较大影响,测试结果如下:
weight 表示卷积层;其中图 a 是 ResNet-V1 使用的残差结构,策略是先卷积后激活;而图 e 则被称为 ResNet-V2 ,策略是先激活后卷积。其中 BN 对数据起到了正则化的效果,所以训练后测试结果更理想。
weight
a
ResNet-V1
e
MobileNet
MobileNet 是 Google 在 2017 年为移动设备设计的通用计算机视觉神经网络,支持图像分类、目标检测、分隔等。MobileNet 相关资源:
MobileNet 的核心是深度可分离卷积 Depthwise Separable Convolution ,该模型将标准卷积分解为深度卷积 dw:Depthwise 以及一个 1*1 的卷积 pw:Pointwise。
Depthwise Separable Convolution
dw:Depthwise
pw:Pointwise
上图展示的是卷积核卷积的过程:输入 F 的尺寸为 (Df, Df, M) ,卷积后输出 G 的尺寸为 Dg, Dg, N :
F
(Df, Df, M)
G
Dg, Dg, N
K
Dk, Dk, M
N
Dk * Dk * M * N * Df * Df
dw
pw
Dk * Dk * M * Df * Df + M * N * Df * Df
Dk, Dk, 1
M
Dg, Dg, M
1, 1, M
深度可分离卷积,在不改变卷积结果的情况下,大大降低了计算量,缩减量为 1/N + 1/(Dk*Dk) 。同时,每次分解都会增加 BN 和 ReLU 激活:
1/N + 1/(Dk*Dk)
MobileNetV1
MobileNetV1 网络结构模型如下, dw 表示深度可分离卷积:
最后的 FC 层没有非线性激活函数,其他层都有 BN, ReLU 非线性函数。网络结构除了使用深度可分离卷积外,还有一个特点是:直接使用步长为 2 的 s2 卷积运算来代替池化。
FC
BN, ReLU
s2
Width Multiplier
宽度乘法器用于控制模型的输入和输出通道数,使得模型变得更薄;假设宽度因子 Width multiplier 为 α ,即输入通道数从 M 变为 αM ,输出通道数从 N 变为 αN ;深度可分离卷积计算量降低为 Dk * Dk * αM * Df * Df + αM * αN * Df * Df ,宽度因子使得计算量和参数降低约 α*α 倍,可以很方便的控制模型大小。 宽度因子取值范围为 α∈(0,1] ,通常设置为 1, 0.75, 0.5, 0.25 。
Width multiplier
α
αM
αN
Dk * Dk * αM * Df * Df + αM * αN * Df * Df
α*α
α∈(0,1]
1, 0.75, 0.5, 0.25
Resolution Multiplier
分辨率乘法器用于控制输入的分辨率,假设分辨率因子 Resolution Multiplier 为 ρ ,即输入图片尺寸从 Df 变为 ρDf ;深度可分离卷积计算量为 Dk * Dk * αM * ρDf * ρDf + αM * αN * ρDf * ρDf ,分辨率因子使得计算量和参数降低约为 ρ*ρ 倍;分比率因子取值范围为 ρ∈(0,1] ,通常设置输入分辨率为 224,192,160,128 。
ρ
Df
ρDf
Dk * Dk * αM * ρDf * ρDf + αM * αN * ρDf * ρDf
ρ*ρ
ρ∈(0,1]
224,192,160,128
Width Multiplier, Resolution Multiplier 对参数及计算量的影响:
Width Multiplier, Resolution Multiplier
Linear Bottlenecks
在深度神经网络中,当前层的维度为 hi*wi*di ,其中 d 表示通道数,也称为宽度;当通道数过低时, ReLu 激活函数会有很大的信息损耗;如下图所示,低维度情况下,张量的的恢复较差,几乎变形;高维度时则恢复较好:
hi*wi*di
d
ReLu
所谓 Bottleneck ,指的是输入和输出的维度差异较大,就像一个瓶颈一样。
Bottleneck
Inverted residual block
深度残差网络 ResNet 结构可以很好的增大网络深度,基于残差模块引入了 Inverted residual block 即倒置残差模块,示意图如下:
实现思路是:先通过 1*1 卷积核增加通道数,再进行深度可分离卷积,最后通过 1*1 卷积核减少通道数。
MobileNetV2
基于 Linear Bottlenecks 和 Inverted residual block 提出了 MobileNet V2 版本,其模块结构如下:
MobileNet V2
输入经过 V2 结构后对应的输出为:
MobileNetV2 完整结构如下:
其中 t 代表单元的扩张系数, c 代表 channel 数, n 为单元重复个数, s 为 stride 步长数。
t
c
channel
两者网络结构基本一样,区别在于:
BN: Batch Normalization
BN: Batch Normalization 也就是“批量归一化”,在深度神经网络训练过程中, BN 可以对神经网络每一层的输入做归一化处理。论文地址:
Internal Covariate Shift
在深层网络训练的过程中,由于网络中参数变化而引起内部结点数据分布发生变化的这一过程被称作 ICS:Internal Covariate Shift ,也就是隐藏层的输入分布总是变化。
ICS:Internal Covariate Shift
Internal Covariate Shift 带来的问题:
可以通过固定输入值的分布为了解决这些问题,而常见的方法就是白化 Whitening 。白化是机器学习里面常用的一种规范化数据分布的方法,主要是 PCA 白化与 ZCA 白化。白化是对输入数据分布进行变换,进而达到以下两个目的:
Whitening
PCA
ZCA
通过白化操作,我们可以减缓 ICS 的问题,进而固定了每一层网络输入分布,加速网络训练过程的收敛。但是对每一层进行白化过程,计算成本太高;并且由于白化改变了网络每一层的分布,从而改变了网络层中本身数据的表达能力。
ICS
BN 的基本思想是:在将输入送给神经元之前,先归一化将输入的分布规范化成在固定区间范围的标准分布(均值为 0 ,方差为 1 ),然后再对其做平移和伸缩变换;计算公式如下:
BN 引入了两个可学习的参数:缩放系数 γ 和平移系数 β ,这两个参数的引入是为了恢复数据本身的表达能力,对规范化后的数据进行线性变换。另外,由于 γ 和 β 是可训练的,那么意味着神经网络会随着训练过程自己挑选一个最适合的分布。
γ
β
DNN 的归一化就是白化操作,在神经网络训练过程中对整体训练数据做归一化带来的计算量太大,这也是白化遇到的问题;而 BN 简化了白化操作:
DNN
normalize each scalar feature independently
mini-batch
sigmoid, tanh
通常在非线性映射前增加 BN ,也就是数据在送入激活函数前先通过 BN 将输入归一化。 Google 发表 BN 论文是在 VGGNet 上做的实验。
CVPR
DenseNet
Taskonomy: Disentangling Task Transfer Learning
SSD, YOLO
ShuffleNetV2
</div> </div></div><br>
The text was updated successfully, but these errors were encountered:
No branches or pull requests
Earth Guardian
https://ift.tt/MAKR87j
redspider110
卷积神经网络
CNN: Convolutional Neural Networks
卷积神经网络也是由输入层、输出层和多个隐藏层组成,但是隐藏层可分为卷积层Convolution
,池化层Pooling
、全连接层FCN:fully connected neural network
。在图像分类任务中,卷积和池化后的结果是每个输入图像的特征空间,然后将它喂给全连接层实现分类,即从输入图像到标签集的映射。目前主流的卷积神经网络,比如
VGG, ResNet
等都是由简单的CNN
调整组合而来。下图为常见的卷积和池化的示例:上图示例输入为
277*277
的RGB
图像,采用 96 个11*11*3
的卷积核kernels
同时扫描,得到输出的特征图是 96 个267*267
的二维feature map
;267*267
是单个特征图的宽高, 96 是卷积核的个数,原本 3 通道元素在卷积的时候会被作为一个元素加起来。这些feature map
可视化之后,可以看到:基本概念
Feature map
输入图像和卷积核做卷积后的输出图即为特征图!它表示该卷积核从输入图中提取的一个特征。
Receptive field
特征图上每个像素点在输入图片上映射的区域,即该像素点为输入图中哪块像素和卷积核做卷积计算的。输入图中这块像素区域大小即为感受野,也就是感受野的大小和卷积核的大小相同。
Convolutional Layer
卷积层卷积是一种有效提取图片特征的方法:使用一个正方形的卷积核,遍历图片上的每个像素点;图片与卷积核重合区域内相对应的每一个像素值乘以卷积核内对应点的权重,然后求和得到输出图片中的一个像素值。输入图像感受野区域和卷积核中对应位置相乘后求和,卷积核中的值表示权重;输出值为卷积核矩阵和感受野区域矩阵进行点积。
根据线性代数理论,点积表示向量在某个特征(向量)上的投影再乘以这个特征(向量),直接意义表示向量在某个特征(向量)上的强度;也就是说,做一次点积相当于提取了一次特征。卷积层的意义:卷积核在输入图像上从左到右,从上到下滑动,提取整幅图像在卷积核上的特征。计算过程如下图所示:
图中显示了两个卷积示例,绿色部分和红色部分;绿色部分见图中计算结果,红色部分计算如下:
(-1)*2+(-1)*9+(-1)*2+1*4+1*4=-5
。假设输入图像大小为
n*n
,卷积核大小为f*f
,滑动步长为s
,输入图像padding
位数为p
,则输出图像大小为(n+2p-f)/s + 1
。输入图像和卷积核做卷积后,输出特征图大小和个数就是由这些参数决定:padding
填充在输入图像外圈填充一圈像素,也就是扩大输入图像的大小;通常
padding
的目的是为了使得输出特征图和输入图像大小保持一致,深度学习中通常使用全零来填充外圈像素。stride
步长表示卷积核横向和纵向上每次移动的步长。
channels
通道数通道数(有时也叫深度),卷积过程中输入和卷积核的通道数必须相同,表示输入和输出的个数。
输入图像如果为灰度图,则通道数为 1 ;如果为彩色图,则通道数为 3 ,分别表示输入图像红绿蓝三色;卷积核的输入通道数与输入相同,它的输出通道数表示卷积后特征图的个数。
卷积过程是一个提取对应特征图的过程,而特征提取由卷积核性质来决定;不同卷积核(即滤波器)对应的主观效果:
卷积核通常为正方形,大小为奇数,通常为
1*1, 3*3, 5*5, 7*7
。pooling
池化层池化
pooling
是一种降采样操作subsampling
,主要目标是降低特征图的特征空间,或者可以认为是降低特征图的分辨率。因为特征图参数太多,而图像细节不利于高层特征的抽取。池化分为最大池化和平均池化两类:采样时取池化核大小中的最大值;其中池化核的大小为
2*2
,步长也为2*2
:采样时取池化核大小中的平均值;其中池化核的大小为
2*2
,步长也为2*2
:假设输入大小为
n*n
,池化核大小为f*f
,滑动步长为s
,则输出大小为(n-f)/s + 1
;和卷积核计算公式一样,只不过池化时不涉及padding
,池化也不会改变输入和输出的通道数。全连接层
全连接
Fully Connected Network
层,就是普通的神经网络层;特点是每个神经元与前后相邻层的每一个神经元都有连接关系,即全连接。一张分辨率仅仅是
28*28
的黑白图像,就有接近 40 万个待优化参数;而现实中都为高分辨率的彩色图像,像素点非常多,且为红黄蓝三通道信息;而待优化参数过多,容易导致模型的过拟合。在图像分类中,先把输入图像通过卷积和池化后提取特征,降低参数数量,在接入全连接层输出预测的结果;全连接层就是把卷积层和池化层的输出展开成一维的输出结果。CNN
与传统的神经网络相比,主要有三大特色:局部感知、权重共享和多卷积核。局部感知也就是感受野,卷积核和输入图像卷积时,每次卷积核所覆盖的像素只是图像的一小部分,是局部特征,即局部感知,局部感受野。人类对外界的认知一般是从局部到全局,先对局部有感知的认识,再逐步对全体有认知,这是人类的认识模式。在图像中的空间联系也是类似,局部范围内的像素之间联系较为紧密,而距离较远的像素则相关性较弱。因而每个神经元其实没有必要对全局图像进行感知,只需要对局部进行感知,然后在更高层将局部的信息综合起来就得到了全局的信息。这种模式就是卷积神经网络中的局部感受野,它能大大降低参数。
传统的神经网络的参数量是非常巨大的,比如
1000X1000
像素的图片,映射到和自己相同的大小,需要1000X1000
的平方,也就是 10 的 12 次方,参数量太大了,而CNN
除全连接层外,卷积层的参数完全取决于卷积核(滤波器)的大小,比如10x10
的滤波器,只有 100 个参数,当然滤波器的个数不止一个,也就是下面要说的多卷积核。但与传统的神经网络相比,参数量小,计算量小,整个图片共享同一组滤波器的参数,即卷积核参数表示的权重。一种卷积核代表提取输入图片的一种特征,为获得更多不同的特征集合,卷积层会有多个卷积核,生成不同的特征图。
小结
大型深层的卷积神经网络
CNNs
(请注意这里是复数)通常由多个基础CNN
组成,而基础CNN
结构前后连接、层内调整组成,根据功能不同,我们称这些前后连接的结构处于不同阶段Stage
。不同Stage
里CNN
会有不同的单元和结构,比如卷积核kernel
大小、个数,padding, stride
等可能不同,激活函数activition function
可能不同,pooling
操作可能不存在等等。LeNet5
LeNet
诞生于 1994 年,由Yann LeCun
提出并实现,是最早的卷积神经网络之一。LeNet-5
模型相关资源:网络模型
LeNet-5
神经网络结构为:LeNet-5
主要分为输入层,卷积层特征提取,全连接层分类识别。特点
32*32*1
大小的灰度图,即单通道输入。卷积层,卷积核大小为
5*5*1
,核个数为 6 ,步长为 1 ;则输出为(32-5)/1+1=28
,即输出为28*28*6
,相当于提取了 6 个28*28
的特征图Feature Map
。同一个卷积核对应的神经元使用相同的w
权重和b
偏置;一个卷积核有5*5=25
个w
和 1 个b
,一共 6 个卷积核,因此卷积后每个神经元的参数个数为(5*5*1+1)*6=156
,即卷积层总参数为 156 个。第一层使用的是全连接,一共28*28
个神经元,因此连接数为28*28*156=122304
个连接数。池化层,池化核大小为
2*2
,步长为 1 ;池化后输出为14*14*6
,特征图大小减半;这一层的计算方法是:将池化核中每个元素相加,再乘以权重w
,最后加上偏置b
,然后通过sigmoid
激活函数。每个池化核中 4 个元素使用相同的w
和b
,一共 6 个池化核,因此参数个数为(1+1)*6=12
个;池化也是全连接,一共14*14
个神经元,因此连接数为(2*2+1)*6*14*14=5880
个。LeNet-5
中卷积和池化示意图:卷积层,卷积核大小为
5*5
,核个数为 16 ,步长为 1 ;则输出大小为(14-5)/1+1=10
,即输出为10*10*16
;这一层并没有使用全连接,参考LeNet-5
论文,该层连接如下图所示;比如第一列表示第三层的第 0 个特征图只和第二层的第 0,1,2 这三个特征图连接;有 3 个连接的特征图个数为 6 个、有 4 个连接的特征图个数为 9 个、有 6 个连接的特征图个数为 1 个;所以参数数目为(5*5*3+1)*6 + (5*5*4+1)*9 + (5*5*6+1)*1=1516
个;一共有10*10
个神经元,因此总连接数为10*10*1516=151600
个。池化层,池化核大小为
2*2
,步长为 1 ;池化层输入为上一层的10*10*16
,池化核效果是大小减半,所以池化层输出为5*5*16
。参数计算方法和第二层池化层一样,池化核的每个元素共用权重和偏置,因此参数个数为(1+1)*16=32
;池化是全连接,一共5*5
个神经元,因此连接数为(2*2+1)*16*5*5=2000
。卷积层,卷积核大小为
5*5
,卷积核有 120 个,步长为 1 ;输出大小为(5-5)/1+1=1
,即输出为1*1*120
;因为输入大小和卷积核大小一样,所以卷积后称为单个像素的特征图,卷积过程刚好使得卷积层和全连接层表现一样;如果输入分辨率加大,则改层就不是全连接层了。参数个数为(5*5*16+1)*120=48120
,输出刚好只有1*1
个神经元,全连接数为1*1*48120=48120
。全连接层,输出为 84 个单元,每个单元表示一个像素,对应于一个
7*12
的比特图。如果 -1 表示白色, 1 表示黑色,这个 84 个单元刚好组成7*12
的黑白图,对应下图中的一个编码。参数个数为(120+1)*84=10164
,全连接数也是 10164 ;全连接层点积结果加上偏置后,通过sigmoid
激活函数。输出层,输出为 10 个节点,分别表示数字 0-9 。该层采用径向基函数
RBF
的连接方式计算输出结果。参数个数为84*10=840
,连接个数也为 840 。AlexNet
AlexNet
是Alex Krizhevsky, Ilya Sutskever
在多伦多大学Geoff Hinton
的实验室设计出的一个深层卷积神经网络;该模型是 2012 年年提出并夺得了当年ImageNet LSVRC
的冠军,且准确率远超第二名(top5
错误率为 15.3% ,第二名为 26.2% )。AlexNet
可以说是具有历史意义的一个网络结构,在此之前深度学习已经沉寂了很长时间,从它诞生之后,ImageNet
以后举行的比赛,冠军都是用卷积神经网络CNN
来做的,并且层次越来越深,使得CNN
成为在图像识别分类的核心算法模型,带来了深度学习的大爆发。而仔细分析
AlexNet
,可以看出它实际上是参考了LeNet-5
,只是LeNet
当年受到了计算机硬件性能的限制。AlexNet
模型的相关资源:模型结构及特点
AlexNet
一共有 5 个卷积层和 3 个全连接层,该模型的特点:ReLU
作为激励函数传统的神经网络普遍使用
Sigmoid, tanh
等非线性函数作为激励函数,然而它们容易出现梯度弥散或梯度饱和的情况。以Sigmoid
函数为例,当输入的值非常大或者非常小的时候,这些神经元的梯度接近于 0 ;如果输入的初始值很大的话,梯度在反向传播时因为需要乘上一个Sigmoid
导数,会造成梯度越来越小,导致网络变的很难学习。在AlexNet
中使用了ReLU: Rectified Linear Units
激励函数;由于它是线性的,且导数始终为 1 ,计算量大大减少,收敛速度会比Sigmoid, tanh
快很多。Dropout
为了防止神经网络过拟合,引入了
Dropout
的概念;对于某一层神经元,随机的将概率置为 0 ,即这个神经元不参加前向和后向传播(如同被删除一样);Dropout
可以看作是模型组合,每次生成的网络结构都不一样,通过组合多个模型来减少过拟合。Dropout
是AlexNet
中的一项非常大的创新,以至于神经网络之父Hinton
在很多演讲中都拿出来讲解。神经网络为了避免过拟合,加大加深网络结构,需要海量数据来进行训练,能有效提高算法的准确率。但实际上数据往往是有限的,可以通过一些变换将现有数据生成新的数据来扩充数据集。图像数据中可以通过:水平翻转,随机裁剪、平移变换,颜色、光照变换等来快速扩充。
Overlapping Pooling
池化核移动步长小于核大小,也就是移动时会出现重叠元素;重叠池化能避免过拟合问题。
LRN: Local Response Normalization
模仿真实神经元的侧抑制机制,实现局部抑制,尤其当使用
ReLU
作为激励函数时非常有效;LRN
能提高网络的泛化能力,使top 1/5
错误率下降了1.4/1.2%
。GPU
训练神经网络规模太大,单个
GPU
无法满足计算需求,该网络模型使用 2 个GPU
分别训练一半的模型;多用一个GPU
对训练时间影响并不明显,但使top 1/5
错误率下降了1.7/1.2%
。其中
ReLU
激励函数和正则化使用Dropout
成为后续CNN
的标配。模型解析
所有激活函数都使用
ReLU
;所有的池化层都为3*3
步长为 2 的最大池化。总体为:卷积 -> 激励 -> 池化 ->
LRN
;其中输入大小为227x227x3
的红黄蓝三基色图;卷积核大小为11*11
,通道数为 96 个,步长为 4 ,则第一层的输出大小根据计算公式(n+2p-f)/s + 1
为(227+0-11)/4+1=55
,即输出层为55*55*96
;输出通过ReLU
激活函数;通过池化层后,输出为(55-3)/2+1=27
,即池化层输出为27*27*96
;通过LRN
进行归一化处理,归一化后分为两组27*27*48
分别送给两个GPU
训练。总体为:卷积 -> 激励 -> 池化 ->
LRN
;其中输入为第一层归一化后的输出27*27*96
(分为两组分别给两个GPU
训练);为了方便计算输入做了 2 个像素的 0 填充,卷积核大小为5*5
,通道数为 256 ,移动步长为 1 ,则卷积后的输出大小为(27+2*2-5)/1+1=27
,即卷积后的输出为 2 组27*27*128
;通过ReLU
激活函数;池化后为 2 组13*13*128
;再将这两组数据归一化后,分别送给两个GPU
训练。总体为:卷积 -> 激励 ;这一层没有池化和
LRN
;输入为第二层的输出: 2 组13*13*128
;先做 1 像素的 0 填充,卷积核大小为3*3
,通道数为 192 ,步长为 1 ,卷积后的大小为(13+2-3)/1+1=13
,即卷积后的输出为 2 组13*13*192
;输出经过ReLU
激活函数后,直接进入下一层。注意该层模型中两个GPU
之间存在虚线,即每个GPU
都需要计算第二层的所有数据。总体为:卷积 -> 激励 ;这一层也没有池化和
LRN
;输入为第三层输出的 2 组13*13*196
;第四层和第三层唯一的区别是,第四层两个GPU
间没有虚线连接,即第四层每个GPU
只需计算第三层一半的输出。总体为:卷积 -> 激励 -> 池化 ;这一层没有
LRN
;输入为第四层输出的 2 组13*13*196
;先做 1 像素的 0 填充,卷积核大小为3*3
,通道数为 256 ,步长为 1 ,卷积后的大小为(13+2-3)/1+1=13
,即卷积后的输出为 2 组13*13*128
;输出经过ReLU
激活函数;再经过池化层,输出为 2 组6*6*128
。总体为:卷积(全连接) -> 激励 ->
Dropout
;这一层属于全连接层,但是使用卷积来实现的;输入为第五层输出的 2 组6*6*128
,卷积核的尺寸刚好和输入一样大,卷积核中每个系数都和输入对应像素相乘,一一对应,因此该层也为全连接层,卷积核通道数为 4096 ,则卷积后的输出为 2 组1*1*2048
,即有 4096 个神经元;通过ReLU
激活函数后;再通过随机的Dropout
,概率选择为 50% ,即丢掉一半的网络特征。总体为:全连接 -> 激励 ->
Dropout
。第八段为全连接层,输出为 1000 个分类结果的评分。
如下为
AlexNet
模型的简图:VGG
VGGNet
是Visual Geometry Group
牛津大学计算机视觉组和Google DeepMind
公司的研究员一起研发的深度卷积神经网络,该模型是 2014 年提出并取得了ImageNet-ILSVRC
竞赛的第二名(第一名是GoogLeNet
)和定位项目的第一名。VGGNet
首次将网络深度提升到了 19 层,并且使用较小的卷积核,证明了增加网络的深度能够在一定程度上影响网络最终的性能,使错误率大幅下降;该网络拓展性很强,迁移到其它图片数据上的泛化性也非常好,VGG
常被用来提取图像特征。VGG
模型相关资源:模型结构
VGGNet
可以看成是加深版本的AlexNet
,都是由卷积层、全连接层两大部分构成:VGG16, VGG19
是常用模型,它们通常是从图像中提取CNN
特征的首选算法;主要缺点在于参数量非常大,有 140M 左右需要更大的存储空间。模型特点
VGGNet
的特点可以通过下图体现:VGGNet
结构简洁清晰,由 5 段卷积层(每段可能会有 3 到 5 个卷积层),3 个全连接层,Softmax
输出层构成,所有隐藏层的激活函数都采用ReLU
函数,池化层采用最大池化max-pooling
。固定为
224*224
大小,红黄蓝三基色图像。在训练期间,唯一的预处理是输入图像中每个像素中减去在训练集上计算的RGB
均值,这个预处理可以加快学习。卷积核固定为
3*3
大小,所有的卷积操作都遵循SAME
原则;3*3
会比大卷积核需要更少的参数;两个3*3
卷积核串联(所需参数个数2*3*3=18
)获取的感受野大小相当于一个5*5
卷积核(所需参数个数1*5*5=25
);而三个3*3
卷积核串联(所需参数个数3*3*3=27
)获取的感受野相当于一个7*7
的卷积核(所需参数个数1*7*7=49
)。使用
3*3
卷积核有三个优点:多个卷积核能获取更大的感受野;增加非线性映射;需要更少的参数。第一段卷积层统一使用 64 个通道,之后逐段翻倍,直到第五段卷积层统一使用 512 个通道。通道数越大,提取的特征信息越多。
隐藏层配置的激活函数都是非线性
ReLU
函数。池化核固定为
2*2
大小,全部采用相同的最大池化方式,步长为 2 。池化主要目标是缩小宽和高,控制了计算量的规模。三个全连接层的配置是相同的,前两个都有 4096 个通道,第三个需要执行 1000 维的分类,因此只包含 1000 个通道(每个通道对应一个类别)。
VGGNet
模型中,在测试阶段,会将全连接层全部转换为卷积层;第一层7*7*512
和 4096 个神经元做全连接,测试时转换为和1*1*4096
的卷积核做卷积。测试阶段将全连接转换成卷积后,则可以对任意分辨率的图做卷积,而不需要缩放到
224*224
的输入大小。Softmax
层全连接最后一层通过
Softmax
转换为预测结果的概率。小结
VGGNet
模型探讨并证明了以下观点:VGG
模型中除了输入的图像是224×224
的RGB
图像,其他参数基本和AlexNet
一致;VGG
中BCDE
版本网络的参数初始化均来自于版本A
网络(即参数预初始化),由于网络A
较小,因此收敛较快,先训练一个网络A
,然后将其训练好的参数作为后面网络的初始值(前面四个卷积层和最后的三个全连接层)。其它的参数进行随机初始化,从 (0,0.01) 的高斯分布中进行初始化。GoogLeNet
GoogLeNet
是Google
公司设计的网络模型(其中L
大写表示致敬LeNet
),该模型在 2014 年取得ImageNet-ILSVRC
分类挑战赛第一名(第二名是VGGNet
)。GoogLeNet
相关资源:解决的问题
通常提升网络性能主要是增加网络深度和宽度:深度指网络层次数,宽度指神经元数量。但是这会导致:
解决思路是在增加网络深度和宽度的同时,减少参数;为了减少参数,将全连接变成稀疏连接,但大部分硬件都是针对密集矩阵做的优化,所以稀疏矩阵中计算数虽然变少,但是计算量并没有质的提升。
GoogLeNet
提出了Inception
网络结构,用来构造一种神经元,搭建稀疏高计算性能的网络结构。1*1
卷积核Network in Network
中最早提出1*1
卷积核的概念;1*1
卷积核可以起到降维(升维)的作用,并减少参数。比如当前层为x*x*m
即图像大小为x*x
,特征层数为m
,然后如果将其通过1*1
的卷积核,特征层数为n
,那么只要n<m
这样就能起到降维的目的。如果使用1*1
的卷积核,这个操作实现的就是多个feature map
的线性组合,实现通道个数上的变化。如果卷积后添加非线性记录,能提升网络的表达能力。Inception
网络结构Inception Module 查看大图
Inception
结构:将前一层的数据,同时通过1*1, 3*3, 5*5
的卷积,以及3*3
的池化,最终再汇总到一起形成该结构的输出;既增加了网络的宽度,又增加了网络尺度的适应性;该结构使用不同尺寸卷积核来提取特征,每个卷积后都会通过ReLU
增加网络的非线性特征。为了避免3*3, 5*5
卷积计算量太大,以及最终的特征图厚度太大,分别在卷积前和池化后加上了1*1
卷积核,有效降低特征图数量。可以理解为
Inception
结构有多个分支,每个分支提取不同的特征图,每个分支输出的特征图尺寸大小是相同的,但是厚度不一样,最终汇总成一个统一的输出;该结构设计了一个稀疏网络结构,但是能够产生稠密的数据,既增加神经网络表现,又保证计算资源的使用效率。GoogLeNet
模型GoogLeNet 结构,查看大图
模型特点:
Inception
结构,方便添加和修改模型解析
模型细节,查看大图
GoogLeNet
模型细节中:#3x3 reduce, #5x5 reduce
表示在3x3, 5x5
卷积之前使用的1*1
卷积;这样起名易于理解1*1
卷积核的作用。输入图像为
224x224x3
,且都进行了零均值化的预处理操作(图像每个像素减去均值)。卷积层,使用
7x7
的卷积核,滑动步长 2 ,padding
为 3 , 64 通道,输出为112x112x64
,卷积后通过ReLU
激活;再经过3x3
的max pooling
,步长为 2 ,输出大小为(112-3)/2+1=56
,即56x56x64
,再通过ReLU
激活。卷积层,使用
3x3
的卷积核,滑动步长 1 ,padding
为 1 , 192 通道,输出为56x56x192
,卷积后通过ReLU
激活;再经过3x3
的max pooling
,步长为 2 ,输出大小为(56-3)/2+1=28
,即28x28x192
,再通过ReLU
激活。Inception a
有四个分支,采用不同尺寸的卷积核提取特征图:
1x1
的卷积后通过RuLU
,输出为28x28x64
1x1
的卷积后,作为3x3
卷积核之前的降维,变成28x28x96
,然后通过ReLU
;再进行 128 个3x3
的卷积,padding
为 1 ,输出28x28x128
1x1
的卷积后,作为5x5
卷积核之前的降维,变成28x28x16
,然后通过ReLU
;再进行 32 个5x5
的卷积,padding
为 2 ,输出28x28x32
3x3
的池化核padding
为 1 ,进行最大池化,输出28x28x192
,然后进行 32 个1x1
的卷积,输出28x28x32
最终将所有分支的结果进行连接,即将特征图厚度叠加:
64+128+32+32=256
,这一层最终输出为28*28*256
。Inception b
有四个分支,采用不同尺寸的卷积核提取特征图:
1x1
的卷积后通过RuLU
,输出为28x28x128
1x1
的卷积后,作为3x3
卷积核之前的降维,变成28x28x128
,然后通过ReLU
;再进行 192 个3x3
的卷积,padding
为 1 ,输出28x28x192
1x1
的卷积后,作为5x5
卷积核之前的降维,变成28x28x32
,然后通过ReLU
;再进行 96 个5x5
的卷积,padding
为 2 ,输出28x28x96
3x3
的池化核padding
为 1 ,进行最大池化,输出28x28x256
,然后进行 64 个1x1
的卷积,输出28x28x64
最终将所有分支的结果进行连接,即将特征图厚度叠加:
128+192+96+64=480
,这一层最终输出为28*28*480
。根据模型细节的详细参数,依次类推剩下各层。
Inception V2
Inception V2
版本最大的改变是将大尺寸卷积核分解成小尺寸卷积核,保持非对称结构,并将卷积和池化并行计算。使用 2 个
3*3
卷积核替代5*5
卷积核;n*n
卷积都可以使用1*n
和n*1
非对称替换。减小特征图大小通常使用池化和卷积叠加,但是谁先谁后会产生不同的影响:先池化再
Inception
卷积,会导致特征缺失;先Inception
卷积再池化,计算量会很大。为了保持特征并减低计算量,修改了V1
的网络结构,将卷积和池化并行进行:Inception V2
版本的网络结构细节图:其中的
Figure 5,6,7
分别表示:5*5
卷积核使用 2 个3*3
的卷积n*n
卷积核都是用1*n
和n*1
叠加3*3
卷积核使用1*3
和3*1
并行计算Inception V3
Inception V3
版本在V2
版本上做了比较小的改进,添加了如下功能:7*7
的卷积核分解BN
处理Inception V3
网络结构添加部分:Inception V4
Inception V4
是在V3
版本上做了比较小的改进,使得网络结构变得更复杂:每个
Inception
结构和Reducing
结构细节如下:Inception V4
的测试结果显示,即使不适用残差结构,也能得到较深的层次和很好的准确率。Inception-ResNet
微软的残差网络流行后,
GoogLeNet
在Inception
中也引入了残差结构,并提出了Inception-ResNet-V1, Inception-ResNet-V2
模型,其中V1, V2
主要区别在于残差结构中卷积层数不一样:每个
Inception
残差结构和Reducing
结构细节如下:小结
GoogLeNet
的几篇论文中详细描述了各个版本的网络模型,Inception
结构的细节,以及各结构对应的分类结果。ResNet
DRN: Deep Residual Networks
深度残差网络,即ResNet: Residual Networks
,是微软研究院的Kaiming He
等四人提出的,通过使用ResNet Unit
成功训练出了 152 层的神经网络,在 2015 年ImageNet
竞赛上的classification, localization, detection
以及Microsoft COCO
竞赛中detection, segmentation
,全部获得第一名,而且对应论文Deep Residual Learning for Image Recognition
也获得了CVPR2016
的最佳论文。ResNet
相关资源:解决的问题
从
AlexNet
到VGGNet
,可以看出深度学习网络层数越多,学习能力越好;但是对于常规网络plain network
,直接堆叠深度,从实验效果来看:随着网络层级的不断增加,模型精度不断得到提升,而当网络层级增加到一定的数目以后,训练精度和测试精度迅速下降。这说明当网络变得很深以后,深度网络就变得更加难以训练了!从神经网络的反向传播链式法则中可以知道,神经网络在反向传播过程中要不断地传播梯度,来调整参数矩阵;而当网络层数加深时,梯度在传播过程中会逐渐消失,导致无法对前面网络层的权重进行有效的调整;所以普通网络中层数超过一定深度后,反而错误率会出现上升!
ResNet
残差网络提出了一个网络结构,它借鉴了 Training Very Deep Networks 论文中的Highway Networks
即跨层链接思想,使用了恒等映射identity mapping
。这个残差模块中,通过捷径连接
shortcut connections
的方式,直接把输入x
传到输出,使得输出结果变为H(x)=F(x)+x
;当F(x)=0
时,那么H(x)=x
,即恒等映射。因此ResNet
残差网络改变了学习目标,即将残差F(x)=H(x)-x
结果训练逼近于 0 ,这样即使网络加深,准确率也不会下降。残差网络
残差网络在
VGG-19
上的对比效果:左边展示
VGG19
,中间为基于VGG19
直接扩充到 34 层,右边为使用残差结构扩充到 34 层。残差结构中实线和虚线的区别:x
和输出F(x)
都是3*3*64
,所以输出结果可以直接相加H(x)=F(x)+x
x
为3*3*64
,而输出F(x)
为3*3*128
,需要调整计算公式H(x)=F(x)+Wx
,其中W
是卷积操作,用来调整x
的维度实验结果如下:直接扩充错误率反而会上升,而
ResNet
扩充后错误率下降。深度残差
作者在提出
ResNet 50/100/150
深度残差网络时,为了减少计算量,提出了深度残差模型,也就是使用小卷积1*1
来减少特征图。残差网络
ResNet
不仅解决了反向传播中退化问题,而且减少了参数的计算量。ResNet-V2
对于残差结构,
BN
归一化和ReLU
激活层的位置,对准确率有较大影响,测试结果如下:weight
表示卷积层;其中图a
是ResNet-V1
使用的残差结构,策略是先卷积后激活;而图e
则被称为ResNet-V2
,策略是先激活后卷积。其中BN
对数据起到了正则化的效果,所以训练后测试结果更理想。MobileNet
MobileNet
是Google
在 2017 年为移动设备设计的通用计算机视觉神经网络,支持图像分类、目标检测、分隔等。MobileNet
相关资源:深度可分离卷积
MobileNet
的核心是深度可分离卷积Depthwise Separable Convolution
,该模型将标准卷积分解为深度卷积dw:Depthwise
以及一个1*1
的卷积pw:Pointwise
。上图展示的是卷积核卷积的过程:输入
F
的尺寸为(Df, Df, M)
,卷积后输出G
的尺寸为Dg, Dg, N
:标准卷积核
K
尺寸为Dk, Dk, M
,通道数为N
;计算量为Dk * Dk * M * N * Df * Df
。将标准卷积核拆分为深度卷积
dw
和1*1
逐点卷积pw
;计算量为Dk * Dk * M * Df * Df + M * N * Df * Df
。dw
,负责滤波作用,尺寸Dk, Dk, 1
,通道数为M
;卷积后该层输出为Dg, Dg, M
1*1
卷积核pw
,用于转换通道数,尺寸为1, 1, M
,通道数为N
;卷积后输出为Dg, Dg, N
深度可分离卷积,在不改变卷积结果的情况下,大大降低了计算量,缩减量为
1/N + 1/(Dk*Dk)
。同时,每次分解都会增加
BN
和ReLU
激活:MobileNetV1
网络结构MobileNetV1
网络结构模型如下,dw
表示深度可分离卷积:最后的
FC
层没有非线性激活函数,其他层都有BN, ReLU
非线性函数。网络结构除了使用深度可分离卷积外,还有一个特点是:直接使用步长为 2 的
s2
卷积运算来代替池化。宽度乘法器
Width Multiplier
宽度乘法器用于控制模型的输入和输出通道数,使得模型变得更薄;假设宽度因子
Width multiplier
为α
,即输入通道数从M
变为αM
,输出通道数从N
变为αN
;深度可分离卷积计算量降低为
Dk * Dk * αM * Df * Df + αM * αN * Df * Df
,宽度因子使得计算量和参数降低约α*α
倍,可以很方便的控制模型大小。 宽度因子取值范围为α∈(0,1]
,通常设置为1, 0.75, 0.5, 0.25
。分辨率乘法器
Resolution Multiplier
分辨率乘法器用于控制输入的分辨率,假设分辨率因子
Resolution Multiplier
为ρ
,即输入图片尺寸从Df
变为ρDf
;深度可分离卷积计算量为
Dk * Dk * αM * ρDf * ρDf + αM * αN * ρDf * ρDf
,分辨率因子使得计算量和参数降低约为ρ*ρ
倍;分比率因子取值范围为ρ∈(0,1]
,通常设置输入分辨率为224,192,160,128
。Width Multiplier, Resolution Multiplier
对参数及计算量的影响:Linear Bottlenecks
在深度神经网络中,当前层的维度为
hi*wi*di
,其中d
表示通道数,也称为宽度;当通道数过低时,ReLu
激活函数会有很大的信息损耗;如下图所示,低维度情况下,张量的的恢复较差,几乎变形;高维度时则恢复较好:所谓
Bottleneck
,指的是输入和输出的维度差异较大,就像一个瓶颈一样。Inverted residual block
深度残差网络
ResNet
结构可以很好的增大网络深度,基于残差模块引入了Inverted residual block
即倒置残差模块,示意图如下:实现思路是:先通过
1*1
卷积核增加通道数,再进行深度可分离卷积,最后通过1*1
卷积核减少通道数。MobileNetV2
版本网络结构基于
Linear Bottlenecks
和Inverted residual block
提出了MobileNet V2
版本,其模块结构如下:1*1
卷积核降低深度时,使用线性激活替代了ReLU
激活函数输入经过
V2
结构后对应的输出为:MobileNetV2
完整结构如下:其中
t
代表单元的扩张系数,c
代表channel
数,n
为单元重复个数,s
为stride
步长数。V2
和V1
的比较dw
卷积前引入了一个pw
卷积,用于提高输入通道数pw
卷积之后,去掉了ReLU
激活函数,在低维度情况下,ReLU
会破坏特征不如线性效果好V2
和ResNet
的比较两者网络结构基本一样,区别在于:
ResNet
使用标准卷积,而MobileNetV2
使用dw
卷积ResNet
第一个1*1
卷积是降维,最后一个1*1
卷积是升维,网络特征图模型为沙漏型;MobileNetV2
第一个1*1
卷积是升维,最后一个1*1
卷积是降维,网络特征图模型为纺锤型BN: Batch Normalization
BN: Batch Normalization
也就是“批量归一化”,在深度神经网络训练过程中,BN
可以对神经网络每一层的输入做归一化处理。论文地址:Internal Covariate Shift
在深层网络训练的过程中,由于网络中参数变化而引起内部结点数据分布发生变化的这一过程被称作
ICS:Internal Covariate Shift
,也就是隐藏层的输入分布总是变化。Internal Covariate Shift
带来的问题:可以通过固定输入值的分布为了解决这些问题,而常见的方法就是白化
Whitening
。白化是机器学习里面常用的一种规范化数据分布的方法,主要是PCA
白化与ZCA
白化。白化是对输入数据分布进行变换,进而达到以下两个目的:PCA
白化保证了所有特征分布均值为 0 ,方差为 1 ;而ZCA
白化则保证了所有特征分布均值为 0 ,方差相同通过白化操作,我们可以减缓
ICS
的问题,进而固定了每一层网络输入分布,加速网络训练过程的收敛。但是对每一层进行白化过程,计算成本太高;并且由于白化改变了网络每一层的分布,从而改变了网络层中本身数据的表达能力。BN
算法BN
的基本思想是:在将输入送给神经元之前,先归一化将输入的分布规范化成在固定区间范围的标准分布(均值为 0 ,方差为 1 ),然后再对其做平移和伸缩变换;计算公式如下:BN
引入了两个可学习的参数:缩放系数γ
和平移系数β
,这两个参数的引入是为了恢复数据本身的表达能力,对规范化后的数据进行线性变换。另外,由于γ
和β
是可训练的,那么意味着神经网络会随着训练过程自己挑选一个最适合的分布。DNN
的归一化就是白化操作,在神经网络训练过程中对整体训练数据做归一化带来的计算量太大,这也是白化遇到的问题;而BN
简化了白化操作:normalize each scalar feature independently
mini-batch
中计算均值和方差(而不是整体所有数据)γ
和平移系数β
保证了模型的表达能力不会归一化后而下降BN
的优点sigmoid, tanh
等),缓解梯度消失问题Dropout
等技术可以去掉)通常在非线性映射前增加
BN
,也就是数据在送入激活函数前先通过BN
将输入归一化。Google
发表BN
论文是在VGGNet
上做的实验。后续
CVPR
最佳论文DenseNet
CVPR
最佳论文Taskonomy: Disentangling Task Transfer Learning
SSD, YOLO
模型介绍ShuffleNetV2
等小规模模型参考文档
via Earth Guardian https://ift.tt/VpKSDoE
February 20, 2025 at 02:07PM
The text was updated successfully, but these errors were encountered: