ResNet(Residual Network)残差网络,深度有152层
inception Network
LeNet-5当时没有采用padding,故图像的尺寸会越来越小。
LeNet-5启发我们现代的网络结构:多个卷积层后,跟着池化层。或多个卷积层,跟着池化层,最后跟着几个全连接层。
此外LetNet-5在池化层后,加入了非线性函数。本例中,池化层后加入了sigmoid函数
AlexNet中的卷积操作使用了padding
其参数个数大大增加。相对于LeNet-5的60k个参数,AlexNet有60million的参数
AlexNet使用了ReLu函数,并且可以使用多个GPU进行网络计算
Local Respone Normalization(局部反应正则化)目前不常用,效果不好:
思路:选择一个位置,然后贯穿整个信道,进行正则化。能够得到256个数字,并进行归一化。对于13×13×256的图像,我们并不需要太多的高激活神经元
VGG-16网络,代表其深度为16个卷积层和全连接层。是一个简单的网络结构。其只包含卷积操作和池化操作。VGG-16网络包括138million个参数。
第一个卷积filter为3×3,64个信道,卷积两次。
VGG的缺点是需要训练的参数的数量很大。
层数很深的神经网络是很难训练的,因为其存在梯度爆炸和梯度消失等问题。故,我们采用了skip connection来解决这个问题。让我们可以从某层神经网络获取激活,然后快速反馈给神经网络的深层。利用skip connection就可以达到训练出深度很深的ResNet 的目标。
传统的main plain主路径,对于a[L]先采用Linear线性激活函数,再使用ReLu激活函数。skip connection的思想就是,跳过Linear和ReLu操作。直接将a[L]加到其它层的ReLu激活函数之前。
也就是a[L+1] = g(z[l+2] + a[L]),其中a[L]为残差块(residual block)。
残差网络Residual Network就是在Plain Network的基础上,进行skip connection。其思路是 每隔一层,进行skip connection。
理论上来说,随着神经网络深度的增加,其训练集中的错误率应该会越来越小。而实际上,使用优化算法会越来越难训练。导致实际上,神经网络的错误率是先减少,再增加的趋势。
故,我们需要引入残差网络Residual Network,来解决这个问题。让神经网络的错误率,随着深度增加,而减少。
如果我们使用L2正则化,那么会压缩W[L+2]和b[L+2]的值。假如w[L+2]=0,b[L+2]=0,那么相当于g(w[L+2] a [L+1] + b[L+2] + a[L]) = g(a[L]),此时当a[L]大于等于0的时候。那么经过Relu激活函数g(a[L])= a[L]
我们可以看到对于残差块来说,学习是很简单的。也就是a[L+2] = a[L]。
不论我们把残差块放置于网络中的任何一个位置。其都不会影响网络的表现。如果隐含层学到了有用的信息,那么可能会比残差块表现更好。
对于没有使用残差块的神经网络来说,随着网络深度的增加,选择用来学习恒等函数的参数都很困难。故,经过很多层以后,表现可能会越来越差
如果a[L+2]与a[L]的维度不同。即,a[L+2]为256维,而a[L]为128维。那么我们就需要在a[L]前,乘上Ws矩阵。即,Ws为256×128维
从Plain Network到ResNet Network
对于单通道的图像,使用1×1的卷积核,可能作用不大。相当于把图像整个乘上某个数字。如,整个图像都乘2。
对于多通道的图像,我们可以采用1×1的卷积核。相当于图像中一个位置的不同通道,都乘上了一个数字,然后将相乘的值相加。那么也相当于经过了一个ReLu激活函数,最后变成了一个数字。所以,一个1×1的卷积核,也就是相当于一个32个单元(通道)的全连接的神经网络。我们称这种方法为1×1的卷积或者Network in network(网络中的网络)
故我们的1×1的卷积,可以根据个人的意愿,调整filter的数量。增加信道,减少信道,或者和原来的信道数相同。
我们首先使用1×1×64的卷积,得到绿色结果块(28×28×64)。然后使用3×3×128的卷积,得到蓝色结果块(28×28×128)。然后使用5×5×32的卷积,得到紫色结果块(28×28×32)。最后使用Max-Pooling操作,其中使用same padding,stride步长为1。得到黄色结果块。
故,我们就将28×28×192的输入图像,变成了28×28×256的输出图像。inception网络的目标就是使用所有的卷积核和pooling操作。并且让网络自己选择出参数,选择出用过滤器的组合。我们不难看出这样将卷积和pooling都放在一起操作的话,最大的问题就是计算成本比较大。
让我们来以5×5的卷积核为例,计算一下计算成本。我们的卷积核为5×5×192,而输出图像的尺寸为28×28×32。故,计算成本为28×28×32×5×5×192=120million(1.2亿)
如果我们先使用1×1的卷积核,之后再使用5×5的卷积核。就会发现计算量大大减少,其中1×1的卷积核,被我们称为bottleneck layer(瓶颈层)。
使用1×1的卷积核的计算量为:28×28×16×192 = 2.4million
再使用5×5的卷积核的计算量为:28×28×32×5×5×16 =10million
故总计算量为12.4million相对于1.2亿,使用新的方法计算量仅为1240万。变成了原来1/10的计算量
正如我们上面说的,我们在3×3,5×5的卷积核之前,加入1×1的卷积核,来减少计算步骤。并且我们还在Max Pooling操作的后面,加入了1×1的卷积核。这样可以减少Max Pooling后,产生了的192个通道,将通道数从192降至32。也就是修改了Max Pooling在输出结果中的权重比例。
我们查看论文,可以看到实用的gooleNet网络中(谷歌发明的,为了纪念LeNet),其结构也是多个inception module的重复结合。其中部分module,首先加入了红色的Max Pooling是为了,改变输入图像的高和宽。
并且gooleNet网络中,还在隐藏节点中,增加了softmax的输出层。也就是隐藏的单元的中间层,也可以进行图像的分类。这么做起到了一种调整的作用,能够防止网络产生过拟合。
类似于盗梦空间中一层一层的梦境,大概可以解释,为什么我们的神经网络需要发展的越来越深。
由于种种问题,如:一些参数调整的细节或学习率衰减问题。我们很那通过阅读别人的论文,来再现工程项目。故,我们需要多看看github已有的开源代码。
比如我们想要resnet代码,谷歌搜一下:resnets github。
github地址:https://github.com/KaimingHe/deep-residual-networks
上面的项目,就是由ResNet原作者写的项目。使用了caffe的框架。
自己git clone下载一下。然后开始研究吧。
相对于从头训练网络中的权重。有一些大佬,已经使用开源的数据集(imageNet,MS COCO,等Pascal类型的数据集),探究了什么样是最佳的权重。故,我们可以迁移过来,作为我们自己项目的预训练参数。
保留其他人已经训练好权重的神经网络,只删掉原来网络最后的softmax层和输出层。换上我们新的softmax层和输出层。也就是我们只需要训练新换的softmax的权重。本例中也就是softmax分类成三类:tigger,misty,neither。对于大部分的框架,都支持这项功能。我们只需让 freeze trainableparmeter参数 =0,那么前面的整个训练好的网络就会冻结。( freeze trainableparmeter参数 =1,也就是不冻结)
此外,因为全面的层都被冻结了。相当于一个不会改变的固定的函数。我们可以将输入数据x,直接映射到最后一层的隐含层,将计算结果存储到硬盘中。这样能加速训练,其原因是:我们相当于前面的网络是一个函数,将输入数据x,计算成一个新的特征向量。那么这个新的特征向量,也就是softmax层的新的输入数据。相当于我们就是训练一个softmax层的模型。
这样的优点,我们只需要遍历一次数据集。然后将其全部存储在硬盘中,而不是传统的为了训练中间节点的权重,迭代训练集很多次epoch。(只针对于输入数据数据量小,可以全部存储于硬盘中)
如果我们输入数据量较多,我们就需要冻结部分前面的隐含层。保留部分后面的隐含层,再加上换上我们自己的softmax层。我们也可以将后面未冻结的隐含层,换上我们自己设计的层。进行权重训练。
数据量多的情况,我们就不冻结整个神经网络。只把其他人训练好的网络,当做初始权重。对整个网络进行训练。记住,也要更换成自己的softmax层。
对于目前,机器视觉的主要问题是无法得到足够量的数据。
Mirroring镜像操作:这个方法很好,因为可以保留原数据中的特征
Random Cropping随机裁剪操作:可能会裁剪出,比较偏的位置,不好辨认出猫。但是此方法,在数据增强中使用量比较大。
其他方法(使用量较少):Rotation图像旋转,Shearing图像剪切,Local warping图像局部変形
颜色变换,来使用不同光照下的图像,产生的不同效果。可以增加算法对于颜色的鲁棒性。如,RGB图像对于某个通道增加一些值,某个通道减少一些值。
或者我们也可以采用PCA算法来增强图像。在AlexNet的论文中,这种方法被称为“PCA color augmentation”PCA颜色增强。如果你的图像整体呈紫色,也就是R通道和B通道成分较多。那么PCA算法,就会让整个R,B通道成为主要,整个图像会保持紫色的风格。
我们知道CPU有很多的线程。当我们进行data distortions时,我们可以使用一个或多个线程进行。那么我们得到的数据集,就是一批一批的,也就是很多个mini-batch。对于训练,我们也可开一个线程进行训练。这样的结构,让取数,数据增强和网络训练,可以并行进行。
人工智能本意上就是使用很少的数据,对于更大的数据进行预测。而对于机器视觉而言,我们当前的问题是收集不到很多图像数据来训练。稀缺程度排序:Objection recognition图像标记(标记出车的位置)(最稀缺)< 图像识别 (标记出是否是猫)<语音识别
如果我们数据量大,我们可以采用简单的算法,更少的手工工程量。而数据量小,就需要我们采用很好结构的算法,来达到更好的识别效果。
很多研究者花时间,对于benchmark基准数据进行训练,来寻找出最佳的算法。
我们单独训练好几个网络后,可以对网络输出的结果进行平均。达到一个新的结果。可能会让你预测的结果水平提高1%到2%或更多,让你赢得比赛(平均输出的预测值y^,而不是平均权重)
一般就是10-crop方法。这样可以在生产时,算法有更好的效果。
思路:我们有猫的图片,并进行了镜像。
第一个取中心位置图片为一个crop,第二个取左上角,右上角,左下角,右下角,4个crop的4个不同的图片。
所以就是1+4+1+4,共10个crop