TensorFlow VS. PyTorch

本文来源自斯坦福大学计算机科学博士生 Awni Hannun 发表的文章,对比当前两个深度学习主流框架:TensorFlowPytorch 之间的差异。整体而言:

PyTorch 更适合于在研究中快速进行原型设计、业余爱好者和小型项目;而 TensorFlow 则更适合大规模的调度,尤其当考虑到跨平台和嵌入式调度操作时。细分对比如下 ——

准备时间 –> PyTorch

PyTorch 实际上是 NumPy 的替代,它支持 GPU,有着更高级的功能,可以用来构建和训练深度神经网络。如果你熟悉 NumPy、Python 和常见的深度学习概念(卷积层、递归层、SGD 等),那么学习 PyTorch 对你来说会很容易。

而 TensorFlow 则可以看成是一种嵌入 Python 的编程语言。当你在编写 TensorFlow 代码时,它们会通过 Python 编译成一张图,然后由 TensorFlow 执行引擎运行。我看到过刚使用 TensorFlow 的人因为这个额外的间接层而苦思冥想。也因为如此,想用 TensorFlow 还需要学一些额外的概念,比如会话、图、变量作用域和占位符等。要运行基本模型,还需要更多的样板代码。使用 TensorFlow 的前期准备时间肯定比 PyTorch 要长。

图创建和调试 –> PyTorch

创建和运行计算图可能是这两个框架最大的不同。在 PyTorch 中,图架构是动态的,这意味着图是在运行时创建的。而在 TensorFlow 中,图架构是静态的,这意味着先编译出图然后再运行。

PyTorch 中简单的图架构更容易推导,或许更重要的一点是,它更容易调试。调试 PyTorch 代码如同调试 Python 代码,可以使用 pdb 并在任何地方设置断点。而调试 TensorFlow 代码并不那么容易,你有两个选择,一是请求会话中你想要检查的变量,二是学习和使用 TensorFlow 调试器(tfdbg)。

覆盖率 –> TensorFlow

PyTorch 在逐渐发展,两者之间的差距会缩小到零。然而,目前仍有一些 TensorFlow 支持但 PyTorch 不支持的功能,如:

  • 沿着维度翻转张量(np.flip, np.flipud, np.fliplr)
  • 检查张量是空值还是无限值(np.is_nan, np.is_inf)
  • 快速傅里叶变换(np.fft)

此外,TensorFlow 的 contrib 包中有更多比 PyTorch 更高级的函数和模型。

序列化 –> TensorFlow

在这两种框架下保存和加载模型都很简单。

PyTorch 有一个特别简单的 API,既可以保存模型的所有权重,也可以 pickle 全部类。

TensorFlow 的 Saver 对象也很容易使用,并为检查点(check-pointing)提供了更多选择。在序列化中 TensorFlow 的主要优点是可以将整个图保存为协议缓冲区。这包括参数和运算。此外,该图可以通过其他支持的语言(C++,Java)加载。这对不支持 Python 的调度栈来说至关重要。理论上,在改变模型源代码之后,你想要运行旧模型时它也能有所帮助。

部署 –> TensorFlow

对于小规模的服务器端部署,两个框架都很容易封装在诸如 Flask web 服务器中。不过,TensorFlow 支持移动和嵌入式部署。可以确定的说,这比包括 PyTorch 在内的大多数深度学习框架支持功能的都要多。将 TensorFlow 部署到 Android 或 iOS 上确实需要大量的工作,但至少你不必用 Java 或 C++ 重写模型的整个推理程序。

文档 –> SAME

两种框架的文档中都能找到需要的东西。Python 的 API 在两个框架中都有良好的文档记录,并且有足够的例子和教程来学习这两种框架。一个比较边缘的问题是,PyTorch 的 C 语言库大多是无文档记录的,不过这只影响到编写定制的 C 语言扩展程序,而且这种操作是否有助于软件还存疑。

数据加载 –> PyTorch

