写点什么

深度学习为什么要选择 PyTorch

  • 2020-04-16
  • 本文字数:3658 字

    阅读完需:约 12 分钟

深度学习为什么要选择 PyTorch

过去几年来,深度学习和机器学习是公众最热门的词汇,对此我们有一个完美的解释。


正是因为有了机器学习,系统才能够从经验中学习;而深度学习,则利用庞大的数据集将机器学习带到了更大的规模。


在机器学习和深度学习的推动下,各种编程语言和库应运而生,并使程序员、研究人员和数据科学家们实现了不可思议的成就。


在深度学习领域,TensorFlow和 PyTorch 两个库之间的最强者之争由来已久,在本文中,我们将更多地关注 PyTorch。



2016 年,Facebook 发布了面向编程场景的 PyTorch,它是基于 Lua 的 Torch 库。


PyTorch 是一个免费的开源机器学习库,当前版本为 1.4。PyTorch 已发布近三年,经多番改进,现已处于最佳状态。创建 PyTorch 是为了让人感觉比其他竞争对手更快,更 “Python 化”。Pytorch 也支持 C、C++ 和张量计算。


Google Trend:Python 热度随时间变化的趋势


选择 PyTorch 进行深度学习的原因

在谈到为什么不试试 PyTorch 之前,让我们先看看下面列举的几个独特而令人兴奋的深度学习项目和库,这些都是 PyTorch 促成的:


  • CheXNet:利用深度学习技术在胸片上进行放射科医师级别的肺炎检测。

  • Horizon:应用强化学习平台(Applied RL)。

  • PYRO:Pyro 是一种通用的概率编程语言(probabilistic programming language ,PPL),用 Python 编写,后端由 PyTorch 支持。

  • NVIDIA 的 Kaolin:作为加速 3D 深度学习的 PyTorch 库,用于加速 3D 深度学习。

  • TorchCV:将计算机视觉应用到项目中。

  • PyDLT:一套深度学习工具。

  • fastai 库:用来优化神经网络训练过程。

  • 以及更多。


这些都是建立在 TensorFlow 和 PyTorch 之上的框架和项目。

PyTorch 的优越性

在 TensorFlow 的世界里, PyTorch 能够凭借自己的强项坚守自己。下面是 PyTorch 的一些亮点,解释了为什么 PyTorch 适合深度学习项目。

1. PyTorch 更 “Python 化”

PyTorch 是一个实用框架,它可以让我们以更 “Python 化” 的方式编写代码。此外,它使用朴素的 Python 代码所支持的那种动态特性是非常了不起的。


与任何其他库相比,PyTorch 更倾向于 Python。这是因为 PyTorch 相对容易理解,而且感觉更自然、更原生,和 Python 代码一致。对于任何使用过 PyTorch 的人来说,他们都会对 PyTorch 的一切有一种亲切的感觉,比如损失函数、优化器、转换、数据加载器以及更多的类。


每个 PyTorch 示例(计算机视觉和自然语言处理)的代码都有一个共同的结构:


data/experiments/model/    net.py    data_loader.pytrain.pyevaluate.pysearch_hyperparams.pysynthesize_results.pyevaluate.pyutils.py
复制代码


  • model/net.py:指定神经网络架构、损失函数和评估指标。

  • model/data_loader.py:指定数据应如何馈送到网络。

  • train.py:包含主训练循环。

  • evaluate.py:包含用于评估模型的主循环。

  • utils.py:用于处理超参数/日志/存储模型的实用功能。

2. 易于使用

与 PyTorch 相比,TensorFlow 的学习曲线相对较徒。Python 程序员需要较少的时间即可使用 PyTorch,因为对他们来说,PyTorch 更像是 Python 框架的扩展。简单的调试和一套优秀的简单 API 就能使程序员轻松驾驭 PyTorch。

3. 有用的库

在社区的大力支持下,人们的社区的热情和贡献也越来越大。程序员使用 PyTorch 创建了一些项目,有兴趣的读者可以去看看。下面是一个综合列表,列出了计算机视觉、自然语言处理和生成库等不同领域的一些项目:


  • pro_gan_pytorch:利用 ProGAN 功能。

  • BoTorch:使用贝叶斯优化。

  • ParlAI:用于共享、训练和测试对话模型。

  • OpenNMT-py:用于实现神经机器翻译系统。

  • MUSE:用于多语言词嵌入。

  • skorch:用于将 scikit-learn 代码与 PyTorch 融合。

4. 轻松实现数据并行

