如果您正在开始一个新的机器学习或深度学习项目,那么您可能会对选择哪种框架感到困惑。 正如我们将要讨论的,这两种项目都有几个不错的选择。
机器学习框架和深度学习框架之间有区别。 本质上,机器学习框架涵盖了用于分类,回归,聚类,异常检测和数据准备的多种学习方法,并且可能包括或可能不包括神经网络方法。
深度学习或深度神经网络框架涵盖具有许多隐藏层的各种神经网络拓扑。 Keras , MXNet , PyTorch和TensorFlow深学习框架。 Scikit-learn和Spark MLlib是机器学习框架。 (单击前面的任何链接,以阅读我对产品的独立评论。)
通常,深度神经网络计算在GPU(特别是Nvidia CUDA通用GPU),TPU或FPGA(而不是CPU)上的运行速度要快得多。 通常,较简单的机器学习方法无法从GPU中受益。
虽然您可以在一个或多个CPU上训练深度神经网络,但是训练往往会很慢,而我所说的并不是说几秒钟或几分钟。 需要训练的神经元和层越多,训练可用的数据越多,花费的时间就越长。 当Google Brain团队在2016年为新版本的Google Translate训练其语言翻译模型时,他们一次在多个GPU上运行了一周的培训课程。 如果没有GPU,则每个模型训练实验都将花费数月的时间。
从那时起,英特尔数学内核库(MKL)使得在合理的时间内训练CPU上的某些神经网络成为可能。 同时,GPU,TPU和FPGA的速度更快。
在相同GPU上运行的所有深度学习软件包的训练速度几乎相同。 这是因为训练内循环将大部分时间都花在Nvidia CuDNN程序包中。
除了训练速度之外,每个深度学习库都有自己的优缺点,Scikit-learn和Spark MLlib也是如此。 让我们潜入。
Keras是用于构建神经网络模型的高级前端规范和实现,该模型附带对三个后端深度学习框架(TensorFlow,CNTK和Theano)的支持。 亚马逊目前正在为Keras开发MXNet后端。 也可以将PlaidML (一个独立项目)用作Keras的后端,以利用对所有GPU的PlaidML的OpenCL支持。
TensorFlow是Keras的默认后端,也是许多使用案例的推荐后端,其中包括通过CUDA和cuDNN在Nvidia硬件上进行GPU加速,以及在Google Cloud中进行TPU加速。 TensorFlow还包含一个内部tf.keras
类,与外部Keras安装分开。
Keras具有高级环境,可以像在其顺序模型中的一行代码一样轻松地向神经网络添加一层,并且只需调用一个函数即可编译和训练模型。 Keras允许您使用其Model或功能性API在较低的层次上工作。
Keras允许您通过子类keras.Model
进一步降低到Python编码级别,但是在可能的情况下更喜欢功能性API。 Keras还具有scikit-learn
API,因此您可以使用Scikit-learn网格搜索在Keras模型中执行超参数优化。
费用:免费开源。
平台: Linux,MacOS,Windows或Raspbian; TensorFlow,Theano或CNTK后端。
阅读我对Keras的评论 。
自2017年初移交给Apache软件基金会(Apache Software Foundation)以来, MXNet进行了相当多的发展和改进。尽管在具有MXNet后端的Keras上已开展了许多工作,但不同的高级界面变得更加重要: Gluon 。 在合并Gluon之前,您可以在MXNet中编写简单的命令式代码或快速的符号代码,但不能同时编写两者。 借助Gluon,您可以与Keras和PyTorch竞争,从而融合两全其美。
Gluon声称的优势包括:
这四个优点以及广泛的模型示例集使Gluon / MXNet与Keras / TensorFlow和PyTorch大致相等,从而简化了开发和训练速度。 您可以在Gluon主页上看到每个代码示例,并在Gluon API的概述页面上重复这些代码示例。
Gluon API包括用于神经网络层,递归神经网络,损失函数,数据集方法和视觉数据集的功能,模型动物园以及一组有用的实验神经网络方法 。 您可以将Gluon与标准MXNet和NumPy模块(例如module
, autograd
和ndarray
)以及Python控制流自由组合。
Gluon有很多用于构建模型的层可供选择,包括基础层(密集层,Dropout等),卷积层,池化层和激活层。 这些都是一个单线呼叫。 这些可以在其他网络容器(例如gluon.nn.Sequential()
。
费用:免费开源。
平台: Linux,MacOS,Windows,Docker,Raspbian和Nvidia Jetson; Python,R,Scala,Julia,Perl,C ++和Clojure(实验性)。 MXNet包含在AWS Deep Learning AMI中。
阅读我对MXNet的评论 。
PyTorch基于旧的Torch和新的Caffe2框架。 您可能会从名称中猜到,PyTorch使用Python作为其脚本语言,并且使用了经过改进的Torch C / CUDA后端。 Caffe2的生产功能已合并到PyTorch项目中。
PyTorch被誉为“具有强大GPU加速功能的Python中的张量和动态神经网络”。 这意味着什么?
张量是一种数学构造,在物理学和工程学中大量使用。 二阶张量是一种特殊的矩阵。 取一个带有张量的向量的内积会产生另一个具有新大小和新方向的向量。 TensorFlow的名字来自于张量(具有突触权重)在其网络模型中的流动方式。 NumPy还使用张量,但将它们称为ndarray
。
GPU加速是大多数现代深度神经网络框架的要求。 动态神经网络可以在迭代之间变化,例如允许PyTorch模型在训练过程中添加和删除隐藏层,以提高其准确性和通用性。 PyTorch会在每个迭代步骤动态地重新创建图形。 相反,TensorFlow默认情况下会创建一个数据流图,优化图代码的性能,然后训练模型。
在TensorFlow中, 急切的执行模式是一个相当新的选项,但这是PyTorch运行的唯一方式:API调用在调用时执行,而不是添加到图形中以供稍后运行。 看来它的计算效率会降低,但是PyTorch就是按照这种方式工作的,并且在训练或预测速度上也不是懈怠。
PyTorch集成了加速库,例如Intel MKL和Nvidia cuDNN和NCCL(Nvidia集体通信库),以最大化速度。 它的核心CPU和GPU Tensor和神经网络后端(TH(火炬),THC(火炬CUDA),THNN(火炬神经网络)和THCUNN(火炬CUDA神经网络))被编写为具有C99 API的独立库。 同时,PyTorch并不是绑定到整体C ++框架中的Python,其目的是将其与Python深度集成,并允许使用其他Python库。
费用:免费开源。
平台: Linux,MacOS,Windows; CPU和Nvidia GPU。
阅读我对PyTorch的评论 。
Scikit-learn Python框架提供了多种强大的机器学习算法,但没有深度学习。 如果您是Python爱好者,那么Scikit-learn可能是普通机器学习库中最适合您的选择。
Scikit-learn是一个健壮且久经考验的Python机器学习库,其中包含各种完善的算法和集成的图形。 它相对容易安装,学习和使用,并且有很好的示例和教程。
从另一方面来说,Scikit-learn不涉及深度学习或强化学习,缺少图形模型和序列预测,并且除Python外,它实际上不能用于其他语言。 它不支持PyPy,Python即时编译器或GPU。 就是说,除了它不大涉足神经网络之外,它实际上并没有速度问题。 它使用Cython(Python到C编译器)执行需要快速执行的功能,例如内部循环。
Scikit-learn为分类,回归,聚类,降维,模型选择和预处理提供了很好的算法选择。 它为所有这些提供了很好的文档和示例,但是缺少用于完成这些任务的任何指导性工作流程。
Scikit-learn的易于开发性赢得了最高评价,主要是因为这些算法均按文档所述工作,API一致且设计合理,并且数据结构之间几乎没有“阻抗不匹配”。 很高兴与一个库一起使用,该库的功能已被充分充实并且其错误已被彻底清除。
另一方面,该库没有涵盖深度学习或强化学习,从而排除了当前困难但重要的问题,例如准确的图像分类和可靠的实时语言解析和翻译。 显然,如果您对深度学习感兴趣,则应该去其他地方。
但是,仍然存在许多问题,从建立链接不同观察值的预测功能到对观察值进行分类,再到学习未标记数据集的结构,这些问题使他们无需进行几十层神经元就能进行简单的旧机器学习,在这些领域Scikit-learn确实非常好。
费用:免费开源。
平台:需要Python,NumPy,SciPy和Matplotlib。 发行版适用于MacOS,Linux和Windows。
阅读我对Scikit-learn的评论 。
Spark MLlib是Apache Spark的开源机器学习库,提供了常见的机器学习算法,例如分类,回归,聚类和协作过滤(但不包括深度神经网络)。 它还包括用于特征提取,变换,降维和选择的工具; 用于构建,评估和调整机器学习管道的工具; 以及用于保存和加载算法,模型和管道 ,用于数据处理以及进行线性代数和统计的实用程序。
Spark MLlib用Scala编写,并使用线性代数程序包Breeze。 Breeze依靠netlib-java进行优化的数值处理,尽管在开源发行版中这意味着对CPU的优化使用。 Databricks提供了使用GPU的自定义Spark集群,可以潜在地为您提供10倍的速度提升,以训练具有大数据的复杂机器学习模型。
Spark MLlib实现了大量用于分类和回归的通用算法和模型,以至于新手可能会感到困惑,但是专家最终可能会为要分析的数据找到一个很好的模型选择。 在众多模型中,Spark 2.x增加了超参数调整的重要功能,也称为模型选择。 通过超参数调整,分析人员可以设置参数网格,估计器和评估器,然后让交叉验证方法(既费时又准确)或训练验证拆分方法(更快但不太准确)找到最佳的模型。数据。
Spark MLlib拥有适用于Scala和Java的完整API,适用于Python的大多数完整API和适用于R的粗略部分API。通过计算以下示例,您可以很好地了解覆盖范围:54个Java和60个Scala机器学习示例,52个Python机器学习实例,只有五个R实例。 以我的经验,Spark MLlib是使用Jupyter笔记本电脑最容易的工作,但是,如果您处理冗长的Spark状态消息,则可以肯定地在控制台中运行它。
Spark MLlib通过基本的机器学习,功能选择,管道和持久性提供了几乎任何您想要的东西。 它在分类,回归,聚类和过滤方面做得很好。 鉴于它是Spark的一部分,因此可以很好地访问数据库,流和其他数据源。 另一方面,Spark MLlib并未真正以与TensorFlow,PyTorch,MXNet和Keras相同的方式来建立和训练深度神经网络。
费用:免费开源。
平台: Spark可以在Windows和类似Unix的系统(例如Linux,MacOS)上运行,具有Java 7或更高版本,Python 2.6 / 3.4或更高版本以及R 3.1或更高版本。 对于Scala API,Spark 2.0.1使用Scala 2.11。 Spark需要Hadoop / HDFS。
阅读我对Spark MLlib的评论 。
From: https://www.infoworld.com/article/3163525/the-best-machine-learning-and-deep-learning-libraries.html