PyTorch 中用于数据加载的 API 设计得很好。接口在数据集、采样器和数据加载器中有明确规定。数据加载器接收数据集和采样器,根据采样器的调度,在数据集上生成迭代器。加载并行数据就像把  num_workers 语句传递到数据加载器一样简单。

在 TensorFlow 还没发现特别有用的加载数据的工具,例如 readers, queues, queue runners 等,都不够好。部分原因是因为将想要运行的所有预处理代码添加到 TensorFlow 图中并不总是直接的,例如计算时频谱(spectrogram)。而且,API 本身更繁琐,更难以学习。

设备管理 –> TensorFlow

TensorFlow 管理设备时的无缝性非常好。通常不需要规定任何东西,因为默认已经设好了。例如,如果 GPU 可用,TensorFlow 将默认在 GPU 上运行。在 PyTorch 中,即使支持 CUDA,都必须明确地将所有东西移到设备上。

TensorFlow 设备管理的唯一缺点是,即使你只使用一个 GPU 它也会默认占用所有 GPU 的显存。简单的解决方法是用 CUDA_VISIBLE_DEVICES 语句指定显卡。但有时会忘了设置,所以当 GPU 实际上处于空闲状态时,会显示内存不足。

在 PyTorch 中,代码需要更频繁地检查 CUDA 的可用性和更明确的设备管理,当编写能够同时在 CPU 和 GPU 上运行的代码时尤甚。另外,将 GPU 上的 PyTorch Variable 转换为 NumPy 数组有点繁琐。

自定义扩展 –> PyTorch

在这两种框架中都可以用 C 语言、C++ 或 CUDA 构建或绑定自定义扩展。但 TensorFlow 需要更多的样板代码,即使它支持多种类型和设备。

在 PyTorch 中,只需为每个 CPU 和 GPU 版本编写一个接口和相应的实现。用这两种框架来编译扩展都很直接,并且不需要下载除了 pip 安装包之外的任何头文件或源代码。

TensorFlow 与 PyTorch 入门课件

最后,香港科技大学发布了 TensorFlow 与 Pytorch 两个框架的快速入门课件,以供科研学习者参考。

GitHub地址项目GitHub地址

scikit-learn算法工程导图

scikit-learn 算法工程导图

ScikitsSciPy堆栈 的附加软件包,专门用于图像处理和机器学习等特定功能。 就机器学习而言,这些堆栈中最为突出的就是 scikit-learn。 该软件包构建在 SciPy 的顶部,并大量使用其数学运算。

scikit-learn 为常见的机器学习算法(包括:分类,回归,聚类,降维等)提供了一个简洁而一致的界面,使得将机器学习带入生产系统变得简单。基于NumPySciPyMatplotlib 构建,同时提供开源及商业使用许可证,可供所有人在任何环境下重复使用。该 Python 库结合了高质量的代码和良好的文档,易用性和高性能。事实上,scikit-learn 已经成为用 Python 进行机器学习的行业标准。

解决机器学习问题,最难的部分往往是找到合适的算法。不同的算法往往针对不同类型的数据和不同的问题而设计。这张机器学习算法工程导图,将成为你选择合适的算法处理特定数据问题有效指导。

GitHub地址项目GitHub地址

Python数据科学核心库

数据科学解决方案公司 ActiveWizards,根据自身应用开发经验,总结了数据科学家和工程师 2017 年最常使用的 Python 库,以下是数据科学核心库部分:

NumPy

当使用 Python 开始处理科研任务时,不可避免地需要求助 Python 的 SciPy 堆栈,它是专门为 Python 中的科学计算而设计的软件集合。这个堆栈相当庞大,其中有十几个库,所以我们需要聚焦在最重要的核心包上。

NumPy(代表 Numerical Python)是构建科学计算堆栈的最基础的包。它为 Python 中的 N 维数组和矩阵的操作提供了大量有用的功能。该库还提供了 NumPy 数组类型的数学运算向量化,可以提升性能,从而加快执行速度。

SciPy