PyTorch 中的数据并行(Data Parallel)非常高效,可以将数据分成若干批,然后发送到多个 GPU 进行处理。使用这种技术,PyTorch 可以将很大一部分工作负载从 CPU 转移到 GPU。为了实现数据并行,它使用了 torch.nn.DataParallel 类。


Distributed Data-Parallel(分布式数据并行)是 PyTorch 的一项特性,你可以将其与 Data-Parallel(数据并行)结合使用来处理需要大型数据集和模型的用例,这些数据集和模型对单个 GPU 来说过于庞大。当 GPU 池上的所有任务完成之后,结果将被收集、合并,再由 Data-Parallel 发回给你。


def get_cnn(self, arch, pretrained):        """Load a pretrained CNN and parallelize over GPUs        """        if pretrained:            print(("=> using pre-trained model '{}'".format(arch)))            model = models.__dict__[](pretrained=True)        else:            print(("=> creating model '{}'".format(arch)))            model = models.__dict__<a href="">arch
if arch.startswith('alexnet') or arch.startswith('vgg'): model.features = nn.DataParallel(model.features) model.cuda() else: model = nn.DataParallel(model).cuda()
return model</a href="">
复制代码

5. 至少 70%开发者使用 PyTorch

PyTorch 是研究人员的神器,因为事实证明,开发框架的研究人员至少有 70% 都在使用 PyTorch。尽管 TensorFlow 是业界领先的应用开发选择,但它在这方面还没有赶上 PyTorch。这背后的一个原因可能是 PyTorch 的简单易用性和更好的性能。

6. 移动开发就绪

从版本 1.3 开始,PyTorch 就增加了对 Android 和 iOS 设备部署的支持。这一特性,为边缘设备带来了 PyTorch 的所有优势,以满足需要较低延迟的应用。PyTorch mobile 背后的目标是通过支持移动平台的基础 API 来缩短开发周期,从而无需导出到诸如 Caffe2 之类的移动框架。这样可以大大减少设备上的占用空间。此外,为了更好地控制,还增加了对构建脚本的精确调优的支持。


PyTorch Mobile 入门:


7. 易于调试

当你可以选择访问每一行,并在每一行后打印的常规方式,PyTorch 调试起来很容易。锦上添花的是,PyTorch 中的对象和操作包含了实际的数据而不是符号引用,这让程序员的工作变得更加轻松。PyTorch 的一些标准调试器是:


  • ipdb

  • pdb

  • PyCharm


例如,你可以使用 pdb 的 pdb.set.trace() 函数在代码中放置断点,从而深入到错误的根源。此外,PyTorch 的动态计算图允许在代码执行时进行动态修改和快速调试。



使用 pdb 进行 PyTorch 调试

8. 支持 ONNX

开放神经网络交换格式(Open Neural Network Exchange,OONX)作为人工智能的开源生态系统,为人工智能程序员提供了一个共同的平台,让他们可以在各种框架、工具和库上进行互换工作。ONNX 通过提供可跨多个框架和硬件工作的标准文件格式来实现这一目标。


说到 PyTorch,ONNX 内置了对 PyTorch 和其他一系列框架的支持,如 Caffe2、MXNet、TensorFlow 等等。ONNX 使开发人工智能的程序员更容易导出和迁移他们的 PyTorch 模型,使之成为其他框架可以集成的开放格式。


import torch.onnximport torchvision
dummy_input = torch.randn(1, 3, 224, 224) model = torchvision.models.alexnet(pretrained=True) torch.onnx.export(model, dummy_input, "alexnet.onnx")
复制代码


PyTorch 原生 ONNX 支持

9. 支持动态计算图

通过将每个模型视为有向无环图,PyTorch 提供了一种定义计算图的动态方法。虽然其他框架也允许静态图定义,但 PyTorch 还支持创建动态计算图,你可以随时对其进行操作。从 PyTorch 的动态特性中获益最多的一个元素是递归神经网络。

10. 强大的社区支持

PyTorch 还提供了优秀的社区支持。PyTorch 的主页上就有关于它每个特性的详细文档。对库的所有最新更新都作了很好的解释。对于每个新添加的内容,都可以找到辅导教程和相关资源,易于上手。


PyTorch 论坛是一个非常好的、值得强烈推荐的地方,新手可以在论坛发帖提问,资深工程师也可以在论坛与程序员朋友分享自己的想法。每天都有超过 100 个帖子,这个社区非常活跃,并鼓励人们加入 PyTorch。


