深度学习框架的学习体会
Posted UPCOM
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度学习框架的学习体会相关的知识,希望对你有一定的参考价值。
从去年下半年开始使用深度学习来解决自己的问题,先后尝试了Keras,Theano,MXNet和TensorFlow几种框架,谈一谈对几个框架的看法以及一点感想。
Keras
该框架也是自己使用的第一个框架,对于搭建由标准的卷积、循环模块组成的有监督网络非常方便,支持多输入、多输入,网络权值自动初始化。
优点:集成度比较高,定义的接口比较科学,文档比较全面和实用,学习起来很快,很容易上手。构建一般的深度网络很方便,而且底层使用TensorFlow和Theano实现,可以自定义一些功能。
缺点:灵活性不够,能够自定义的功能比较有限,如果需要构建比较细节的实现还不如直接使用底层实现来完成更直接。
总体评价:易用指数:5星,上手指数:5星,灵活指数:3星,推荐指数:4星。适合初学者来体验DeepLearning,而且可以用于一些对性能要求不高的有监督任务。
Theano
资历比较老的深度学习框架,各种接口比较底层,可以构建各种复杂和精细的网络。
优点:除了性能不是最佳之外,其他方面如同编程语言里面的C语言,支持各种底层操作和一些高级操作,可以用来实现有监督、无监督和强化学习的各种模型。
缺点:学习曲线比较陡峭,上手比较困难,文档虽然全面但是不实用,理解起来比较晦涩。在写模型时,最后需要将计算模型进行封装,特别是封装时需要显示指定各种梯度,对于复杂网络处理起来比较麻烦。
总体评价:易用指数:3星,上手指数:3星,灵活指数:5星,推荐指数:3星。中规中矩的一种框架,可以用来做研究。
MXNet
可以使用符号计算和命令式计算的一种框架(详细内容见:http://mxnet.io/architecture/program_model.html),性能比较好,支持分布式和多GPU扩展,是亚马逊官方指定使用的框架。网络的参数可以自动初始化,而且支持多种初始化方法。
优点:文档比较全和实用,学习起来比较容易。运行速度比较快,扩展性比较强,能够部署在一些分布式的多GPU集群上。既有高层的模型,也有底层的实现,构建简单网络快,也能构建一些相对的复杂的网络,可以用在有监督、监督和强化学习多种任务下。
缺点:模型在运行的时候需要进行封装,子模型无法有效的集成到大模型中。提供的接口还不够全面,有些操作无法实现。当网络需要在多批数据运行之后再进行权值更新时,需要手动将梯度进行合成,处理起来比较复杂。
总体评价:易用指数:5星,上手指数:5星,灵活指数:4星,推荐指数:4星。在已经接触的框架中,更适合部署在生产环境中。
TensoFlow
目前最火的一种框架,也是使用非常广泛的一种框架,相关学习资料和资源比较多。
优点:学习起来比较方便,上手比较快。全部使用符号来构建网络,定义了各种底层操作,同时也有一些高层的容器,构建复杂计算图比较方便。使用名称范围来对子模块进行限定,方便复用。可以显示指定需要优化的参数,因此能够冻结不需要优化的子模块。
缺点:网络的参数需要显示指定,还要定义初始化方法,比较麻烦。而且与其他框架比性能,运行速度比较慢(网上有很多文章,也有人专门写了评测论文)。从目前发布的版本来看,存在向上不兼容的问题。
总体评价:易用指数:5星,上手指数:5星,灵活指数:5星,推荐指数:5星。适合学生使用的一款深度学习框架。
个人的学习经历
离开校园多年,重新回来学习,选择了使用比较方便的Python,在选择深度学习框架时也比较倾向于与Python结合比较好的,就没有考虑过Torch和Caffe。而且感觉在做研究时,与其学各种框架,然后去读别人提供的各种代码,不如充分掌握好一种趁手的框架,自己动手实现各种有价值的想法,在实现的过程中更能把握住细节,更容易发现创新点。
最开始用的是Keras,但是发现其对网络的细节调整起来比较麻烦,需要掌握底层的支持(TensorFlow和Theano),相对于TF,Theano更加稳定和成熟,而且TF的运行效率比较低,因此转到Theano的学习上来了。
Theano与Python结合非常好,接口比较稳定,但是学了一两个月,感觉学起来比较困难,雾里看花根本没有入门。
刚好去年推出了MXNet,而且亚马逊官方采用了,各种性能评测和评价也都比较好,就开始转到MXNet上。通过学习,已经能够构建一些相对复杂的网络结构,并能够对细节进行设计。但最近在实现改进版的WGAN算法时,遇到了总体损失很难传到子模型中去的问题,反复查资料,折腾了好天多没有找到好的解决方案。
在网上找资料的时候,github上有人用TensorFlow实现了该算法,然后把代码找下来一看,发现TF比MXNet在梯度计算上有一些优势。据我掌握的知识,在MXNet中,要得到相对于输入的梯度,必须进行反向运算才能得到(在官方文档中有grad(w.r.t.)的接口,但是没有实现),而TF中可以直接定义从一个计算子图中获得相对于某个输入的梯度,从而集成到整张计算图中。参照别人的例子,自己写了一个改进版的WGAN算法,发现TF使用起来确实比较方便。
个人的感悟
回想一下,自己在框架选择上走了一些弯路,选择Keras起步应该算是比较正确的选择,而且实现了小论文的实验。而在是否选择TensoFlow的问题上,一直诟病于其运行效率的问题。现在仔细想一下,效率这个问题是多方面的,对于学生来说,效率应该更多的体现在写Code的速度上,就是尽快把自己的想法表达出来,然后可以去想其他的事情,就像使用基于Python的框架而不是C来写深度学习的代码一样。运行速度比较慢的问题,完全可以通过升级硬件或者租用服务器来解决,而且我们的问题远没有到那个规模。
以上是关于深度学习框架的学习体会的主要内容,如果未能解决你的问题,请参考以下文章