SciPy 是一个工程和科学软件库。除此以外,你还要了解 SciPy 堆栈和 SciPy 库之间的区别。SciPy 包含线性代数、优化、集成和统计的模块。SciPy 库的主要功能建立在 NumPy 的基础之上,因此它的数组大量使用了 NumPy。它通过其特定的子模块提供高效的数值例程操作,比如数值积分、优化和许多其他例程。SciPy 的所有子模块中的函数都有详细的文档,这也是一个优势。

Pandas

Pandas 是一个 Python 包,旨在通过「标记(Labeled)」和「关系(Relational)」数据进行工作,简单直观。Pandas 是 Data Wrangling 的完美工具。它设计用于快速简单的数据操作、聚合和可视化。

如果你是正在学习 Python 的学生或科研工作者,将能帮助你更好地找到学习的重心及科研方向。同时,由于所有的 python 库都是开源的,根据过去6周,三大Python核心库GitHub下载请求统计,我们能进一步了解每个 Python 库流行度的指标。

最佳开源机器学习工具库:Kubeflow

随着 TensorFlow 的发布开源,面向开源软件的机器学习科研活动变得越来越活跃,已成为机器学习最佳选择。同时:

  • 机器学习与深度学习框架,已经成为软件工程师的标准配置;
  • 随着 arXiv 变得越来越流行,很多论文在国际会议同行评审前就已经被发布。
    因此,让企业能更快的验证最新科研算法;
  • 越来越多的研究员都在开始研究机器学习,学院内的机器学习科研领域逐渐变为红海;
  • 创建一个最佳算法,但如何部署实现却是秘密 —— 这种保守观念已经过时;

同时,Kubernetes 已经迅速成为在任何地方部署复杂工作负载的混合解决方案。从无状态服务开始,科研机构与企业已逐步开始将复杂的工作负载转移到该平台上,充分利用 Kubernetes 提供的丰富的 API,可靠性和性能。其中,发展最为显著的领域非机器学习莫属。

然而,构建任何企业级机器学习系统,都涉及各种组件,通常是厂家组件加上手动配置的混合解决方案。要连接和管理这些服务,甚至涉及稍微复杂的设置,都会对采用这些机器学习应用带来了巨大的复杂障碍。基础设施工程师通常需要大量时间进行手动调整与部署对应的解决方案,然后才能测试单个模型。

更糟糕的是,这些操作与他们部署的集群紧密相关,以至于堆栈不可移动。这意味着:如果没有重新架构,将一个机器学习模型从笔记本电脑迁移到高度可扩展的云集群上,实际上是不可能的。所有这些差异耗费大量的精力,并为每次架构转换引入错误的机会。

为了应对这些挑战,Google 发布了:

Kubeflow 机器学习工具库,致力于使运行在 Kubernetes 上的机器学习变的更轻松、便捷和可扩展;Kubeflow 的目标不是重建其他服务,而是提供一种简便的方式找到最好的 OSS 解决方案。

因此,Kubeflow 的主要目标为:

  • 在不同的基础设施上实现简单、可重复的敏捷部署,如:
    (笔记本<-> 机器学习装备 <-> 训练集群 <-> 生产集群)
  • 部署和管理松散耦合的微服务
  • 根据需求进行扩展

最后,你可以利用 Katacoda 提供的演示环境,体验如何在 Kubernetes 上部署 Kubeflow,及其带来的极速便利。

GitHub地址项目GitHub地址

MySQL数据库管理与性能调优(90学时)

