



机器学习应该选择哪种编程语言呢?其实,选择哪种编程语言关系不大,关键是选取编程语言的机器学习库和工具,很多机器学习库支持多种编程语言。目前主流的机器学习开发语言有MATLAB、Python、Java、C++和R。
1.MATLAB
MATLAB是美国MathWorks公司出品的商业数学软件,主要用于算法开发、数据分析、图像处理与计算机视觉、深度学习、信号处理等领域。MATLAB可以应用于机器学习算法的原型设计,开发复杂的解决方案。MATLAB语言的优点是编程简单、效率高、易学易懂,MATLAB规定了矩阵的算术运算符、关系运算符、逻辑运算符等高效方便的矩阵和数组运算。MATLAB语言的缺点是循环运算效率低、封装性不好。图2-1为MATLAB语言的Logo。
图2-1 MATLAB语言的Logo
2.Python
Python是一种跨平台的计算机程序设计语言,是一种高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python语言是由荷兰人吉多·范罗苏姆在ABC语言的基础上开发的。由于具有简洁性、易读性及可扩展性,Python语言已经成为最受欢迎的程序设计语言之一。图2-2为Python语言的Logo。
图2-2 Python语言的Logo
Python的底层是用C语言编写的,很多标准库和第三方库也是用C语言编写的,所以运行速度非常快。Python是开源软件,可以自由发布该软件的副本,阅读软件的源代码,并能对该软件进行改动和发布。由于Python的开源本质,它已经被移植到许多平台上,Python程序无须修改就可以在这些平台上运行。Python是面向对象的高级语言,不需要考虑如何管理程序使用的内存等底层细节,程序是由数据和功能组合而成的对象构建而成的,与其他语言如C++和Java相比,Python以一种非常强大又简单的方式实现了面向对象编程。Python是一种解释型语言,可以边编译边执行,这使得Python更加易于移植。
3.Java
Java是一种面向对象的语言,使用Java语言进行程序开发,需要采用面向对象的思想设计程序和编写代码。Java语言使用虚拟机机制屏蔽了具体平台的相关信息,因而采用Java语言编写的程序只需要生成虚拟机上的目标代码,就可以在多种平台上运行。图2-3为Java语言的Logo。
图2-3 Java语言的Logo
Java语言与C和C++语言类似,但学习起来简单很多,Java语言不使用指针,加入了垃圾回收机制,解决了管理内存的问题,使得编程更加简单。Java语言是多线程的,它支持多个线程同时执行,并提供多线程之间的同步机制。Java语言支持网络应用开发,其基本应用编程接口中就有网络应用编程接口,提供如URL、URLConnection、Socket等类库。
4.C++
1982年,美国贝尔实验室的Bjarne Stroustrup博士在C语言的基础上引入了面向对象的概念,提出了一种新的程序语言C++。C++语言常用于系统层软件开发、服务器程序开发、科学计算等。C++语言简洁、灵活、使用方便,生成的目标代码质量高,程序执行效率高、可移植性好。C++语言支持面向对象的编程机制,如封装函数、抽象数据类型、继承、多态、函数重载和运算符重载。图2-4为C++语言的Logo。
图2-4 C++语言的Logo
5.R
R是一种应用于统计计算和统计绘图的语言和环境,它是属于GNU系统的一个自由、免费、源代码开放的软件。R语言被认为是S语言的一个分支,S语言是由AT&T贝尔实验室开发的一种用来进行数据探索、统计分析和作图的解释型语言。R语言和S语言在语法上几乎一样,只是在函数方面有细微差别。
R语言作为一种统计分析软件,可以运行于UNIX、Windows和Mac OS操作系统上。R语言是一种开放的统计编程语言,其语法通俗易懂,很容易学习和掌握。R语言的函数和数据集保存在程序包中,当程序包被载入时,其内容才能被访问,基本的程序包已经被收入标准安装文件,常见的程序包有base(R语言基础模块)、mle(极大似然估计模块)、ts(时间序列分析模块)、mva(多元统计分析模块)、survival(生存分析模块)等。图2-5为R语言的Logo。
图2-5 R语言的Logo
机器学习关键在于掌握正确的方法,精通机器学习工具有利于处理数据、训练模型和改进算法。目前大量的机器学习工具、平台和软件不断出现,同时出现了很多机器学习框架,这些框架直接跨越开发、测试、优化和生产流程,为开发人员提供了良好的研发捷径。有的框架注重自身的可用性,有的框架侧重于生产部署和参数优化,不同框架有各自的优缺点,常见的机器学习框架有TensorFlow、PyTorch、Keras、Caffe等,下面将对常见的机器学习框架进行简单介绍。
1.TensorFlow
2009年,“神经网络之父”“深度学习鼻祖”Geoffery Hinton提出了一个实现广义反向传播算法的框架,Google公司基于这个框架,试验了新的深度学习算法,使语音识别的错误率降低了25%。2011年,Google Brain内部孵化了一个名为DistBelief的项目,DistBelief是为深度神经网络构建的一个机器学习系统,这个学习系统可以从数百万份YouTube视频中学习猫的关键特征。2015年11月,Google发布了TensorFlow的白皮书并很快将其开源。TensorFlow是Google基于DistBelief研发的第二代人工智能学习系统。图2-6为TensorFlow的图标。
图2-6 TensorFlow的图标
Google官网是这样描述TensorFlow的:TensorFlow是一个采用数据流图(Data Flow Graph),用于数值计算的开源软件库。图2-7为TensorFlow数据流图。在数据流图中,通常用圆、椭圆或方框表示节点,节点代表数学操作(OP),或者数据的输入和输出,或者变量的读取和写入;带箭头的线代表节点之间的输入与输出关系,线就是节点间相互联系的多维数组,即张量(Tensor)。训练模型时,张量会从数据流图中的一个节点流向另一个节点。
图2-7 TensorFlow数据流图
机器学习中的数值类型如表2-1所示。
表2-1 机器学习中的数值类型
张量是什么?简而言之,张量就是一个数据容器,它可以用来表示数字、向量、矩阵等基本数据,还可以表示时间序列、图像、视频等复杂的数据集。图2-8是张量的直观表示。
图2-8 张量的直观表示
下面举一个用4维张量表示数字图像的例子,首先给出Python代码,如图2-9所示。
图2-9 4维张量生成的Python代码
程序输出如图2-10所示。
上面的程序表示模拟生成2张图片,每张图片的大小是2行2列,通道数是3,第一张图片和第二张图片包含的数字信息如图2-11所示(为了简化,假设图片大小是2×2)。
图2-10 程序输出
图2-11 图片包含的数字信息
在TensorFlow中,使用图(Graph)来表示计算任务,在使用TensorFlow时会在图中创建各种节点(Node),节点分为以下三种。
●存储节点:有状态的变量操作,通常用于存储模型参数。
●计算节点:无状态的计算和控制操作,主要负责算法的逻辑或流程的控制。
●数据节点:数据的占位符操作,用于描述图外输入的数据。
TensorFlow具有如下优点。
●TensorFlow采用数据流图,只要计算过程能用一个数据流图表示,就可以使用TensorFlow,它不仅可以用于神经网络算法研究,还可以用于普通的机器学习算法研究。
●TensorFlow可以部署在单CPU计算机、多CPU计算机、单GPU计算机、多GPU计算机上,还可以运行在普通服务器、云服务器、手机移动设备和其他嵌入式设备上。
●使用TensorFlow,只需要定义预测模型的结构,将其和目标函数结合在一起并输入数据,TensorFlow将自动计算相关的微分导数。
●TensorFlow是用C++实现,用Python封装的。可以直接编写Python和C++程序,还可以使用Go、Java、Lua、JavaScript、R等语言。
总之,TensorFlow使用数据流图来表示计算任务,使用Tensor来表示数据,Tensor在数据流图中流动,在TensorFlow中创建节点、运算等行为都称为操作。TensorFlow就是将复杂的数据结构传输至人工智能神经网络中进行分析和处理的系统。
2.PyTorch
PyTorch是一个基于Torch的Python开源机器学习库,用于机器学习、自然语言处理等,它是2017年由Facebook人工智能研究院(FAIR)推出的,它不仅能够实现GPU加速,还支持动态神经网络。图2-12是PyTorch的图标。
图2-12 PyTorch的图标
PyTorch具有以下优点。
●PyTorch采用动态构建模型机制,可以直接修改模型架构,在代码执行过程中出现问题时可以方便地进行调试。
●PyTorch是在深度学习框架Torch的基础上使用Python重写的一个全新的深度学习框架,从它的命名PyTorch就可以看出。PyTorch更像NumPy的替代物,它不仅继承了NumPy的众多优点,而且在计算效率上比NumPy更具优势。
●PyTorch使用了CuDNN加速计算过程,程序核心中张量用C语言实现,程序包小且运行速度快。
●PyTorch被直接内嵌到Python中,允许用户直接使用NumPy、Scipy等工具包,使得程序简洁。
3.Keras
Keras是一个用Python编写的开源神经网络库,可以作为TensorFlow、Microsoft CNTK和Theano的高阶应用程序接口。Keras并不处理张量乘法、卷积等底层操作,这些操作依赖于某种特定、优化良好的张量操作库,称这种库为“后端引擎”。Keras提供了三种后端引擎:TensorFlow、Microsoft CNTK和Theano。Keras由于其对用户友好、高度模块化、可扩展性强,同时支持卷积神经网络和循环神经网络,以及能在CPU和GPU上无缝运行等特点而被广泛应用,图2-13是Keras的图标及后端引擎。
图2-13 Keras的图标及后端引擎
使用Keras搭建一个神经网络有5个步骤,具体如图2-14所示。
Step1:选择模型。Keras核心数据结构是模型(Model),Keras设定了两类深度学习模型,一类是序贯(Sequential)模型,即多个层的线性堆叠,是由API中的层对象堆叠得到的神经网络模型。另一类是函数式模型,其功能是将一个张量指定为输入,另一个张量指定为输出,将输入、输出张量之间存在的节点组合成神经网络模型。
Step2:构建网络层。神经网络由输入层、隐层和输出层三个基本层组成,其中每层可以包括各种网络层,如全连接层、激活层、卷积层、池化层、局部连接层、循环层、嵌入层等。
Step3:编译。网络模型搭建之后,需要对网络的学习过程进行配置,Keras模型的编译由model.compile实现,编译时可以设置优化函数、损失函数及评价函数,并且运行时可将代码翻译为后台代码来执行学习过程。
Step4:训练。模型编译完成后可使用model.fit或model.fit_generator进行学习。
Step5:预测。模型学习完成后可以使用model.evaluate进行模型评估,使用model.predict进行模型测试。
图2-14 使用Keras搭建神经网络的步骤
4.Caffe
Caffe是一种常用的深度学习框架,主要应用于视频、图像处理方面,它由伯克利视觉和学习中心开发。Caffe内核用C++编写,它支持命令行、Python和MATLAB接口,可以在CPU和GPU之间无缝切换,图2-15是Caffe的图标。
图2-15 Caffe的图标
Caffe的主要特点如下。
●采用模块化设计原则,实现对数据格式、网络层和损失函数的扩展。
●Caffe利用Google的Protocol Buffer定义模型文件,使用文本文件prototxt表示网络结构,以有向非循环图形式构建网络。
●Caffe提供了Python和MATLAB接口,使用者可以根据需求选择自己熟悉的语言。
●利用GPU实现计算加速。
除上面介绍的4种机器学习框架外,还有微软的CNTK、蒙特利尔理工学院的Theano、亚马逊的MXNet等国外机器学习框架,如图2-16所示。
图2-16 常见机器学习框架
2020年,中国迎来了机器学习框架的集中爆发。清华大学的计图(Jittor)、旷视的天元(MegEngine)和华为的MindSpore先后问世。除此之外,还有百度的PaddlePaddle(它是国内首个深度学习开源平台)、阿里巴巴的X-DeepLearning、腾讯优图实验室的NCNN等机器学习框架。国内研发的机器学习框架虽然个性还不够强,但已经实现了局部突破,未来可期。