第2章 图像识别前置技术
主流的深度学习平台、如何搭建本书推荐的开发环境以及图像识别的前置技术Numpy。图像处理的大部分场景都需要将图像转换成向量(或者矩阵)以便于进行后续的图像识别处理。
Numpy包中提供了非常好的矩阵运算,因此,学习并掌握Numpy,在后续的图像识别学习中会起到重要作用。
2.1 深度学习框架
近几年,深度学习技术的大爆炸式发展,除了理论方面的突破外,还有基础架构的突破,这些都奠定了深度学习繁荣发展的基础。
2.1.1 Theano
Theano是一个Python库,可用于定义、优化和计算数学表达式,特别是多维数组(numpy.ndarray)。
Theano可以高效地运行于GPU或CPU中。
随着Tensorflow在Google的支持下强势崛起,Theano日渐式微,使用Theano的人也越来越少。
对于深度学习新手,可以使用Theano来练手;但对于职业开发者,建议使用Tensorflow。
2.1.2 Tensorflow
Tensorflow编程接口支持Python和C++。随着1.0版本的公布,Java、Go、R和Haskell API的alpha版本也得到支持。
Tensorflow还可在Google Cloud和AWS中运行。
Tensorflow还支持Windows 7、Windows 10和Windows Server 2016。
由于Tensorflow使用C++Eigen库,所以库可在ARM架构上进行编译和优化。这也就意味
着用户可以在各种服务器和移动设备上部署自己的训练模,而无须执行单独的模型解码器或者加载Python解释器。
作为当前最流行的深度学习框架,Tensorflow获得了极大成功,但在学习过程中读者需要注意下面这些问题。
·由于Tensorflow的接口一直处于快速迭代之中,并且版本之间存在不兼容的问题,因此开发和调试过程中可能会出现一些问题(许多开源代码无法在新版的Tensorflow上运行)。
·想要学习Tensorflow底层运行机制的读者需要做好准备,Tensorflow在GitHub代码仓库的总代码量超过100万行,系统设计比较复杂,因此这将是一个漫长的过程。
·代码层面,对于同一个功能,Tensorflow提供了多种实现,这些实现良莠不齐,使用中还存在细微的区别,请读者注意,避免入坑。
另外,Tensorflow还创造了图、会话、命名空间、PlaceHolder等诸多抽象概念,对普通用户来说可能会难以理解。
Tensorflow已经成为当今最为热门的深度学习框架,虽不完美但是最流行,目前,各公司使用的框架也不统一,读者有必要多学习几个流行框架以作为知识储备,Tensorflow无疑是一个不错的选择。
2.1.3 MXNet
MXNet是亚马逊(Amazon)的李沐带队开发的深度学习框架。
它拥有类似于Theano和Tensorflow的数据流图,为多GPU架构提供了良好的配置,有着类似于Lasagne和Blocks的更高级别的模型构建块,并且可以在你想象的任何硬件上运行(包括手机)。
对Python的支持只是其功能的冰山一角,MXNet同样提供了对R、Julia、C++、Scala、Matlab、Golang和Java的接口。
MXNet以其超强的分布式支持,明显的内存、显存优化为人所称道。同样的模型,MXNet往往占用更小的内存和显存,并且在分布式环境下,MXNet展现出了明显优于其他框架的扩展性能。
MXNet的缺点是推广不给力及接口文档不够完善。MXNet长期处于快速迭代的过程中,其文档却长时间未更新,这就导致新手用户难以掌握MXNet,老用户则需要常常查阅源码才能真正理解MXNet接口的用法。
MXNet文档比较混乱导致其不太适合新手入门,但其分布性能强大,语言支持比较多,比较适合在云平台使用。
2.1.4 Keras
Keras是一个高层神经网络API,由纯Python语言编写而成,并使用Tensorflow、Theano及CNTK作为后端。Keras为支持快速实验而生,能够将想法迅速转换为结果。
Keras应该是深度学习框架之中最容易上手的一个,它提供了一致而简洁的API,能够极大地减少一般应用下用户的工作量,避免用户重复造轮子,而且Keras支持无缝CPU和GPU的相互转换。
为了屏蔽后端的差异性,Keras做了层层封装,导致用户在新增操作或是获取底层的数据信息时过于困难。
同时,过度封装也使得Keras的程序过于缓慢,许多bug都隐藏于封装之中。另外就是学习Keras十分容易,但是很快就会遇到瓶颈,因为它缺少灵活性。
另外,在使用Keras的大多数时间里,用户主要是在调用接口,很难真正学习到深度学习的内容。
Keras比较适合作为练习使用的深度学习框架,但 是因为其过度的封装导致并不适合新手学习(无法理解深度学习的真正内涵),故不推荐。
2.1.5 PyTorch
PyTorch是一个Python优先的深度学习框架,能够在强大的GPU加速的基础上实现张量和动态神经网络。
PyTorch是一个Python软件包,其提供了两种高层面的功能,具体如下。
1)使用强大的GPU加速的Tensor计算(类似于Numpy)。
2)构建基于tape的autograd系统的深度神经网络。
3)活跃的社区:PyTorch提供了完整的文档,循序渐进的指南,作者亲自维护论坛以供用户交流和求教问题。
Facebook人工智能研究院(FAIR)对PyTorch提供了强力支持,作为当今排名前三的深度学习研究机构,FAIR的支持足以确保PyTorch获得持续的开发更新,而不至于像许多由个人开发的框架那样昙花一现。
如有需要,你也可以复用你喜欢的Python软件包(如Numpy、scipy和Cython)来 扩展PyTorch。
相对于Tensorflow,PyTorch的一大优点是,它的图是动态的,而Tensorflow等都是静态图,不利于扩展。
同时,PyTorch非常简洁,方便使用。本书将选取PyTorch作为图像识别的主要实现框架。
如果说TensorFlow的设计是“Make It Complicated”,Keras的设计是“Make It Complicated And Hide It”,那么PyTorch的设计真正做到了“Keep it Simple,Stupid”。
2.1.6 Caffe
Caffe是基于C++语言编写的深度学习框架,作者是中国人贾杨清。它开放源码(具有Licensed BSD),提供了命令行,以及Matlab和Python接口,清晰、可读性强、容易上手。
Caffe存在不支持多机、跨平台、可扩展性差等问题。
Caffe2在工程上做了很多优化,比如运行速度、跨平台、可扩展性等,它可以看作是Caffe更细粒度的重构,但在设计上,其实Caffe2与TensorFlow更像。目前代码已开源。
网友评论