本课程面向初次接触数据库的学生,通过直观易懂的MySQL数据库,了解数据库基本原理与操作。MySQL是全球第二大企业级数据库系统,具有安全控制、数据对象操作、数据备份恢复等主要功能。这些功能保证了MySQL作为企业级数据库的可靠性、高性能和可维护性。本课程针对MySQL系统管理进行详细介绍,包括系统的安装、配置、数据库及表的创建、系统安全管理、数据库备份恢复、系统日志管理等方面的知识。学员通过本课程的学习,可以系统性了解如何正确安装MySQL数据库、创建和执行备份策略、创建安全的存储过程以更新和访问数据等等,还可以掌握MySQL数据库的安全知识、了解如何为用户正确分配访问权限、设置资源限制及访问控制等。在管理使用过程中,管理员将不可回避地遇到如何管理MySQL应用程序不断增长的数据、如何监控、诊断问题区域并调节MySQL以优化性能、如何配置、使用集群等诸多问题,管理员应通过这些高级方法来确保数据库的可靠性、高性能和可维护性。本课程还介绍了性能调优方面的知识,包括如何充分利用MySQL增强特征来编写查询语句以处理查询和索引,教授学员如何评估架构、使用调优工具、配置数据库性能、调优应用程序和SQL代码、调优服务器、检查存储引擎等常用调优知识。

JAVA 8新特性(90学时)+ 认证强化

毫无疑问,Java 8发行版是自Java 5(发行于2004,已经过了相当一段时间了)以来最具革命性的版本。Java 8为Java语言、编译器、类库、开发工具与JVM(Java虚拟机)带来了大量新特性。面向已经具备Java课程体系的高校,我们将提供面向Java语言新一代版本Java 8的新特性升级课程,在本课程中,学生通过权威及标准化的教育资源将了解到55个关键的Java新特性,通过大量精彩的案例演示与教学快速掌握最新的开发技术,并保证对技术的先进性。包括Lambda表达式,日期/时间API,JavaScript引擎Nashorn,Parallel Stream,Java飞行记录器…等核心特性将被详细介绍并提供大量的动手实验操作,代码开发及编写练习。同时,本课程还包含:

强化指导单元。

数据库基础(90学时)

在当今以数据为推动力的经济中,计算机科学和业务课程如果没有数据库和数据管理方面的课程,就不能说是完善的。应了解计算机如何组织、使用和处理数据,这对于了解如何使用我们掌握的数据以及如何寻求创新方式以更好地管理和使用数据都至关重要。数据库出现由来已久,不过总会出现新的内容需要学习。《数据库基础》是第一门入门课程,本课程向学生介绍基本关系数据库概念。本课程向学生教授关系数据库术语以及数据建模概念,构建实体关系图 (ERD) 及映射 ERD 等知识。使用 Oracle SQL Developer Data Modeler 构建 ERD,使用结构化查询语言 (SQL) 与关系数据库进行交互并处理数据库中的数据。使用 Oracle Application Express 提供动手参与的实践活动。利用基于项目的学习技术,学生将创建和处理项目,这对他们提出了为企业或组织设计、实施和演示数据库解决方案的挑战。本课程通过一个学术数据库/学校信息数据库的建模与创建的综合案例,为项目贯穿整个课程的多个知识点。同时也包含了多个包括:电子图书馆,酒店,保险,零售,租赁等多个行业的业务分析。

数据库设计(90学时)

在本课程中,学生将学习分析复杂的业务方案并创建数据模型 - 组织的信息的概念化表示形式。学生 将实施其数据库设计:使用 SQL创建一个物理数据库。 在此期间会讲解基本的 SQL 语法以及构造有效 SQL 语句的规则。本课程最后是创建一个项目,让学生设计、实施和演示企业或组织的数据库解决方案。本课程最后是创建一个项目,让学生设计、实施和演示企业或组织的数据库解决方案。HealthOne 医疗数据库建模项目为一家专门为医疗行业开发数据库的小型数据库咨询公司,不久前签下了一份合同,为中型医疗保险公司开发数据库应用程序系统的数据模型,以跟踪记录医疗索赔,其中包括患者信息、提供方(医生)信息、患者就诊信息以及医生为患者所开的处方药。需要记录患者姓名、地址、电话、电子邮件等信息,以及每名患者的主治医生、患者保险标识号和保险公司名称。此外,还需记录每名医生的相关信息,例如:专业及其隶属医院、电话和地址等。对于医院本身,需要掌握具体位置和联系方式。同时,还需要在这一特定数据库中跟踪医护人员为每名患者所开的处方,以便确定索赔资格,其中包括所开药品的一些基本信息,从而确保不会与患者的其他处方相冲突。需要了解每种药品的名称、用途以及可能的副作用。最后,该数据库将用于跟踪趋势,并根据累积的数据进行推断预测建模。

