写点什么

深度学习为什么要选择 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:334199

评论

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

这篇SpringCloud GateWay 详解,你用的到

牧小农

SpringCloud Gateway

为什么需要微服务

阿泽🧸

微服务 6月月更

vue自定义指令

小恺

6月月更

【愚公系列】2022年06月 面向对象设计原则(六)-合成复用原则

愚公搬代码

6月月更

volatile的解构

卢卡多多

volatile 6月月更

开源项目那么多,这次带你了解个版本的区别,明白alpha版、beta版、rc版是什么意思

迷彩

开源 记录 6月月更

数据库每日一题---第9天:销售员

知心宝贝

数据库 算法 前端 后端 6月月更

flutter系列之:flutter中常用的container layout详解

程序那些事

flutter 程序那些事 6月月更

模块八作业

库尔斯

#架构实战营

基于华为云图像识别标签实战

乌龟哥哥

6月月更

消息队列入门MQ

卢卡多多

MQ 消息队列 6月月更

向线程池提交任务

急需上岸的小谢

6月月更

网络流媒体协议的联系与区别(RTP RTCP RTSP RTMP HLS)

赖猫

音视频 流媒体

LabVIEW控制Arduino实现红外测距(进阶篇—6)

不脱发的程序猿

单片机 LabVIEW VISA Arduino Uno 红外测距

LabVIEW Arduino电子称重系统(项目篇—1)

不脱发的程序猿

单片机 LabVIEW VISA ​Arduino Uno 电子称重系统

什么是Vue3的组合式 API?

源字节1号

软件开发 小程序开发

LabVIEW控制Arduino实现超声波测距(进阶篇—5)

不脱发的程序猿

单片机 LabVIEW Arduino VISA 超声波测距

Flutter doctor 显示xcode没有安装的解决办法

坚果

6月月更

tornado环境搭建及基本框架搭建——熟悉的hello world

孤寒者

Python tornado 6月月更 hello world

Java—并发容器

武师叔

6月月更

WWDC22 开发者需要关注的重点内容

37手游iOS技术运营团队

iOS16 WWDC22 Xcode14 iPadOS16 macOS10.16

【sql语句基础】——删(delete) /改(update)

写代码两年半

数据库 sql :MySQL 数据库 6月月更

测试基础之:黑盒测试

甜甜的白桃

测试用例 黑盒测试 6月月更

【Spring 学习笔记(十)】Spring 使用注解整合 Mybatis

倔强的牛角

Java spring Java EE 6月月更

leetcode 257. Binary Tree Paths 二叉树的所有路径(简单)

okokabcd

LeetCode 搜索 数据结构与算法

消息队列存储消息数据的 MySQL表

Dean.Zhang

动态规划之0-1背包问题(详解+分析+原码)

未见花闻

6月月更

485天,远程办公的 21 条心得分享|社区征文

悟空聊架构

远程办公 悟空聊架构 热门活动 初夏征文 社区征文

5分钟了解攻防演练中的红蓝紫

穿过生命散发芬芳

6月月更 攻防演练

BottomSheetDialog 使用详解,设置圆角、固定高度、默认全屏等

yechaoa

android dialog 6月月更 material design

谈谈远程工作 | 社区征文

大菠萝

初夏征文

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