一.从简到繁再到简的卷积神经网:
LeNet->AlexNet->ZFNet->VGGNet->Inception系列->ResNet系列->轻量型卷积神经网
(1)LeNet:1998,LeCun提出,用于解决手写数字识别,MNIST(10分类),其网络结构:
这个图片输入的大小为28*28,是一张灰度图,通过LeNet对图片进行特征提取,输出10维的向量,就是这张图片属于0-9这10个类别的概率分布。LeNet包括了两个卷积层,两个pooling层,两个全连接层(之间有一个激活层)以及一个softmax层(将全连接层的结果映射到0-1)。
(2)AlexNet:2012年,Hintion的学生Alex Krizhevsky在寝室用GPU死磕出一个DeepLearning模型,一举摘下视觉邻域竞赛ILSVRC 2012的桂冠(1000分类)。相比LeNet,网络更深,并且通过GPU训练。
结构:1.conv-relu-pooling-LRN(归一化)2.fc-relu-dropout3.fc-softmax4.参数60M以上5.模型大小>200M
特点:1.率先采用ReLU非线性激活函数2.Dropout层防止过拟合(fc的参数过大)3.数据增强,减少过拟合4.标准化层(LRN),作用并不是特别大
意义:1.证明了CNN在复杂模型下的有效性2.GPU实现使得训练在可接受的时间范围内得到结果。
(3)ZFNet:在AlexNet基础上进行细节调整,并取得2013年ILSVRC的冠军,从可视化的角度出发,解释CNN有非常好的性能的原因,其结构:
对于AlexNet的调整:1.调整第一层卷积核大小为7*7 2.设置卷积参数stride=2 3.卷积核的通道数更多
特征可视化的结论:1.特征分层次体系结构 2.深层特征更鲁棒 3.深层特征更有区分度 4.深层特征收敛更慢
(4)VGGNet:由牛津大学计算机视觉组和Google Deepmind共同设计,为了研究网络深度对模型准确度的影响,并采用小卷积堆叠的方式,来搭建整个网络结构,参数量138M,模型大小>500M,结构:
特点:1.更深的网络结构,结构更加规整,简单 2.全部使用3*3的小型卷积核和2*2的最大池化层 3.每次池化后feature map宽高降低一半,通道数量增加一倍 4.网络层数更多,结构更深,模型参数量更大
意义:1.证明了更深的网络,能够提取更好的特征 2.成为后续很多网络的backbone 3.规范化了后续网络设计思路
(5)GoogLeNet/Inception v1:在设计网络结构时,不仅强调网络的深度,也会考虑网络的宽度(同一层上通道的数量),并将这种结构定义为网中网的结构,即原来的结点也是一个网络。14年比赛冠军的model,证明了用更多的卷积更深的层次可以得到更好的结构。参数量:6.8M,模型大小:50M,原因有效的利用了1*1卷积核。最小的结构单元:
特点:1.更深的网络结构 2.两个Loss层,降低过拟合风险 3.考虑网络宽度 4.巧妙地利用1*1的卷积核来进行通道降维,减小计算量
如何从卷积的角度来减小网络中的计算量:1.小卷积核来对大卷积核进行拆分 2.strde=2代替pooling层 3.巧妙地利用1*1的卷积核来进行。
(6)ResNet:2015年,由何凯明团队提出的,引入跳连结构来防止梯度消失的问题,进而可以进一步加大网络深度,结构单元:
我们发现当我们堆叠更多的网络结构时,这个网络的性能并没有得到提升,反而train的性能和test的性能都会下降,因为网络结构增加的时候,网络的深度会变得更深,误差一层层的积累,就会造成梯度离散和梯度爆炸的情况。那要怎么办呢,我们希望30层的网络至少比22层网络不差才行,我们就人为的设置一个机制,使得30层再差也能退化为22层,方法:加一个短路层,反向传播时,就跳过了一部分层,使得梯度不用受被短接层的衰减,如果被短接的层能够训练好,那意味着这个网络的容量增加了,那就比22层略微好点,训练不好,可以走短接的路,就保证了网络不会比22层的差。这就是ResNet提出的初衷。单元的输入和输出的维度必须一样才能相加。
ResNet中的BatchNorm:每个卷积之后都会配合一个BatchNorm层,对数据scale和分布来进行约束,简单的正则化,提高网络抗过拟合能力。
特点:1.核心单元简单堆叠 2.跳连结构解决网络梯度消失问题 3.Average Pooling层代替FC层 4,BN层加快网络训练速度和收敛时的稳定性 5.加大网络深度,提高模型特征抽取能力
ResNet的变种网络:ResNeXt(分组卷积),DenseNet(更多的跳连),Wide-ResNet(加大网络宽度),ResNet In ResNet(网中网),Inception-ResNet(Inception结构)
下面我们来看在tensorflow怎么实现这个基本单元
class BasicBlock(layers.Layer):
def __init__(self, filter_num, stride=1):#filter_num为卷积核的通道数
super(BasicBlock, self).__init__()
self.conv1 = layers.Conv2D(filter_num, (3, 3), strides=stride, padding='same')
self.bn1 = layers.BatchNormalization()
self.relu = layers.Activation('relu')
self.conv2 = layers.Conv2D(filter_num, (3, 3), strides=1, padding='same')
self.bn2 = layers.BatchNormalization()
#实现短接:,如果stride等于1,维度不发生变化,则可以直接相加
if stride != 1:
self.downsample = Sequential()
self.downsample.add(layers.Conv2D(filter_num, (1, 1), strides=stride))
#设置卷积核为1*1,使维度不变,可以相加
else:
self.downsample = lambda x:x#x’=x
def call(self, inputs, training=None):#前向传播
# [b, h, w, c]
out = self.conv1(inputs)
out = self.bn1(out,training=training)
out = self.relu(out)
out = self.conv2(out)
out = self.bn2(out,training=training)
identity = self.downsample(inputs)
output = layers.add([out, identity])#相加
output = tf.nn.relu(output)
return output
二.卷积神经网络结构对比:
三.轻量型卷积神经网:更少的参数量,更少的计算量,我们的模型能够在移动端,嵌入式平台运行。
(1)SqueezeNet:ICLR-2017,作者分别来自Berkeley 和Stanford,提出Fire Module,由Squeeze层+Expand层。
特点:1.1*1卷积核减小计算量 2.不同size的卷积核,类似Inception 3.deep compression技术
(2)MobileNet:由Google团队提出,并发表于CVPR-2017,Depth-wise Separable Convolution(深度可分离卷积)的卷积方式代替传统卷积方式,以达到减少网络权值参数的目的。
中间的卷积包括了非常多的不同类型的卷积,然后将输出的结果进行concat。将标准的卷积拆分成两组不同的卷积,一种是每一组的通道都是1(Depth-wise Convolution),另一种通过1*1卷积核来学习channel之间信息(Point-wise Convolution).实验对比:
(3)MobileNet V2:倒置残差,与v1的对比:(1*1是加大通道数量)
(4)ShuffleNet V1:由旷视科技提出的一种轻量型卷积网络,深度卷积来代替标准卷积,分组卷积+通道shuffle(打乱).
ShuffleNet V2:旷视科技针对ShuffleNet V1改进的轻量型卷积神经网,该模型最大的贡献点在于解释了如何去设计轻量型卷积网络的几个标准和规范。
轻量型卷积神经网络设计标准:1.相同的通道宽度可最小化内存访问成本(MAC) 2.过度的组卷积会增加MAC 3.网络碎片化会降低并行度 4.元素级运算不可忽视
(a)(b)是V1的结构单元,(c)(d)是V2的结构单元。 (a)是正常的卷积过程,包括了两个组卷积,一个shuffle单元和一个DW深度卷积。(b)是卷积的时候进行了下采样。(c)没有add的操作,在整体的卷积后再shuffle,多了一个channel split,会将输入的channel划分为两份,一份用于concat,一份用于进行深度卷积。(d)两部分,一部分是下采用,另一部分进行通道的拆分,最后再shuffle。
(5)Xception:由Google提出,arXiv的V1版本于2016年10月公开,同样借鉴了深度卷积的思想,但是又存在差异,Xception先采用1*1卷积,再进行主通道卷积,在1*1卷积后,加入ReLU
四.单分支卷积神经网络:网络从输入一张图片,经过多次卷积得到输出。
多分支卷积神经网络:Siamese Net (2支), Tripet Net(3支), Quadruplet Net(4支), 多任务网络(多支)
(1)Siamese Net(孪生网络):主要用来解决度量问题,输入是有两个分支(两张图片),输出表达了两张图片的关系(相似度),相似距离:欧式距离,余弦距离。图1和图2是同一张图,输出结果定义为1,反之为0。这时该网络就完成了图片相似性的度量,这种网络可以用来做图像检索,人脸辨识。
度量问题:相似度,排序问题
余弦距离(余弦相似度):是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小的度量。欧式距离输出是0到正无穷的,余弦距离输出是0-1之间的。余弦距离在人脸识别的AM-softmax针对余弦距离计算特征之间的相似度。
余弦距离-----扩展Loss:1.Center Loss 2.SphereFace 3.CosFace 4.ArcFace 5.CCL 6.AMSoftmax
优化的方向是通过最大化两个向量之间的间隔,最终实现目标优化的过程。
(2)Triplet Net:输入的数据是3个分支,分别是Anchor,Negative,Positive。Anchor和Negative构成了不同类样本对,而Anchor和Positive则构成了同类。网络优化的方向是让同类的距离尽可能的小而不同类的距离尽可能的大,这时Triplet Loss本身包含了判别信息。loss的设计思路:同类之间的距离减去不同类之间的距离,a是表达了彼此之间的间隔
Triplet Net的网络结狗:(Embeddings进行特征提取,输出特征向量)
一张图片通过Triplet Net转化为一个向量,另一张图片经过Triplet Net 转化为一个向量,两个向量的距离小,两张图片类别相同。
特点:1.提取Embedding Feature 2.细粒度的识别任务(完成同类和不同类的判定任务)3.正负样本比例失衡-----难例挖掘(找到那些对于网络识别困难的样本,把这些样本作为输入,进而控制正负样本比例)
(3)Quadruplet Net:相比Triplet Net多加了一张负样本,
loss: 前一项是Triplet loss,后一项进一步缩小了类内的差距,不仅强调同类之间的距离要大于不同类之间的距离,而且对同类之间的距离要大于负样本之间的距离,a>b,a和b是彼此之间的间隔。
(4)多任务网络,有两种结狗:
第一种:网络的输入包含多个分支,每个分支进行分别特征提取,然后针对不同的分支设计出不同的任务,对不同分支的主干上会进行参数共享
第二种:对于主干网络是单支的,根据不同的求解任务拉出相应的分支,对特征提取就采用一支网络,1个分支对应多个输出,常见于目标检测。
五.卷积神经网中的Attention机制:人类大脑在接受和处理外界信号时的一种机制。人对于一副图像会重点关注于某些区域,体现在网络上就是对这副图像相应的位置进行不同位置的加权,所以对于attention最终输出是one-hot分布(0/1)或者soft的软分布(0.几)。Soft-Attention或者Hard-Attention。
Attention实现机制:1.保留所有分量均做加权(即soft attention)2.在分布中以某种采样策略选取部分分量(即hard attention)
加权的思路都可以称为attention,对于网络而言,attention就是如何利用加权的思路作用在不同的分量上。
实现的方法:(1)ResNet+Attention
上半部分就是ResNet完整的结果,下半部分就是计算特征图上每个点的权值,通过卷积+反卷积得到和当前特征图像大小一样的输出结果,然后对输出结果归一到0-1之间,再和特征图点乘并相加,完成了对特征图的加权。
(2)SENet/Channel Attention
同样有一个分支,这个分支经过卷积得到C维的向量,C维就对应了C通道的数量,C维的向量就是针对每个特征图上的权值,然后将权值乘上当前的特征图,得到新的特征图。
六.模型压缩:在模型的精度和速度的一种平衡,方法:模型剪枝,模型量化/定点化3,模型蒸馏
(1)模型剪枝:除无意义的权重和激活来减少模型的大小,流程:
对于网络,我们会定义一个评价函数,用来评价当前的神经元对于整个网络的贡献,我们会根据贡献度对网络分支进行一个排序,去除小贡献度单元,然后对模型进行重新训练,拿到新的训练模型,再进行排序,再剪支,再训练,判定网络的精度,只要我们的精度是满足要求,再进行迭代直到我们的精度难以满足我们的要求,就可以停止最后我们会得到剪支之后小的模型。
技巧:1.全连接部分通常会存在大量的参数冗余 2.对卷积窗口进行剪支的方式,可以是减少卷积窗口权重,或者直接丢弃掉卷积窗口的某一维度 3.丢弃稀疏的卷积窗口,但并不会使模型运行速度有数量级的提升 4.先训练一个比较大的神经网络模型,再逐步剪支得到的小模型。
(2)模型量化/定点化:减少数据在内存中的位数,可以采用8位类型来表示32位浮点(定点化)或者直接训练低于8位的模型,比如2bit模型,4bit模型等。减少内存开销,节省更多的带宽;对于某些定点运算方式,甚至可以消除乘法操作,只剩加法操作,某些二值模型,直接使用位操作;代价通常是位数越低,精度下降越明显。
在tensorflow中,通常采用引入量化层的方式来更改计算图,进而达到量化的目的。
(3)知识蒸馏:采用一个大的,复杂的网络模型来指导一个小的,精简之后的网络模型进行模型训练和学习。根据大的网络的输出信息作为指导信息来指导小的网络的进阶信息。 |