数据库建模与编程(90学时)

在本课程中,学生将学习分析复杂的业务方案并创建数据模型 - 组织的信息的概念化表示形式。学生 将实施其数据库设计:使用SQL创建一个物理数据库。 在此期间会讲解基本的SQL语法以及构造有效SQL语句的规则。本课程结合全球快餐连锁行业,人力资源管理,流行音乐行业等项目案例,贯穿数据库设计与建模内容。最后通过OFlix在线租赁综合案例作为本课程的结业最终项目。

数据预处理与数据整理(32学时)

机器学习和深度学习项目在大多数企业中变得越来越重要。同时,一个完整的项目流程包括数据整理(Data Preparation)、构建分析模型以及部署至生产环境。该流程是一个:洞察与行动的循环,此循环能不断地改进分析模型。当你打算使用机器学习或深度学习技术来构建分析模型时,一个重要的任务是集成并通过各种数据源来准备数据集,这些数据源包括比如文件、数据库、大数据存储、传感器或社交网络等等。此步骤可占整个分析项目的80%。显然,数据整理是数据科学的核心。它包括数据清洗和特征工程。另外领域知识(Domain Knowledge)也非常重要,它有助于获得好的结果。数据整理不能完全自动化,至少在初始阶段不能。

通常,数据整理会占去整个分析管道(流程)的60%到80%。

但是,为了使机器学习算法在数据集上获得最优的精确性,数据整理必不可少。《纽约时报》指出,数据清洗与数据整理等预设工作,是大数据科学家获得科研及业务成果的关键。本课程重点让学生掌握强大的数据预处理和数据整理工具,而且不局限与计算机专业学生使用,实现对大数据预处理与数据整理标准化流程的认知,掌握,以及扩展。让学生全面并深入了解对凌乱数据进行数据预处理,数据整理,数据清洗,数据归类透视,数据库关联查询,以及基于Web服务实现数据扩展处理等各项关键技术。

云计算及大数据引擎管理(60学时)

云计算已经成为现代企业信息系统架构的标准模型,无论采用亚马逊还是阿里云,其云计算基本架构都以开源OpenStack为模板。通过本课程,学生将了解“云计算”基本架构,IaaS,SaaS,PaaS及核心功能模块,同时了解如何在“云计算”平台上通过引入数据引擎服务实现大数据Hadoop集群的配置与管理。大数据即服务 —— BDaaS,旨在为用户提供简单部署在“云计算”架构之上的Hadoop集群的能力,并且部署数据处理框架,如:

  • Hadoop
  • Spark
  • Storm
  • Cloudera CDH
  • Hortonworks HDP
  • MapR

通过简单的配置,能够迅速的把大数据集群机构部署起来,支持集群的扩容和收缩。以Spark/Storm应用为代表的大数据分析,是最适合在云上运行的业务之一。

大数据基础与实战(90学时)

本课程是真正面向企业大数据业务的实践性课程,基于跨象乘云公司集成部署的大数据工程实践系统环境,旨在帮助学生了解:各种大数据技术如何运作,这些技术应何时用于较大规模的大数据项目中,它们如何同时发挥作用,为企业提供最高的投资回报率。该课程旨在阐述大数据项目的五个阶段战略,使学生了解如何使用并充分利用大数据。这五个阶段包括:

  • 数据处理底层架构(阶段1)
  • 数据采集和存储(阶段2)
  • 数据访问和处理(阶段3)
  • 数据统一和分析(阶段4)
  • 数据安全/可视化/性能优化(阶段5)

每个阶段均包括Hadoop核心组件和生态系统技术以及大数据技术或产品。学生将学习信息管理系统如何采用一种全面的方法将大数据(非结构化和半结构化)与关系数据(结构化)进行整合,从而发现更多嵌入大数据池中的价值。