batch normalization的multidex 最新版本-GPU版本该怎么实现

喜欢c++并且追求代码效率,可以考虑caffee, mxnet&br&喜欢python,并且对网络有较高的个性化定制需求,推荐theano&br&喜欢python但是只需要使用cnn,rnn等标准模块.,强烈推荐keras&br&如果不会python,喜欢灵活架构的,可以考虑torch,使用的是lua这个入门比较简单的脚本语言,keras很多借鉴的就是torch
喜欢c++并且追求代码效率,可以考虑caffee, mxnet 喜欢python,并且对网络有较高的个性化定制需求,推荐theano 喜欢python但是只需要使用cnn,rnn等标准模块.,强烈推荐keras 如果不会python,喜欢灵活架构的,可以考虑torch,使用的是lua这个入门比较简单…
2W人民币以下估计只能用消费级的硬件配个单机。&br&&br&1. 深度学习对CPU要求不是很高,多是数据的预处理和给GPU输送数据,普通的i7就差不多,最便宜的E3也可以。&br&2. 内存至少16GB,如果有富裕的钱差不多可以上32或者64GB。&br&3. 电源买个850瓦以上的,楼下P500那个例子的650W其实不够,以后有富裕钱要加显卡的话650W捉襟见肘很不稳定。&br&4. 显卡看你有多少钱了,以及以后想不想升级。如果问题需要的显存比较大,还是一次上Titan X就OK,先一个泰坦,以后有钱再加。如果预算吃紧,980 Ti也是不错的,显存6G小了点但是CUDA core数量和Titan X没区别。&br&5. SSD还是要搞一个大一点的,如果你用了比较优秀的快速简洁高效深度学习平台比如MXnet &a href=&///?target=https%3A///dmlc/mxnet/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&dmlc/mxnet · GitHub&i class=&icon-external&&&/i&&/a& 很可能会发现磁盘IO会是瓶颈。当然了,如果是TensorFlow这样慢的,那随意了。鉴于预算只有2W,普通SATA 3的SSD买个大点的就可以了,不需要PCI-E的SSD。配一些普通机械硬盘存储不常用数据。&br&&br&考虑到国内的税率和买东西的花费,我在这里给你配了个例子 &a href=&///?target=http%3A///p/bc6WHx& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/p/bc6W&/span&&span class=&invisible&&Hx&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&就照着类似的配置买,品牌随意但是以稳定为主。可以考虑换成单个Titan X或者双980 Ti,CPU可以酌情弱点,多花钱买硬盘,用Mxnet &a href=&///?target=https%3A///dmlc/mxnet& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&dmlc/mxnet · GitHub&i class=&icon-external&&&/i&&/a&哟~
2W人民币以下估计只能用消费级的硬件配个单机。 1. 深度学习对CPU要求不是很高,多是数据的预处理和给GPU输送数据,普通的i7就差不多,最便宜的E3也可以。 2. 内存至少16GB,如果有富裕的钱差不多可以上32或者64GB。 3. 电源买个850瓦以上的,楼下P500那个…
&p&迁移学习,个人感觉是一种思想吧,并不是一种特定的算法或者模型,目的是将已学习到的知识应用到其他领域,提高在目标领域上的性能,比如说一个通用的语音模型迁移到某个人的语音识别,一个ImageNet上的图片分类问题迁移到医疗疾病识别上。&/p&&p&作为知识的搬运工,下面的内容就要开始盗图大法了,台大李宏毅老师的slides,一个能把ML&DL讲成笑话的男人,非常推荐:&/p&&p&1. 首先,回答第一个问题?Why Transfer Learning?&/p&&p&迁移大法好,无论是语音、图片,还是文本处理,都有迁移学习的应用场景和实例,借助现有学习到的知识,能够很好的解决目标问题;&/p&&br&&img src=&/v2-7c4ae21abed8ef8acf6a_b.png& data-rawwidth=&1410& data-rawheight=&1024& class=&origin_image zh-lightbox-thumb& width=&1410& data-original=&/v2-7c4ae21abed8ef8acf6a_r.png&&&br&&p&2. 回答正题,fine tune和Transfer Learning的关系(经典技法之一吧,适用在source和target中都有标签数据集的情形)&/p&&p&李宏毅老师按照源问题数据集和目标问题数据集是否有标签,可以像下图这样划分,方格中是典型的方法技巧,当然这种分类的标准有很多,像杨强老师早在08年的Trasfer Learning Survey中,就按照domain和task的划分方法,又进一步区分了instance transfer,feature transfer,parameter transfer,knowledge transfer;&/p&&br&&img src=&/v2-fcaf713f373f3f41059f_b.png& data-rawwidth=&1406& data-rawheight=&990& class=&origin_image zh-lightbox-thumb& width=&1406& data-original=&/v2-fcaf713f373f3f41059f_r.png&&&br&&p&3. 具体聊一聊fine tune吧,应用情景是我们在target上有少量的label data,如何有效利用这部分label data,而且还不过拟合呢,我们以NN的角度为例,在原问题中学习到的NN,我们在target上采用保守学习的方式,比如让target和source上的输出尽可能相近,神经网络中间的参数尽可能相近,或者tune的时候,只tune某几层,其他层的参数不发生变化;&/p&&br&&img src=&/v2-b74a86fc76cd60e0cce91_b.png& data-rawwidth=&1370& data-rawheight=&998& class=&origin_image zh-lightbox-thumb& width=&1370& data-original=&/v2-b74a86fc76cd60e0cce91_r.png&&&br&&img src=&/v2-26cf67b53ad6dac55c75b989e28c3f73_b.png& data-rawwidth=&1440& data-rawheight=&984& class=&origin_image zh-lightbox-thumb& width=&1440& data-original=&/v2-26cf67b53ad6dac55c75b989e28c3f73_r.png&&&br&&p&4. 不同领域的问题,在NN上fine tune的经验也不同,语音识别领域一般tune前几层,图片识别问题tune后面几层(背后的哲学,还请大神指点了);&/p&&p&5. 最后举一下迁移学习中的其他技巧吧,比如multi-task learning,怎么说呢?multi-task学习的哲学是同时学,transfer learning的思想是先学习source,在学习target。但技巧还是可以应用的,比如ACL 2015的工作,同时进行多语音的语音识别,效果会好于单独一种语言的识别效果,底层共享神经元,学习到通用特征:&/p&&br&&img src=&/v2-392ce77b235c80df5baa67e71aa0b506_b.png& data-rawwidth=&1462& data-rawheight=&1046& class=&origin_image zh-lightbox-thumb& width=&1462& data-original=&/v2-392ce77b235c80df5baa67e71aa0b506_r.png&&&p&6. Transfer Learning中的其他技巧也都蛮有意思的,比如domain adversarial training,对抗的思想有点像GAN,通过source domain和target domain的数据投影到同一个空间内,再进行学习;&/p&&p&推荐材料:&/p&&p&1. &a href=&///?target=http%3A//kddchina.org/file/IntroTL2016.pdf& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&kddchina.org/file/Intro&/span&&span class=&invisible&&TL2016.pdf&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&2. &a href=&///?target=https%3A//www.cse.ust.hk/%7Eqyang/Docs/2009/tkde_transfer_learning.pdf& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&cse.ust.hk/~qyang/Docs/&/span&&span class=&invisible&&2009/tkde_transfer_learning.pdf&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&3. &a href=&///?target=http%3A//speech.ee.ntu.edu.tw/%7Etlkagk/courses_ML17.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Hung-yi Lee&i class=&icon-external&&&/i&&/a&&/p&&p&4. &a href=&///?target=http%3A//speech.ee.ntu.edu.tw/%7Etlkagk/courses/ML_2017/Lecture/transfer.pdf& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&speech.ee.ntu.edu.tw/~t&/span&&span class=&invisible&&lkagk/courses/ML_2017/Lecture/transfer.pdf&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&
迁移学习,个人感觉是一种思想吧,并不是一种特定的算法或者模型,目的是将已学习到的知识应用到其他领域,提高在目标领域上的性能,比如说一个通用的语音模型迁移到某个人的语音识别,一个ImageNet上的图片分类问题迁移到医疗疾病识别上。作为知识的搬运工…
这里有一篇非常详细的文章,包括硬件的选择,双系统的安装,以及深度学习框架和CUDA环境安装等等——&br&&br&来源: &a href=&///?target=http%3A///blog/en/my-works/building-our-personal-deep-learning-rig-gtx-1080-ubuntu-16-04-cuda-8-0rc-cudnn-7-tensorflowmxnetcaffedarknet/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Build Personal Deep Learning Rig: GTX 1080 + Ubuntu 16.04 + CUDA 8.0RC + CuDnn 7 + Tensorflow/Mxnet/Caffe/Darknet&i class=&icon-external&&&/i&&/a&&br&作者: Guanghan Ning&br&&br&文章的著作权属于我,如果需要转载,请注明来源和作者~
这里有一篇非常详细的文章,包括硬件的选择,双系统的安装,以及深度学习框架和CUDA环境安装等等—— 来源:
作者: Guanghan Ning …
粗看了一下,API跟chainer很像,也是动态构图自动求导的设计。都是日本人搞的,估计有不少交流吧。&br&&br&其实pytorch的API也是跟chainer基本一样,但是chainer没人知道,pytorch火了,心疼chainer小哥1s。。。&br&&br&个人认为chainer的API设计挺不错的,过一阵mxnet也会推出一个类似chainer的高级封装,敬请期待。
粗看了一下,API跟chainer很像,也是动态构图自动求导的设计。都是日本人搞的,估计有不少交流吧。 其实pytorch的API也是跟chainer基本一样,但是chainer没人知道,pytorch火了,心疼chainer小哥1s。。。 个人认为chainer的API设计挺不错的,过一阵mxnet也…
&p&原来用Theano的人应该是偏向做研究而非做工程的人员吧,如果想换框架,虽然一个很直接的想法是转向跟Theano非常相似的Tensorflow,但还是强烈建议选更加适合研究的PyTorch,连Karpathy大神都说好!&/p&&img src=&/v2-1ff394f3d39eb18feaef207_b.jpg& data-rawwidth=&629& data-rawheight=&325& class=&origin_image zh-lightbox-thumb& width=&629& data-original=&/v2-1ff394f3d39eb18feaef207_r.jpg&&&p&&br&&/p&&p&(ps:如果不是做学术而是工程的话也不推荐Tensorflow,MXNet更有前途。)&/p&
原来用Theano的人应该是偏向做研究而非做工程的人员吧,如果想换框架,虽然一个很直接的想法是转向跟Theano非常相似的Tensorflow,但还是强烈建议选更加适合研究的PyTorch,连Karpathy大神都说好! (ps:如果不是做学术而是工程的话也不推荐Tensorflow,MX…
可以。Cornell的全能大神Serge Belongie的组早就发过相关论文了&br&&a href=&///?target=https%3A//arxiv.org/abs/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&[] Residual Networks Behave Like Ensembles of Relatively Shallow Networks&i class=&icon-external&&&/i&&/a&&br&附文中截图一张:&br&&img src=&/v2-694ca0d01a7c155f0e38a3a9d16fd2bb_b.png& data-rawwidth=&1262& data-rawheight=&397& class=&origin_image zh-lightbox-thumb& width=&1262& data-original=&/v2-694ca0d01a7c155f0e38a3a9d16fd2bb_r.png&&至于H的问题,ResNet的每一个module只是个单元,最早是为了解决identity mapping的问题,大致意思就是多堆一层,如果是个完全一样的传递,至少网络结果不该变坏,结果发现网络结果还真是变坏了,所以搞出skip connection一路+学习参数的另一路的这种结构。至于residual的解释,虽然很巧妙,其实比较见仁见智,反正是不如ensemble直观。具体到题主写的解释,没太确定题主的意思,大概和He Kaiming在改进版ResNet里的解释应该是一回事吧,ResNet把一层层堆网络的乘法给转换成带加法性质的网络了,后向传播的稳定性直接提升:&br&&a href=&///?target=https%3A//arxiv.org/abs/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&arxiv.org/abs/&/span&&span class=&invisible&&7&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&不过还是ensemble的解释更对路一些感觉,因为本质上是信息流的传递更多样了,后来基于这种思路蹦出各种通路更复杂的比如FractalNet ,DenseNet,Merge-n-Run FuseNet等等,网络结构越来越……不知道该怎么形容了。其实奇奇怪怪的神经网络结构几十年前就被研究过,可惜那会既没有卷积网络也没有GPU。
可以。Cornell的全能大神Serge Belongie的组早就发过相关论文了
附文中截图一张: 至于H的问题,ResNet的每一个module只是个单元,最早是为了解决identity mapping的…
利益相关:来自于某官方已钦定 TensorFlow 框架的公司,必须匿名&br&&br&前期调研过 MXNet (当时对深度学习不太了解),MXNet 本身的优点确实很多:比如多语言、多设备分布式支持、运行性能之类。&br&&br&根据调研的情况说一下 MXNet “可能”火不起来的原因:&br&&br&1、推广太强,而对应的效果可能还没发挥出来:有一种仅次于Tensorflow的名头(沐神说拍第三第四应该是谦虚),想想有 Amazon、Nvidia 以及余凯等一众大佬站台,这个推广还不强的话,黑人问号脸?&br&&br&2、社区人员经历严重不足,但同时有点避重就轻。像 TensorFlow 核心集中于 C++ 和 Python 的支持,核心人员重点解决主要问题,其他的主要依赖于强大的社区贡献;而 MXNet 却重点宣扬多语言支持,把核心成员本来就较少的精力分散到各语言去了,造成的结果就是看着样样有,但是样样不精。&br&&br&3、框架本身属于开始容易,入门难:简单跑格样例还好,但是目前文档之缺乏和混乱的问题还是很严重的,不过似乎最近在重点改善。我是一点点扒issue和代码才弄明白 CSVIter 根本不能用(然后核心 IO 库里面似乎没有 LibsvmIter),SoftmaxOutput 外怎么定义损失函数,DataIter 怎么写,Metrics 怎么实现,Epoch/Batch结束之后的 callback 怎么写,Operator 怎么实现(其实还没完全弄明白)等等。&br&&br&4、实验效果上有差距,部分模型跑不出state-of-art的效果这个是致命伤,不过既然能做到性能上的优势,这个应该不是大问题,慢慢来吧&br&&br&5、其他比如 TensorFlow 吸引力太强,部分实验室已经绑定在以往比较称手的框架,这些问题暂时是无解的。&br&&br&&br&&br&&br&虽然已弃坑,但还是希望 MXNet 好好发展的,给点建议:&br&1、社区要有主心骨,定一下运营发展蓝图;&br&&br&2、核心人员还是集中精力做框架核心的功能,主动延缓对某些语言和平台的支持(虽然有语言之争,但是觉得既然某些小众语言的社区这么喜欢,他们自己还是会想办法的^_^)&br&&br&3、找人集中整理文档,把入门弄得容易些,至少保证用户从开始跑样例到实现自己想要的网络和损失函数等这个学习过程弄得平缓些。&br&&br&4、据说现在有Amazon等大公司背书了,可以考虑组织点会议多多宣传,邀请部分contributor来报告、给社区title等等福利,国内有些公司和工程师还是很在意这些的,不过我想MXNet社区应该很擅长。&br&&br&5、可以主动联系前端开发的人员来支持可视化,感觉相关社区严重精力过剩,搞一个深度学习的前端框架/库对这个群体来说肯定很有吸引力。
利益相关:来自于某官方已钦定 TensorFlow 框架的公司,必须匿名 前期调研过 MXNet (当时对深度学习不太了解),MXNet 本身的优点确实很多:比如多语言、多设备分布式支持、运行性能之类。 根据调研的情况说一下 MXNet “可能”火不起来的原因: 1、推广太…
关注了一天没有人来回答,正好我之前用的caffe,最近在看torch7的东西,说说我的体会吧。&br&先说说caffe,我用了一年多的caffe,caffe的代码结构非常清晰,这也是我学C++看的第一份代码。如果要在caffe中加新的layer也很简单,基本上就是重载3个函数:setup,forward,backward。&br&使用caffe训练模型基本上就是写写配置文件。另外caffe提供了很多牛人训练号的模型给你玩&a href=&///?target=https%3A///BVLC/caffe/wiki/Model-Zoocaffe& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Home · BVLC/caffe Wiki · GitHub&i class=&icon-external&&&/i&&/a&,caffe围绕cnn做了非常完备的工作,然而,正是因为caffe一开始的是为了实现一个高效的cnn训练框架,所以,也给自身带了一些限制:不能很方便得扩展到其它模型。caffe另外一个缺点就是接口一直没有稳定下来(目前好像还有重构计划),所以,导致我半年前写的代码现在都不能直接用了。这也是导致我学习torch7的原因之一,但不是主要原因。当然,每一个优秀的算法都值得为它实现一个优化的计算框架。&br&再说torch7,理想中我最喜欢的的机器学习的库应该是实现并且优化了基本的计算单元,使用者可以很简单地在此基础上实现自己的算法,不用浪费精力在计算优化上面。而torch7恰好符合这种要求。核心的计算单元使用C或者cuda做了很好的优化。在此基础之上,使用lua构建了常见的模型。另外,torch7构建的是一个生态系统,安装新的模型实现模块只需要luarocks install package. 比如:luarocks install rnn。之后就可以欢乐地使用rnn模型了。有很多学者在torch7的基本单元之上贡献了其它的模型。具体参考&a href=&///?target=https%3A///torch/torch7/wiki/Cheatsheet& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Cheatsheet · torch/torch7 Wiki · GitHub&i class=&icon-external&&&/i&&/a&。torch7的缺点可能就是1. wrapper是lua语言,需要一点时间来学习。2. 优化新的计算单元可能会比较麻烦,backend修改起来会比较麻烦(这一点我不还确定)&br&总结一下:caffe是CNN模型的非常好的框架,方便、易用;torch7是机器学习一个非常好的框架,但是,学习曲线比caffe要陡峭一些。torch7更灵活,能搞定更多的机器学习算法模型。&br&theano没真正用过,我就不说了哈。&br&安利一下mxnet &a href=&///?target=https%3A///dmlc/mxnet& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub - dmlc/mxnet: Lightweight, Portable, Flexible Distributed/Mobile Deep Learning with Dynamic, Mutation-aware Dataflow Dep S for Python, R, Julia, Go, Javascript and more&i class=&icon-external&&&/i&&/a&&br&现在大部分cnn的代码工作都迁移到了mxnet上,源码也摸了一遍,具体的细节部分还得花时间研究。mxnet结合和命令式和声明式编程的有点,既可以对系统做大量的优化,又可以方便调试。资源和计算的调度、内存分配资源管理、数据的表示、计算优化等等都是很值得学习的。&br&使用python wrapper描述网络的时候非常方便,比如residual net使用caffe描述去描述需要几千行,而使用mxnet不到100行代码,而且结构很清晰。并且mxnet是常见的几个dl framework中第一个原生支持分布式训练的。在我看来,mxnet的设计非常优秀。而之所以没有用google家的tensorflow是因为我觉得以我的能力不能完全掌握并且根据需求随心所欲地修改源码。
关注了一天没有人来回答,正好我之前用的caffe,最近在看torch7的东西,说说我的体会吧。 先说说caffe,我用了一年多的caffe,caffe的代码结构非常清晰,这也是我学C++看的第一份代码。如果要在caffe中加新的layer也很简单,基本上就是重载3个函数:setup,f…
目前caffe里面的fp16支持NVIDIA还在写。因为caffe最开始的设计写残了,数据格式的支持是靠C++模板从Net开始一路hard code下来的,所以不是很好一层一层渐进地加fp16支持。简单地说,如果要用fp16,那网络里面所有的层都需要用fp16,那就得一把把所有的层都写好才能测试,这个限制略狠了点。&br&&br&如果你想先简单测试一下performance的话,caffe2里面已经有了CNN当中绝大多数operator的fp16实现,TX1上也是可以编译运行的。当然请不要问我为啥caffe2的开发那么半调子。。。我身在Google,你懂的。
目前caffe里面的fp16支持NVIDIA还在写。因为caffe最开始的设计写残了,数据格式的支持是靠C++模板从Net开始一路hard code下来的,所以不是很好一层一层渐进地加fp16支持。简单地说,如果要用fp16,那网络里面所有的层都需要用fp16,那就得一把把所有的层都…
&p&&a href=&///?target=http%3A///s/1o8mc4YI& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/s/1o8mc4Y&/span&&span class=&invisible&&I&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a& &/p&&p&&a href=&///?target=http%3A///s/1hs23HrA& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/s/1hs23Hr&/span&&span class=&invisible&&A&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&分别是cuDNN v6.0 (April 27, 2017), for CUDA 8.0&/p&&p&for win10 和linux版本,注册和调查真的挺麻烦,网速还慢,故上传方便后来者吧,至少当前最新()。&/p&
分别是cuDNN v6.0 (April 27, 2017), for CUDA 8.0for win10 和linux版本,注册和调查真的挺麻烦,网速还慢,故上传方便后来者吧,至少当前最新()。
已有帐号?
无法登录?
社交帐号登录Batch Normalization 学习笔记 - CSDN博客
Batch Normalization 学习笔记
可参阅:知乎
一、背景意义
本篇博文主要讲解2015年深度学习领域,非常值得学习的一篇文献:《Batch Normalization: Accelerating Deep Network Training by &Reducing Internal Covariate Shift》,这个算法目前已经被大量的应用,最新的文献算法很多都会引用这个算法,进行网络训练,可见其强大之处非同一般啊。
近年来深度学习捷报连连、声名鹊起,随机梯度下架成了训练深度网络的主流方法。尽管随机梯度下降法对于训练深度网络简单高效,但是它有个毛病,就是需要我们人为的去选择参数,比如学习率、参数初始化、权重衰减系数、Drop out比例等。这些参数的选择对训练结果至关重要,以至于我们很多时间都浪费在这些的调参上。那么学完这篇文献之后,你可以不需要那么刻意的慢慢调整参数。BN算法(Batch
Normalization)其强大之处如下:
(1)你可以选择比较大的初始学习率,让你的训练速度飙涨。以前还需要慢慢调整学习率,甚至在网络训练到一半的时候,还需要想着学习率进一步调小的比例选择多少比较合适,现在我们可以采用初始很大的学习率,然后学习率的衰减速度也很大,因为这个算法收敛很快。当然这个算法即使你选择了较小的学习率,也比以前的收敛速度快,因为它具有快速训练收敛的特性;
(2)你再也不用去理会过拟合中drop out、L2正则项参数的选择问题,采用BN算法后,你可以移除这两项了参数,或者可以选择更小的L2正则约束参数了,因为BN具有提高网络泛化能力的特性;
(3)再也不需要使用使用局部响应归一化层了(局部响应归一化是Alexnet网络用到的方法,搞视觉的估计比较熟悉),因为BN本身就是一个归一化网络层;
(4)可以把训练数据彻底打乱(防止每批训练的时候,某一个样本都经常被挑选到,文献说这个可以提高1%的精度,这句话我也是百思不得其解啊)。
开始讲解算法前,先来思考一个问题:我们知道在神经网络训练开始前,都要对输入数据做一个归一化处理,那么具体为什么需要归一化呢?归一化后有什么好处呢?原因在于神经网络学习过程本质就是为了学习数据分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;另外一方面,一旦每批训练数据的分布各不相同(batch
梯度下降),那么网络就要在每次迭代都去学习适应不同的分布,这样将会大大降低网络的训练速度,这也正是为什么我们需要对数据都要做一个归一化预处理的原因。
对于深度网络的训练是一个复杂的过程,只要网络的前面几层发生微小的改变,那么后面几层就会被累积放大下去。一旦网络某一层的输入数据的分布发生改变,那么这一层网络就需要去适应学习这个新的数据分布,所以如果训练过程中,训练数据的分布一直在发生变化,那么将会影响网络的训练速度。
我们知道网络一旦train起来,那么参数就要发生更新,除了输入层的数据外(因为输入层数据,我们已经人为的为每个样本归一化),后面网络每一层的输入数据分布是一直在发生变化的,因为在训练的时候,前面层训练参数的更新将导致后面层输入数据分布的变化。以网络第二层为例:网络的第二层输入,是由第一层的参数和input计算得到的,而第一层的参数在整个训练过程中一直在变化,因此必然会引起后面每一层输入数据分布的改变。我们把网络中间层在训练过程中,数据分布的改变称之为:“Internal
&Covariate&Shift”。Paper所提出的算法,就是要解决在训练过程中,中间层数据分布发生改变的情况,于是就有了Batch&&Normalization,这个牛逼算法的诞生。
二、初识BN(Batch&&Normalization)
就像激活函数层、卷积层、全连接层、池化层一样,BN(Batch Normalization)也属于网络的一层。在前面我们提到网络除了输出层外,其它层因为低层网络在训练的时候更新了参数,而引起后面层输入数据分布的变化。这个时候我们可能就会想,如果在每一层输入的时候,再加个预处理操作那该有多好啊,比如网络第三层输入数据X3(X3表示网络第三层的输入数据)把它归一化至:均值0、方差为1,然后再输入第三层计算,这样我们就可以解决前面所提到的“Internal&Covariate&Shift”的问题了。
而事实上,paper的算法本质原理就是这样:在网络的每一层输入的时候,又插入了一个归一化层,也就是先做一个归一化处理,然后再进入网络的下一层。不过文献归一化层,可不像我们想象的那么简单,它是一个可学习、有参数的网络层。既然说到数据预处理,下面就先来复习一下最强的预处理方法:白化。
2、预处理操作选择
说到神经网络输入数据预处理,最好的算法莫过于白化预处理。然而白化计算量太大了,很不划算,还有就是白化不是处处可微的,所以在深度学习中,其实很少用到白化。经过白化预处理后,数据满足条件:a、特征之间的相关性降低,这个就相当于pca;b、数据均值、标准差归一化,也就是使得每一维特征均值为0,标准差为1。如果数据特征维数比较大,要进行PCA,也就是实现白化的第1个要求,是需要计算特征向量,计算量非常大,于是为了简化计算,作者忽略了第1个要求,仅仅使用了下面的公式进行预处理,也就是近似白化预处理:
公式简单粗糙,但是依旧很牛逼。因此后面我们也将用这个公式,对某一个层网络的输入数据做一个归一化处理。需要注意的是,我们训练过程中采用batch 随机梯度下降,上面的E(xk)指的是每一批训练数据神经元xk的平均值;然后分母就是每一批数据神经元xk激活度的一个标准差了。
三、BN算法实现
1、BN算法概述
经过前面简单介绍,这个时候可能我们会想当然的以为:好像很简单的样子,不就是在网络中间层数据做一个归一化处理嘛,这么简单的想法,为什么之前没人用呢?然而其实实现起来并不是那么简单的。其实如果是仅仅使用上面的归一化公式,对网络某一层A的输出数据做归一化,然后送入网络下一层B,这样是会影响到本层网络A所学习到的特征的。打个比方,比如我网络中间某一层学习到特征数据本身就分布在S型激活函数的两侧,你强制把它给我归一化处理、标准差也限制在了1,把数据变换成分布于s函数的中间部分,这样就相当于我这一层网络所学习到的特征分布被你搞坏了,这可怎么办?于是文献使出了一招惊天地泣鬼神的招式:变换重构,引入了可学习参数γ、β,这就是算法关键之处:
每一个神经元xk都会有一对这样的参数γ、β。这样其实当:
是可以恢复出原始的某一层所学到的特征的。因此我们引入了这个可学习重构参数γ、β,让我们的网络可以学习恢复出原始网络所要学习的特征分布。最后Batch&Normalization网络层的前向传导过程公式就是:
上面的公式中m指的是mini-batch&size。
2、源码实现
m = K.mean(X, axis=-1, keepdims=True)#计算均值
std = K.std(X, axis=-1, keepdims=True)#计算标准差
X_normed = (X - m) / (std + self.epsilon)#归一化
out = self.gamma * X_normed + self.beta#重构变换上面的x是一个二维矩阵,对于源码的实现就几行代码而已,轻轻松松。
3、实战使用
(1)可能学完了上面的算法,你只是知道它的一个训练过程,一个网络一旦训练完了,就没有了min-batch这个概念了。测试阶段我们一般只输入一个测试样本,看看结果而已。因此测试样本,前向传导的时候,上面的均值u、标准差σ&要哪里来?其实网络一旦训练完毕,参数都是固定的,这个时候即使是每批训练样本进入网络,那么BN层计算的均值u、和标准差都是固定不变的。我们可以采用这些数值来作为测试样本所需要的均值、标准差,于是最后测试阶段的u和σ
计算公式如下:
上面简单理解就是:对于均值来说直接计算所有batch u值的平均值;然后对于标准偏差采用每个batch&σB的无偏估计。最后测试阶段,BN的使用公式就是:
(2)根据文献说,BN可以应用于一个神经网络的任何神经元上。文献主要是把BN变换,置于网络激活函数层的前面。在没有采用BN的时候,激活函数层是这样的:
z=g(Wu+b)
也就是我们希望一个激活函数,比如s型函数s(x)的自变量x是经过BN处理后的结果。因此前向传导的计算公式就应该是:
z=g(BN(Wu+b))
其实因为偏置参数b经过BN层后其实是没有用的,最后也会被均值归一化,当然BN层后面还有个β参数作为偏置项,所以b这个参数就可以不用了。因此最后把BN层+激活函数层就变成了:
z=g(BN(Wu))
四、Batch Normalization在CNN中的使用
通过上面的学习,我们知道BN层是对于每个神经元做归一化处理,甚至只需要对某一个神经元进行归一化,而不是对一整层网络的神经元进行归一化。既然BN是对单个神经元的运算,那么在CNN中卷积层上要怎么搞?假如某一层卷积层有6个特征图,每个特征图的大小是100*100,这样就相当于这一层网络有6*100*100个神经元,如果采用BN,就会有6*100*100个参数γ、β,这样岂不是太恐怖了。因此卷积层上的BN使用,其实也是使用了类似权值共享的策略,把一整张特征图当做一个神经元进行处理。
卷积神经网络经过卷积后得到的是一系列的特征图,如果min-batch&sizes为m,那么网络某一层输入数据可以表示为四维矩阵(m,f,p,q),m为min-batch&sizes,f为特征图个数,p、q分别为特征图的宽高。在cnn中我们可以把每个特征图看成是一个特征处理(一个神经元),因此在使用Batch&Normalization,mini-batch&size 的大小就是:m*p*q,于是对于每个特征图都只有一对可学习参数:γ、β。说白了吧,这就是相当于求取所有样本所对应的一个特征图的所有神经元的平均值、方差,然后对这个特征图神经元做归一化。下面是来自于keras卷积层的BN实现一小段主要源码:
input_shape = self.input_shape
reduction_axes = list(range(len(input_shape)))
del reduction_axes[self.axis]
broadcast_shape = [1] * len(input_shape)
broadcast_shape[self.axis] = input_shape[self.axis]
m = K.mean(X, axis=reduction_axes)
brodcast_m = K.reshape(m, broadcast_shape)
std = K.mean(K.square(X - brodcast_m) + self.epsilon, axis=reduction_axes)
std = K.sqrt(std)
brodcast_std = K.reshape(std, broadcast_shape)
mean_update = self.momentum * self.running_mean + (1-self.momentum) * m
std_update = self.momentum * self.running_std + (1-self.momentum) * std
self.updates = [(self.running_mean, mean_update),
(self.running_std, std_update)]
X_normed = (X - brodcast_m) / (brodcast_std + self.epsilon)
brodcast_m = K.reshape(self.running_mean, broadcast_shape)
brodcast_std = K.reshape(self.running_std, broadcast_shape)
X_normed = ((X - brodcast_m) /
(brodcast_std + self.epsilon))
out = K.reshape(self.gamma, broadcast_shape) * X_normed + K.reshape(self.beta, broadcast_shape)
个人总结:2015年个人最喜欢深度学习的一篇paper就是Batch Normalization这篇文献,采用这个方法网络的训练速度快到惊人啊,感觉训练速度是以前的十倍以上,再也不用担心自己这破电脑每次运行一下,训练一下都要跑个两三天的时间。另外这篇文献跟空间变换网络《Spatial Transformer Networks》的思想神似啊,都是一个变换网络层。
参考文献:
1、《Batch Normalization: Accelerating Deep Network Training by &Reducing Internal Covariate Shift》
2、《Spatial Transformer Networks》
本文已收录于以下专栏:
相关文章推荐
转载:http://blog.csdn.net/mrhiuser/article/details/
一:BN的解释:
在训练深层神经网络的过程中, 由于输入层的参数在不停的变化,...
BatchNormalization是神经网络中常用的参数初始化的方法。其算法流程图如下...
我们可以把这个流程图以门电路的形式展开,方便进行前向传播和后向传播......
假设有n个dataset要zhixi
matlab -nodesktop -nodisplay
The CIFAR-10 and CIFAR-100 are labeled subsets of the 80
million tiny images dataset. They were co...
近年来深度学习捷报连连,声名鹊起,随机梯度下架成了训练深度网络的主流方法。尽管随机梯度下降法,将对于训练深度网络,简单高效,但是它有个毛病,就是需要我们人为的去选择参数,比如学习率、参数初始化等,这些...
数据预处理是必要的,这里以MNIST dataset的输入数据预处理为例。
后续增加对文本的预处理说明。
1. 设置随机种子
np.random.seed(1337)
# for repr...
本文装载自
大愚若智_ http://blog.csdn.net/zbc/article/details/
仅用作学习。
机器学习、数据挖掘工作中,数据前期准...
http://keras-cn.readthedocs.io/en/latest/getting_started/concepts/
import numpy as np
基于Theano的深度学习(Deep Learning)框架Keras学习随笔-16-Normalization -- 本篇介绍的内容很少,只有一项就是归一化层。顾名思义就是能够对输入输出进行归一化操...
归一化的具体作用是归纳统一样本的统计分布性。归一化在0-1之间是统计的概率分布,归一化在-1--+1之间是统计的坐标分布。归一化有同一、统一和合一的意思。无论是为了建模还是为了计算,首先基本度量单位要...
他的最新文章
讲师:何宇健
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 android multidex版本 的文章

 

随机推荐