下面是一些 PyTorch 开发人员社区、资源和教程,你可以通过这些资源和教程来贡献、学习和解惑:


PyTorch Discuss form


PyTorch Slack Community


PyTorch Examples


PyTorch Docs


Github Pytorch Tutorials


PyTorch Beginner Cheatsheet


PyTorch Release Notes


Deep Learning With Pytorch : A 60 Minute Blitz


Using Tutorial data from Google Drive in Colab


Docs and Tutorials in Chinese


Tutorials in Korean

结语

PyTorch 为深度学习程序员提供了大量直观的功能,它为不同技能水平的人们提供了很多帮助。尽管提供了一个简单的切入点,但 PyTorch 也不容小觑,因为它提供的功能不仅在某些方面提供了更好的性能,还提供了额外的独特功能。我们在本文讨论了一些最常被提及的 PyTorch 的特性,以帮助那些对 PyTorch 摇摆不定的人做出选择。


作者简介:


Claire D.,Digitalogy 内容专员,帮助企业在 48 小时内与前 5% 的预先筛选的软件人才建立联系。


原文链接:


https://towardsdatascience.com/reasons-to-choose-pytorch-for-deep-learning-c087e031eaca


2020-04-16 11:333464

评论

发布
暂无评论
发现更多内容

【web 开发基础】PHP自定义回调函数之call_user_func_array() (36)

迷彩

回调函数 web开发基础 11月月更 call_user_func_array 自定义回调函数

在使用Note.js的过程中对于tty对于终端的运用、加密模块以及Assert的事件驱动程序的深入运用理解

恒山其若陋兮

前端 11月月更

深入react源码看setState究竟做了什么?

flyzz177

React

逻辑回归与评分卡-二元回归与多元回归:重要参数solver & multi_class & class_weight

烧灯续昼2002

Python 机器学习 算法 sklearn 11月月更

CDH5部署三部曲之二:部署和设置

程序员欣宸

大数据 hadoop 11月月更

Python: 你所不知道的星号 * 用法

eng八戒

Python 编程

React源码分析(一)Fiber

goClient1992

React

细说react源码中的合成事件

flyzz177

React

电商平台微服务架构

Jack

架构实战训练营9期

「Go实战」记一次降低30%的CPU使用率的优化

Go学堂

golang redis 程序员 个人成长 11月月更

企业级项目开发中的交互式解释器以及global全局定义、Stream流的合理运用和实战【Note.js】

恒山其若陋兮

前端 11月月更

【web 开发基础】PHP类静态函数和对象方法的回调 (37)

迷彩

对象 回调函数 11月月更 静态方法 成员方法

重构了一个服务的健康检查组件

Java永远的神

Java 程序员 面试 后端 架构师

防火墙是网络安全的第一道防线,你认同吗?

wljslmz

网络安全 防火墙 11月月更

MobPush for Flutter

MobTech袤博科技

「Go实战」基于Prometheus+Grafana搭建完整的监控系统

Go学堂

golang 程序员 个人成长 监控 11月月更

vivo大数据日志采集Agent设计实践

vivo互联网技术

大数据 数据采集 日志采集 agent

一文熟悉 Go 的循环结构 —— for 循环

陈明勇

Go golang for 11月月更 for-range

React源码分析(二)渲染机制

goClient1992

React

React Context源码是怎么实现的呢

flyzz177

React

信息论与编码:恒参信道特性

timerring

11月月更 信息论与编码

关于登录框的渗透测试

网络安全学海

网络安全 安全 信息安全 渗透测试 漏洞挖掘

C++学习---类型萃取---is_function

桑榆

C++ STL 11月月更

Mobtech短信验证 for Flutter

MobTech袤博科技

面试官:介绍一下 Redis 三种集群模式

程序员小毕

redis 程序员 后端 java面试 redis集群

ubuntu部署ELK-三节点

忙着长大#

ELK

极客时间运维进阶训练营第五周作业

Starry

【web 开发基础】PHP回调函数之变量函数 (35)

迷彩

php 回调函数 11月月更

【Node.js 】开发中遇到的多进程‘keylog‘ 事件以及TLS/SSL的解决学习方案实战

恒山其若陋兮

前端 11月月更

项目经理和Scrum Master之间的不同(译)

Bruce Talk

Scrum 敏捷开发 Agile

React源码分析(三):useState,useReducer

goClient1992

React

深度学习为什么要选择 PyTorch_文化 & 方法_Claire D._InfoQ精选文章