CNN总结

常用组件:

数据增强(造假数据):  256*256的原图,枚举224*224的子图,每个子图再水平翻转一次,数据量增大约(256-224)*(256-224)*2=2048倍,测试阶段每张图取10个子图(四个角各取一张中间再取一张,以及这些的水平反转图)得到10组softmax结果平均起来就是最终结果(如果像训练一样取2048个子图,预测速度就太太太慢了);这些造假数据的计算量很小,所以可以现造现用不占磁盘(如果造假的计算量大,则预处理放到磁盘上,每轮迭代都去读取,更省时间);没有此举肯定过拟合,因为数据太少网络太深。整个训练集上做PCA,每张图片随机在3个主成分上增加扰动;效果提升1%。

数据输入归一化:调整输入的分布,使其出现在更容易被分界面分割的位置(坐标轴各维度0附近),降低过拟合的风险,增快收敛速度;(每个pixel减去

Conv: 串联2个3*3代替5*5,节省计算量,节省参数量;Conv1*1: 降维,升维(还原),很小的参数量和计算量换取一层变换,值

BN: 中间结果归一化;调整中间层结果的分布,使其出现在更容易被分界面分割的位置(坐标轴各维度0附近),降低过拟合的风险,可增加学习率获得14倍的训练收敛加速。妙在位置:矩阵乘之后,ReLU之前。

ReLU: 克服反向传播梯度消散(Sigmoid传到前面层的时候梯度近似0了);

Max-Pooling: 降低特征图大小(于此同时应该让Conv层增多特征图数目);在Conv时使用stride=2可达到同样效果;

Drop-out: 降低过拟合;(相当于很多模型的集成)(例如dropout=p, 一般是训练的时候将p概率的神经元保留剩下的置0,再将剩下的值都除以p, 这样预测的时候就可以啥都不做了)(如果训练的时候不除以p, 预测的时候就要乘以p,浪费宝贵的预测时间)

Global-Average-Pooling: 特征图直接平均得到一个数,N张特征图就得到N个数;避免N个特征图拉直后全连接层参数过多;后面可接一层FC再接softmax(ResNet),也可直接接Softmax;

Softmax: 多分类问题;

identity-mapping(shortcut, highway): 正向时,允许更大的深度(到后面就成了直通);反向时,梯度可以传播的更靠前, 进一步减少梯度消散,允许更深的网络;解决了深度加深时的退化问题(在训练和测试集上效果都变差)(正向传播时,只需拟合参残差,增大了对输出变化的敏感程度,因此更易于训练

梯度:Adam(考虑了冲量,考虑了历史梯度越少越要加权;两者都用了moving window average照顾最近期的); RMSProp; error不降了就减小10倍;冲量:0.9;正则化项系数:0.0001

应对梯度消散的N种解决方案:(预训练,梯度剪切和正则化(应对梯度爆炸),ReLU, BN, 残差网络, LSTM, GoogLeNet的辅助分类器) 详解机器学习中的梯度消失、爆炸原因及其解决方法_Double_V的博客-CSDN博客_梯度爆炸

AlexNet:

唯一的预处理是:把每个像素减去整个训练集的平均值

数据增强:图片最小边缩放至256;采样224*224的子图及其水平镜像(每张采样2048个子图),扩大了训练集(否则训练数据太少肯定过拟合);测试的时候4个角和中间各取一张,及其镜像,10个softmax结果做平均;  整个训练集上做PCA,每张图片随机在3个主成分上增加扰动;效果提升1%。

"现在的GPU非常适合做跨GPU并行运算,因为它们可以直接向彼此的存储中做读写操作,而无需通过宿主机存储。"

"我们采用的这种并行模式主要是将各一半的网络内核(或神经元)放在每个GPU上,然后再采用一个小技巧:将GPU通信限制在某些特定的层上。" (有些层只在本GPU上训练,有些层跨GPU通信)(所以网络结构被分成了2半)

使用了ReLU;前面层加了bias=1来初始化,为了一上来让更多的ReLU输出是大于0的;

FC层使用了dropout; (类似于很多模型的集成;使得每个神经元不仅仅依赖上层某几个神经元)训练时让一半激活为0,测试时让这些层输出乘以0.5,保持整体分布和训练一致。

LRN(已被BN所淘汰)

pooling的时候用了区域重叠,有0.3%的微弱效果 提升。

后面FC层的输出,反映了图片的"语义特征",可以用欧式距离找内涵最相似的图片。

首层卷积核是彩色的!(Height*Width*InputChannels*OutputChannels+OutputChannels=卷积核实际参数量)

集成:训练多个模型,取平均

VGG: 

唯一的预处理是从每个像素中减去在训练集上计算的RGB均值

Conv层全部用3*3卷积核替代大卷积核(完全不用5*5或7*7卷积核,而使用多个3*3卷积核串联取代大卷积核); 好处:每个3*3的Conv后都接ReLU增大了非线性变化,且减少了参数量;

更深的网络:深度在19层达到饱和;靠数据增强来提升效果了;

Max-pooling减少图像大小一半后,下一个Conv层要增大一倍Channel数

drop-out设为0.5; momentum=0.9, learning-rate在74次迭代中一共降低了3次(当验证集准确率停止改善时,减少10倍)

加快训练:使用浅层网络的权重,初始化深层网络的权重;使用小尺度原图的网络权重,初始化大尺度原图的网络权重;

对图片等比缩放,把图片的窄边缩放至S,每次从中截取224*224的子图进行训练;一种配置是固定住S(256或者384);一种配置是对每张图片,S在[256,512]之间随机取一个;后者相当于对训练集进行了多尺度数据增强,后者使用了前者的网络参数来初始化(前者的网络相当于预训练)。后者的效果更好

"由于较高层会捕获较高的抽象特征,其空间集中度预计会减少。这表明随着转移到更高层,3×3和5×5卷积的比例应该会增加"

测试阶段,对固定S的配置(前者),使用较小的尺寸浮动,对效果有提升;对随机S的配置(后者),使用较大的尺寸浮动,对效果有提升。

测试阶段,dense技术:FC层用"卷积"代替(使得整个网络成为全卷积网络)(我的理解是,这里的卷积参数是很多很多的,每个输入通道都有不同的参数;复用FC层的参数),可减少重复计算。最后得到1000个特征图(如果网络原始输入是224*224,则得到1000个1*1的特征图,如果输入是225*225, 则得到1000个2*2的特征图,...), 每个特征图求平均,得到1000个值,过softmax,得到1000个分类概率;测试集数据增强:图片水平反转,再得到1000个分类概率,和之前的1000个对应求平均,就是最终的1000个概率。

实验结果显示,dense比multi-crop(原始图裁剪成子图,一个个依次输入到网络里)要差。但是两者求平均,能得到最佳效果。(区别:dense是用原图周围的一圈像素做padding, multi-crop是0-padding)

简单的数据并行,1个mini-batch(256张图)分成4份(64张图/份),4个GPU上同步训练,最后结果求平均。3.75加速比。

GoogLeNet:

稀疏网络:参数量是AlexNet的1/12,是VGG的1/3,效果比以上都好;

Inception-v1到Inception-v4的变迁:大话CNN经典模型:GoogLeNet(从Inception v1到v4的演进) - 雪饼的个人空间 - OSCHINA - 中文开源技术交流社区

老路子:更深,更宽;遇到如下问题:1. 过拟合;2.计算量太大;3.梯度消失;

解决:稀疏;稀疏会造成加速比下降:"大量的文献表明可以将稀疏矩阵聚类为较为密集的子矩阵来提高计算性能"; Inception目标:稀疏性、高计算性能

更宽更深方面的贡献:1. 更深:22层,使用旁路softmax目标函数来增强梯度传导;2.更宽:多尺度卷积核并联,且用1*1卷积核降维降低计算量;

1*1卷积核作用:1.降维,以减少后续卷积计算量;2.加深,增加一层非线性变换(ReLU)

最后两层是average pooling(提高0.6%的效果)+ FC(为了类别数目可变)

测试阶段:模型ensemble和通过裁剪进行尺度上的数据增强,都对效果提升很大!! (模型ensemble: 7个模型的权重初始化和学习率策略都是一样的!只有数据采样和顺序不同!)(数据增强:将图像归一化为四个尺度,其中较短维度(高度或宽度)分别为256,288,320和352,取这些归一化的图像的左,中,右方块(在长方形图片中,采用顶部,中心和底部方块)。对于每个方块,我们将采用4个角以及中心224×224裁剪图像以及方块尺寸归一化为224×224,以及它们的镜像版本。这导致每张图像会得到4×3×6×2 = 144的裁剪图像。)

Inception-v1: <1*1, 3*3, 5*5, max-pooling>并行的结构;大卷积核计算量大,因此3*3和5*5卷积之前都加上1*1卷积核进行降维,同时增加了一层非线性变换(ReLU)。

“设计遵循了实践直觉,即视觉信息应该在不同的尺度上处理然后聚合,为的是下一阶段可以从不同尺度同时抽象特征。”

(1)GoogLeNet采用了模块化的结构(Inception结构),方便增添和修改;
(2)网络最后采用了average pooling(平均池化)来代替全连接层,该想法来自NIN(Network in Network),事实证明这样可以将准确率提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便对输出进行灵活调整;
(3)虽然移除了全连接,但是网络中依然使用了Dropout
(4)为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度(辅助分类器)。辅助分类器是将中间某一层的输出用作分类,并按一个较小的权重(0.3)加到最终分类结果中,这样相当于做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化,对于整个网络的训练很有裨益。而在实际测试的时候,这两个额外的softmax会被去掉

Inception-v2: 进一步减少参数:用2个3*3卷积核串联代替5*5卷积核;用1*n和n*1的卷积核串联代替n*n的卷积核;

先pooling再卷积,则损失信息;先卷积再pooling, 则计算量大;解决:卷积(stride=2), pooling(stride=2),并行执行再合并;

BatchNormalization (BN)

Inception-v3: 把googlenet里一些7*7的卷积变成了1*7和7*1的两层串联,3*3的也一样,变成了1*3和3*1,这样加速了计算,还增加了网络的非线性,减小过拟合的概率

Inception-v4: 把原来的inception加上了resnet的方法

ResNet:

解决了"退化"问题(不是过拟合):层数大于一定以后,训练和测试的效果都会下降。

拟合x, 残差部分所有边权重都为0即可,比普通网络来拟合x要容易很多;残差部分的层数不能是1,1的时候Wx+x相当于普通网络。反向传播:完美解决(掩盖)了梯度消失问题

每个结构是先用1*1来降维,再3*3卷积,再1*1升维(恢复);

shortcut对于x的维度变换,一种是zero-padding,另一种是通过1x1的卷积。后者效果略微好一丢丢。

Our implementation for ImageNet follows the practice in [21, 41]. The image is resized with its shorter side randomly sampled in [256, 480] for scale augmentation [41]. A 224×224 crop is randomly sampled from an image or its horizontal flip, with the per-pixel mean subtracted [21]. The standard color augmentation in [21] is used. We adopt batch normalization (BN) [16] right after each convolution and before activation, following [16]. We initialize the weights as in [13] and train all plain/residual nets from scratch. We use SGD with a mini-batch size of 256. The learning rate starts from 0.1 and is divided by 10 when the error plateaus, and the models are trained for up to 60 × 104 iterations. We use a weight decay of 0.0001 and a momentum of 0.9. We do not use dropout [14], following the practice in [16]. In testing, for comparison studies we adopt the standard 10-crop testing [21]. For best results, we adopt the fullyconvolutional form as in [41, 13], and average the scores at multiple scales (images are resized such that the shorter side is in {224, 256, 384, 480, 640}).

其后另一篇文章分析到:ResNet可看成多个网络的emsemble! "ResNet并没有解决训练梯度消散的问题,它的主干网的反向梯度依然随着深度增大而变得越来越小,只不过ResNet有很多 identity skip connection,这些 connection 能把梯度原封不动的反向传回去,从而掩盖了梯度消散问题"。

Network in Network(颜水城):

mlpconv: 实际上等价于1*1卷积核的串联!Network In Network——卷积神经网络的革新 - 殷大侠 - 博客园

Global Average Pooling: remove掉了 全连接层, 使用 global average pooling 来代替; 举个例子: 假设分类的任务有100 classes,  所以设置网络的最后的 feature maps 的个数为 100, 把每一个feature map 看作成 对应每一类的 概率的相关值 ,然后对每一个 feature map 求平均值(即 global average pooling), 得到了 100维的向量, 把它直接给 softmax层,进行分类;(其实100个数中最大值对应的类别即为预测值, 之所以再送给 softmax层是为了求 loss,用于训练时求梯度)(对整个网路在结构上做正则化防止过拟合。其直接剔除了全连接层中黑箱的特征,直接赋予了每个channel实际的类别意义)

FCN(全卷积网络):

全卷积网络 FCN 详解 - 代码学习者coding - 博客园

将训练时的FC,在测试时替换成Conv;(和Global Average Pooling完全不是一回事!)

可以在测试阶段输入比训练时更大的图片(长方形的原图可直接输入),Conv完之后的图相当于原图所有crop的结果值,这些值softmax后求平均,基本等价于原图crop后最终结果求平均(只有padding不同)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值