caffe study- AlexNet 之算法篇
在机器学习中,我们通常要考虑的一个问题是如何的“以偏概全”,也就是以有限的样本或者结构去尽可能的逼近全局的分布。这就要在样本以及结构模型上下一些工夫。
在一般的训练任务中,考虑的关键问题之一就是数据分布是否合理:首先是数据集的覆盖度,也就是数据集是否能够覆盖样本空间;其次还要尽可能的保证具有和真实数据一样的分布(注意数据分布是未知的,你只能根据一些先验来近似),这样的数据才是有效的。当然这些方式只是增大了得到正确解的概率,而并不能保证一定可以得到正确解。当你不知道你所取的训练集合是否和真实分布一致的时候,那么就要多取几次,每一个数据集都算算,对于分类器也是这样,单个分类器往往不能精确描述一个分界面,那么我们就组合一下,每个都算算。从方法论上讲,对于事物观察到的往往是局部,因此会犯以偏概全的错误,如果能够将所得到的“偏” ensambling 一下,那么就生成了相对的“全”,从而可以更大的概率逼近总体分布。这种思想在好多方面都体现出来,如交叉验证,经典的RANSAC,Random Tree(forest),Adaboost 等方法。
下面将从数据和模型两个方面来学习一下AlexNet中的一些技巧,主要参考的是Alex 2012 年的 NIPS论文ImageNet classification with deep convolutional neural networks.
1. 数据的处理:
到目前为止,还没有人看到数据集的大小对deeplearning算法理论上限造成的影响,也就是说数据集合还没有达到临界点,所以增加数据集只有好处,没有坏处。
在Alex的论文中,采用了两个方法对于图像进行了增强。
a. 增大训练样本:通过对于图像的变换实现了对于数据集合的enlarge。首先对于输入的图像(size 256*256)随机提取224*224的图像集合,并对他们做一个horizontal reflections。变换后图像和原图像相差了32个像素,因此主体部分应该都包含在训练集合中,相当于在位置这个维度上丰富了训练数据。对horizontal reflections来说,相当于相机在主轴方向做了镜像,丰富了反方向的图像。数据集合增大了2048倍,直接结果就是降低了overfitting同时降低了网络结构设计的复杂层度。
在测试阶段,取每一个测试样本四个角以及中间区域,一共5个patch然后再镜像后得到10个样本输入到网络中,最后将10个softmax输出平均后作为最后的输出。
b.使用PCA对于训练数据进行增强:对于每一个RGB图像进行一个PCA的变换,完成去噪功能,同时为了保证图像的多样性,在eigenvalue上加了一个随机的尺度因子,每一轮重新生成一个尺度因子,这样保证了同一副图像中在显著特征上有一定范围的变换,降低了overfitting的概率。
以上的策略是不是真的有必要,这个还是要打一个问号,因为对于a部分来说,样本少,可以在结构设计上下下功夫,可能达到相同的效果。对于b来说,deeplearning还需要对于图像加入增强处理吗?如果这样的话,自然也可以用一些传统人工特征先来一遍,再deeplearning了。我想关键的原因是deeplearning还没有真正的被证明的规则,所以你用什么策略都有点道理,但是谁敢保证不是“以偏概全”呢?
2. 模型结构:
在模型的设计上,AlexNet做了一个Local Response Normalization的处理,同时在节点的选择上采用了一个dropout策略。
a. Local Response Normalization.
公式如下,其中a是每一个神经元的激活,n是在同一个位置上临近的kernel map的数目,N是可kernel的总数目,k,alpha,beta都是预设的一些hyper-parameters,其中k=2,n=5,alpha = 1*e-4,beta = 0.75。
从这个公式中可以看出,原来的激活a被加一个归一化权重(分母部分)生成了新的激活b,相当于在同一个位置(x,y),不同的map上的激活进行了平滑,但是至于为什么k,alpha,beta这样来设置,没有想太清楚。
这个平滑大概可以将识别率提高1-2个百分点。
b. Dropout策略
使用多个model来共同进行预测是一个降低test errors的基本方法,但是单独的训练多个model组合会导致整个的训练成本增加,毕竟训练一个单一的网络需要很长的时间,即便计算资源足够,在不影响精度的情况下降低整个运算时间还是我们追求的目标。
由此Hinton提出了dropout策略,这个策略很简单,对于每一个隐层的output,以50%的概率将他们设置为0,不再对于forward或者backward的过程起任何作用。对于每一个input来说,使用的不同的网络结构,但是权重是共享的。这样求得的参数能够适应不同的情况下的网络结构,也就是提高了系统的泛化能力。
在AlexNet中最后的两个full-connected层中使用了这个策略。
3. 优化算法的参数
论文中使用SGD算法,基本参数设置在前面优化算法的总结中已经提到了。这里要说几个个人体会。
a. 原文中输入的batch数目是256,应该Alex经过调节后的结果,我实际用到的机器性能比较低,内存8G,显存4G,所以不得不就将batch数目往下调到64,以免产生out of memory的错误。这样就需要调节其他的参数来保证数据的收敛。原因是batch比较小,导致本文开篇提到的样本覆盖面过低,产生了非常多的局部极小点,在步长和方向的共同作用下,导致数据产生了震荡,导致了不收敛。
b.在这种情况下,把learning rate调节到了0.02,相当于加大了步长,这样可以在一定程度上避免震荡,可以越过局部极小点往比较大的极值点行走。
c. 对于每一层的bias从1设置为了0.1,在一定程度上限制了激活的大小,这样就限制了某一过大的误差的影响,这样可以避免迭代方向出现过大的变化。
d. 经过b c后,系统终于收敛了,但带来的不良后果就是整个收敛速度变慢,因此还需要增加最大迭代次数,经过测试迭代次数成了从45w修改成了70w。
e. 在整个运行过程中,出现了几次平稳点,20w以及40w左右的时候,因此迭代的learning rate应该随着迭代的接近平稳点的时候有意的减小一些,目前是以每10w次减小为1/10,调参数用了5天,最后运行时间为15天。
f. 关于调参策略,上面只是按照一些简单的理解设置的,如果没有一个合理的解释,调参就变成了一个很low的工作。还好发现了好几篇关于调参的论文,主要是优化算法理论方面的,学习完再回来测试一下。
caffe study- AlexNet 之算法篇的更多相关文章
- 深度学习word2vec笔记之算法篇
深度学习word2vec笔记之算法篇 声明: 本文转自推酷中的一篇博文http://www.tuicool.com/articles/fmuyamf,若有错误望海涵 前言 在看word2vec的资料 ...
- 算法篇(前序)——Java的集合
菜鸟拙见,望请纠正:附上JDK参考文档(中文文档和英文文档):链接:https://pan.baidu.com/s/14KDmCtQxeGCViq7e0zENjA 密码:e9xs 以及算法篇全文链接 ...
- Caffe训练AlexNet网络,精度不高或者为0的问题结果
当我们使用Caffe训练AlexNet网络时,会遇到精度一值在低精度(30%左右)升不上去,或者精度总是为0,如下图所示: 出现这种情况,可以尝试使用以下几个方法解决: 1.数据样本量是否太少,最起码 ...
- FCC编程题之中级算法篇(下)
介绍 本篇是"FCC编程题之中级算法篇"系列的最后一篇 这期完结后,下期开始写高级算法,每篇一题 目录 1. Smallest Common Multiple 2. Finders ...
- FCC编程题之中级算法篇(上)
介绍 FCC: 全称为freeCodeCamp,是一个非盈利性的.面向全世界的编程练习网站.这次的算法题来源于FCC的中级算法题. FCC中级算法篇共分为(上).(中).(下)三篇.每篇各介绍7道算法 ...
- 学习 Rust cookbook 之算法篇(algorithm)
原文作者:suhanyujie 永久链接:https://github.com/suhanyujie/rust-cookbook-note 博客链接:https://ishenghuo.cnblogs ...
- 二级py--day4 数据结构与算法篇
二级py--day4 数据结构与算法篇 1.算法的基本特征:可行性.确定性.有穷性.拥有足够的情报 2.算法的设计要求包括效率与低存储量,既要考虑算法的时间复杂度和空间复杂度 3.算法的优劣:与算法描 ...
- 基于Caffe训练AlexNet模型
数据集 1.准备数据集 1)下载训练和验证图片 ImageNet官网地址:http://www.image-net.org/signup.php?next=download-images (需用邮箱注 ...
- LDA工程实践之算法篇之(一)算法实现正确性验证(转)
研究生二年级实习(2010年5月)开始,一直跟着王益(yiwang)和靳志辉(rickjin)学习LDA,包括对算法的理解.并行化和应用等等.毕业后进入了腾讯公司,也一直在从事相关工作,后边还在yiw ...
随机推荐
- <a>和<table>标签的应用
今天介绍一下html中最重要的标签 标签分为 1.一般标签 如<img> <b></b>等 2.功能标签 如<a></a> 3.实体 如&a ...
- JavaScript数组和json的区别
<html> <head> <meta charset="utf-8"> <title>无标题文档</title> &l ...
- Android Studio ( Linux) 创建模拟器报错
Linux下Android studio创建模拟器最后一步报错 报错:An error occurred while creating the AVD. See idea.log for detail ...
- RabbitMQ学习之基于spring-rabbitmq的RPC远程调用
http://blog.csdn.net/zhu_tianwei/article/details/40920985 spring-rabbitmq中实现远程接口调用,主要在com.rabbitmq.s ...
- 企业级任务调度框架Quartz(7) 线程在Quartz里的意义(1)
1.Java 中的线程 线程允许程序同一时间做很多任务,至少,看起来那些任务是并发执行的.在我的并发编程的帖子里有介绍线程的基本概念:我们知道在任一特定时刻仅有一个线程 在执行,但是 CPU ...
- Linux下清空文件的几种方法
$ : > filename $ > filename $ echo "" > filename $ echo > filename $ cat /dev/ ...
- Python数据分析-----数据分类
1.常见的分类算法主要有: (1)KNN算法 (2)贝叶斯方法 (3)决策树 (4)人工神经网络 (5)支持向量机(SVM) 2.KNN算法 (1)KNN应用场景: 比方说样本中有很多零食.很多电器. ...
- 使用canvas保存网页为pdf文件支持跨域
前言 之前上一篇随笔说了Canvas截图网页为图片,下来个新需求,把网页截图后保存为PDF文件供用户下载. 前文 Canvas截图网页为图片:https://www.cnblogs.com/bubub ...
- 基于 SpringMVC——web.xml基本配置
<!--声明应用范围内的初始化参数--> <context-param> <param-name>contextConfigLocation</param-n ...
- 00072_System类
1.概念 (1)System中代表程序所在系统,提供了对应的一些系统属性信息,和系统操作: (2)System类不能手动创建对象,因为构造方法被private修饰,阻止外界创建对象: (3)Syste ...