VGG
- 模型的升级
- 回顾CNN
- 卷积核
- 池化
- 原理
- 使用2个3x3卷积核可以来代替5*5卷积核
- 计算参数量
- VGG网络结构
- 注意点:
- 1*1的卷积核
- 作用一:减少了参数量
- 作用二:增加非线性
- 作用三:从fully-connected layers的角度来理解1*1卷积核
- 作用四:解决了需要固定输入图像尺寸的问题
模型的升级
AlexNet(2012),VGG(2014),GoogleNet(2014),ResNet残差网络(2015)等等,其中VGG相比AlexNet做出的三个改进:
1)使用小的卷积核而不是大的(如选用三个33的卷积核而不是选一个77),减少参数量
2)使用了max pooling,避免了平均池化的模糊化效果
3)在全连接层使用dropout,随机丢弃一部分神经元
这三个创新的地方使得VGGnet的参数大大减少,提高了识别率,但是由于使用了较多的卷积操作以及使用了三层全连接层(全连接层会大大增加参数量),因此速度变得缓慢。
回顾CNN
CNN一个牛逼的地方就在于通过感受野(卷积核)和权值共享减少了神经网络需要训练的参数的个数,所谓权值共享就是同一个Feature Map中神经元权值共享,该Feature Map中的所有神经元使用同一个权值。因此参数个数与神经元的个数无关,只与卷积核的大小及Feature Map的个数相关。但是共有多少个连接个数就与神经元的个数相关了,神经元的个数也就是特征图的大小。
卷积核的权值共享只在每个单独通道上有效,至于通道与通道间的对应的卷积核是独立不共享的,
卷积层的可训练的参数个数: trainNum = ( kernelSize X kernelSize + 1) X kernelNum
(图片里面写错了)
卷积核
可以看作对某个局部的加权求和;它是对应局部感知,它的原理是在观察某个物体时我们既不能观察每个像素也不能一次观察整体,而是先从局部开始认识,这就对应了卷积。
卷积核的大小一般有1x1,3x3和5x5的尺寸(一般是奇数x奇数)。卷积核的个数就对应输出的通道数(channels),这里需要说明的是对于输入的每个通道,输出每个通道上的卷积核是不一样的。比如输入是28x28x192(WxDxK,K代表通道数),然后在3x3的卷积核,卷积通道数为128,那么卷积的参数有3x3x192x128,其中前两个对应的每个卷积里面的参数,后两个对应的卷积总的个数(一般理解为,卷积核的权值共享只在每个单独通道上有效,至于通道与通道间的对应的卷积核是独立不共享的,所以这里是192x128)。
池化
卷积特征往往对应某个局部的特征。要得到global的特征需要将全局的特征执行一个aggregation(聚合)。
池化就是这样一个操作,对于每个卷积通道,将更大尺寸(甚至是global)上的卷积特征进行pooling就可以得到更有全局性的特征。这里的pooling当然就对应了cross region。与1x1的卷积相对应,而1x1卷积可以看作一个cross channel的pooling操作。pooling的另外一个作用就是升维或者降维,后面我们可以看到1x1的卷积也有相似的作用。
原理
为什么参数减少了?
很明显,18小于25,即减少了参数;而且3x3卷积核有利于更好地保持图像性质。
使用2个3x3卷积核可以来代替5*5卷积核
我们假设图片是28*28的
我们使用5*5的卷积核对其卷积,步长为1,得到的结果是:(28-5)/1+1=24
然后我们使用2个卷积核为3*3的,这里的两个是指2层:
第一层3*3:
得到的结果是(28-3)/1+1=26
第二层3*3:
得到的结果是(26-3)/1+1=24
所以我们的最终结果和5*5的卷积核是一样的!!!
因此,就可以用两个3x3卷积级联(叠加)起来代替一个 5x5卷积。
3个33代替77的同理。
————————这样做的主要目的是在保证具有相同感知野的条件下(feature map大小相同),提升了网络的深度,在一定程度上提升了神经网络的效果。
计算参数量
VGG网络结构
注意点:
1.每个VGG网络都有3个FC层,5个池化层,1个softmax层。
2.在FC层中间采用dropout层,防止过拟合,如下图:
我们知道,典型的神经网络其训练流程是将输入通过网络进行正向传导,然后将误差进行反向传播。dropout就是针对这一过程之中,随机地删除隐藏层的部分单元,进行上述过程。步骤为:
(1)、随机删除网络中的一些隐藏神经元,保持输入输出神经元不变;
(2)、将输入通过修改后的网络进行前向传播,然后将误差通过修改后的网络进行反向传播;
(3)、对于另外一批的训练样本,重复上述操作(1)。
dropout可以有效防止过拟合,原因是:
(1)、达到了一种vote的作用。对于单个神经网络而言,将其进行分批,即使不同的训练集可能会产生不同程度的过拟合,但是我们如果将其公用一个损失函数,相当于对其同时进行了优化,取了平均,因此可以较为有效地防止过拟合的发生。
(2)、减少神经元之间复杂的共适应性。当隐藏层神经元被随机删除之后,使得全连接网络具有了一定的稀疏化,从而有效地减轻了不同特征的协同效应。也就是说,有些特征可能会依赖于固定关系的隐含节点的共同作用,而通过dropout的话,就有效地组织了某些特征在其他特征存在下才有效果的情况,增加了神经网络的鲁棒性。
3.如今用得最多的是VGG16(13层conv + 3层FC)和VGG19(16层conv + 3层FC),注意算层数时不算maxpool层和softmax层,只算conv层和fc层。
1*1的卷积核
作用一:减少了参数量
考虑这样一种情况,若输入是256层的feature map,要求输出也是256层,有两种方式:
(1)256层的feature map直接经过33256的卷积层,输出为256层feature map,需要25633*256=589824个参数。
(2)256维的输入分别经过1164的卷积层、3364的卷积层和11256的卷积层,输出256层的feature map,需要2561164+643364+6411*256=69632个参数。
由此可见,使用1*1卷积核大大减少了参数量,却不会更改最终的输出维度。
作用二:增加非线性
增加非线性可以增加神经网络的复杂度,复杂的神经网络才可以更精确地逼近任意函数(或数学模型),而1x1 conv可以用较低运算成本通过改变channel维度为网络增加复杂度。
作用三:从fully-connected layers的角度来理解1*1卷积核
作用四:解决了需要固定输入图像尺寸的问题
为什么有全连接层的网络输入图片尺寸需要固定的?
一句话:全连接层的一个神经元对应一个输入。
换句话说,全连接层要求固定的输入维度。
回想我们之前所提到的全连接层的结构图,由于全连接层与前一层特征图每个像素进行运算,因此其参数数量与前一层featuremap尺寸密切相关。如果输入图片大小不一样,那么经过各个卷积层后,最后一层卷积层产生的feature map尺寸也不尽相同,这样便无法实现前向传递,因此必须固定输入图像大小。
但是,在全卷积网络(Full Convolution Network)中,最后一个卷积层使用了1*1卷积核代替全连接层进行分类,此时不需考虑输入图像的大小,整个网络的参数数量,仅与每一卷积层卷积核大小和数量相关,与输入图像无关。