PyTorch 到底好用在哪里?

提问内容如下: 之前非常熟悉 Tensorflow,后来都说 PyTorch 简单易上手,自己就去试了试。 PyTorch 连最基本的 maximum, minimum, tile 等等这些 numpy 和 tensorflow 中最简单的运算都没有,用 view 来 reshape 还会报错 contiguous(虽然我知道怎么解决),官方手册也查不到相应说明,这个东西到底好用在哪里? 还是说就是定义网络结构简单?

先来回答一下你提的几个问题:

Pytorch 连最基本的 maximum, minimum, tile 等等这些 numpy 和 tensorflow 中最简单的运算都没有,用 view 来 reshape 还会报错 contiguous(虽然我知道怎么解决),官方手册也查不到相应说明,这个东西到底好用在哪里?

你说的那几个函数 pytorch 中都有(或者可以实现)

  • maximum: torch.max() 同时包含了 numpy.max 和 numpy.maximum 的功能
  • minimum:torch.min()
  • tile: 通过 view/expand(repeat)几乎能实现任何形状调整。比如 np.tile(arr,(100,100)) 等价于 tensor.view(a,b,1,1).expand(a,b,100,100),如果你看 numpy 的源码的话,会发现 tile 就是用 python 这么实现的(reshape+repeat)
  • contiguous 的问题我经常听别人提问,但我从未遇到过(我几乎从未调用过 `tensor.contiguous()`),大多数人也很少会把 tensor 弄成不连续。之所以 tensor 会不连续,是为了能够共享内存,更高效的内存利用(其实只要 PyTorch 在设计的时候把所有的不连续操作都返回一个连续的 tensor 即可解决这个问题,但是不值得,大多数不连续的 tensor 都会进行一个 reduce 操作,然后就变成了连续的了)。

numpy 那么多函数,PyTorch 不可能都支持,即使不支持,也可以在 numpy 中实现,然后转成 tensor,毕竟 numpy 和 tensor 之间的转换极其高效快速(他们共享内存).

这个东西到底好用在哪里? 还是说就是定义网络结构简单?

PyTorch 到底好在哪,其实我也只是有个朦胧的感觉,总觉的用的舒服自在,用其它框架的时候总是觉得这里或者那里别扭。第一次用 PyTorch 几乎是无痛上手,而且随着使用的增加,更是越来越喜欢:

PyTorch 不仅仅是定义网络结构简单,而且还很直观灵活。静态图的网络定义都是声明式的,而动态图可以随意的调用函数(if,for,list 什么的随便用),两者的差距不是一点点。网络的定义在任何框架中都应该是属于最基础最简单的一个内容,即使是接口繁多的 tensorflow,通过不断的查文档,新手也能把模型搭起来或者是看懂别人的模型。这个 PyTorch 也不例外,它的优势在于模型定义十分直观易懂,很容易看懂看别人写的代码。可以看看 pytorch/vision(http://t.cn/RWOsje1) 里面的几个经典的网络定义,我觉得很难找到比它更简洁易懂的模型定义了。

网络模型定义只是很基础的一部分,更重要的是模型的使用。比如在使用预训练模型 finetue 时,我们需要修改预训练模型某些层,新增某些层,删除某些层,新增的层希望给他较高的学习率,之前预训练的层希望学习率设为 0。scene-baseline(http://t.cn/RWOsmRv) 是我前几天为 AI challenger 场景分类写的 baseline,可以参考一下,只用了几行代码就实现了预训练模型 finetune(新增某些层,删除某些层,修改某些层),以及为不同层设置不同学习率 scene-baseline-optimizer(http://t.cn/RWOseXG) 。

再比如在尽可能不修改原来模型源代码的情况下,获取预训练好模型的某些层的输出(Fast Neural Style 需要用到),或者是使用多个预训练好的子模型,分别初始化一个复杂模型的某一部分,因为子模型的结构都是相似的,所以可以让这些子模型共享某些层的参数(知乎看山杯我就用了这个策略。表述的可能很复杂,其实在模型的构建只用了几行,http://t.cn/RWWv7el)

谈太多框架的使用,可能比较枯燥,只有你自己用了才知道,PyTorch 真的是越用越顺手。

下面说几点其它的看法,没有什么条理,不论证举例,只说想法,只是个人看法,不必太认真

1.PyTorch 比 TF 更符合 Unix/Python 哲学

Unix 哲学:做一件事,并把它做好。(真的要在做实验的时候考虑如何把模型部署到手机,利用 TPU 加速?)

Unix 哲学:KISS(keep it simple, stupid)。github 上 TF 有接近 100 万行代码,PyTorch 只有它的十分之一多一点。TensorFlow 创造了 图、会话、命名空间、PlaceHolder 等一大堆全新的概念,简直就是一门新的语言。TensorFlow 是 Make It Complicated ,TensorFlow+Keras 是 Make It Complicated And Hide It。而 Keras 的 Hide it 又违反了 Python 的哲学(扁平胜于嵌套 ),丧失了灵活性。而 PyTorch 就是 tensor-autograd-nn 三级封装~ 简洁易懂

Python 之禅:尽量找一种,最好是唯一一种直观易懂的实现方案(猜猜 TF 中 RNN 有多少种实现,猜猜除了 Keras、Sonnet、TFLearn、TensorLayer、Slim、PrettyLayer 之外 tensorflow 还有多少个第三方 API )。PyTorch 的不同人写的代码都差不多,很容易看懂。

完整的 Python 之禅(http://t.cn/RvGmLzU):

The Zen of Python, by Tim Peters 优美胜于丑陋 明了胜于晦涩 简洁胜于复杂 复杂胜于凌乱 扁平胜于嵌套 间隔胜于紧凑 可读性很重要 即便假借特例的实用性之名,也不可违背这些规则 不要包容所有错误,除非你确定需要这样做 当存在多种可能,不要尝试去猜测 而是尽量找一种,最好是唯一一种直观易懂的实现方案 虽然这并不容易,因为你不是 Python 之父 做也许好过不做,但不假思索就动手还不如不做 如果你很难向人描述你的实现,那肯定不是一个好实现 命名空间是一种绝妙的理念,我们应当多加利用

如果你很难向人描述你的实现,那肯定不是一个好实现

2. 快速

在大多数人写的代码中 PyTorch 都比 TensorFlow 快,并不是说 TensorFlow 慢,只是你要用 TensorFlow 写出同等速度的代码会稍微困难一些(单单是数据加载这一块就会难倒许多人)

TensorFlow 60-80% slower than PyTorch on training Wide ResNet · Issue #9322 · tensorflow/tensorflow (http://t.cn/RWWPwR4)

pytorch 2.5x faster on VGG16 · Issue #7065 · tensorflow/tensorflow(http://t.cn/RWWPGWk)

3. 强大的社区

facebook 的 FAIR 强力支持,FAIR 是全球 TOP3 的 AI 研究机构。PyTorch 论坛,文档,tutorial,一应俱全。FAIR 的几位工程师更是全职维护开发,github 上 PyTorch 每天都有许多 pull request 和讨论。

你很难听到有谁说 TF 好用,最多是诸如谷歌支持,社区强大,文档完善,功能齐全等等。但是 PyTorch 你只要深度用过一段时间,就会喜欢上它的。很多人自来水安利 PyTorch,当然不是 facebook 给钱,或者是博得多少点击量,真的是因为它太好用了。

其实关于 TensorFlow 还有一点让我颇为不满的是,现在媒体总是觉得谷歌的东西就是最好的,每回 TensorFlow 有什么更新,都要搞个大新闻。而且,谷歌喜欢把一个项目的目标当成这个项目的特点来宣传,但是 TensorFlow 的实际表现,配不上它的名气。

4. 简洁易懂的代码

一个框架你不懂源码,你就不能完全掌握它的运行原理,像 tensorflow 的 `sess.run` 简直就是个黑箱。而 PyTorch 几乎是我用过框架中源码最易懂的,任何一个操作,不论多么高级复杂,都能轻松的找到它对应 tensor 操作(Caffe/tinydnn 也挺简洁的,但是我的 C++ 比较渣)

nn.Module(http://t.cn/RWWPC3s)代码是 PyTorch 中对所有模型对象的封装,我觉得几乎所有人都应该看看,深度学习框架的设计可以很简单!现在 Gluon,Sonnet,nnabla 等框架也都开始模仿这个设计 api~

5. 快速实现

深度学习炼丹的过程中,我们肯定都有许多奇思妙想,但这些奇思妙想需要做实验来验证。如果实现比较困难费时,在不确定这个想法是否有效的情况下,我们很容易打退堂鼓。PyTorch 可以解放你的想法,用 tensor 的思维思考代码,一切操作皆 tensor,一切 tensor 能做的,PyTorch 都能做到,而且做的像操作 tensor 一样。

用 TensorFlow 我能找到很多别人的代码

用 PyTorch 我能轻松实现自己的想法

而且 github 上很多 tensorflow 的代码也不能跑了不是吗?毕竟 TF 常年一步一大更新,不怎么考虑向后兼容。随着同学的更新 TF,我眼睁睁看的我的 TF 代码从运行正常,到警告,到报错

PyTorch 实现的项目在 github 上也有很多,不是吗?基本上所有的研究方向都能找到质量很高的 PyTorch 开源方案。

6. 关于 PyTorch 的几个误解

PyTorch 社区不强大 ?

看上文。

PyTorch 文档不齐全?

我觉得 PyTorch 的文档几乎是所有框架中最好的,这些文档都是作者在设计的时候就写好的,不是别人看着代码,凭借着自己理解写的。 而且 PyTorch 文档中的给出了很多示例,在 IPython 下可以直接拷贝运行,做实验测试。

PyTorch 中没有 TensorBoard?

lanpa/tensorboard-pytorch (http://t.cn/RKaVnUz)不仅功能强大(支持 Tensorboard 几乎所有的操作,连计算图都支持,只是显示效果不好),而且接口简单(比 tf 的 tensorboard api 易用)。而且除了 Tensorboard 还有 Visdom 可以用~

PyTorch 动态图性能比较差?见上文,同等水平的人用 PyTorch 写出来的代码普遍要比 TensorFlow 快。当然我认为极限情况下 TensorFlow 会比 PyTorch 快,详情可以看 TensorFlow 官方的 benchmark,只是写的代码很复杂,普通用户写不出来。

总感觉表述有点匮乏,表达也不是很流畅,还有很多没表达出来的。可以看看其他人是怎么说的:

深度学习入门该用 PyTorch 还是 Keras?热门公开课换框架背后的学问(http://t.cn/RpJRzvg)

PyTorch 和 TensorFlow 哪个更好?看一线开发者怎么说(http://t.cn/RiIheKF)

2017 年 1 月 18 日 Facebook 发行的 PyTorch 相比 TensorFlow、MXNet 有何优势?(http://t.cn/RMeTElK)

属于动态图的未来:横向对比 PyTorch 与 Keras(http://t.cn/RWWGwIu)

PyTorch 和 TensorFlow 到底哪个更好?看看一线开发者怎么说 (http://t.cn/RWWG4aP,帖子是 3 月份初发的,这时候 PyTorch 才发布一个多月,但几乎所有用过的人已经都在夸赞)

原文发布于微信公众号 - AI研习社(okweiwu)

原文发表时间:2017-10-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AI研习社

从深度学习到机器人控制,2017 人工智能新开发工具盘点

2017 年,在深度学习技术的加持下,CV、NLP、数据分析等领域全面开花,同时大量新开发工具和开源软件的涌现,降低了人工智能开发的门槛,加速了深度学习的普及。...

38560
来自专栏FD的专栏

从人脸识别到机器翻译:52个有用的机器学习和预测API

人工智能正在成为新一代技术变革的基础技术,但从头开始为自己的应用和业务开发人工智能程序既成本高昂,且往往很难达到自己想要的性能表现,但好在我们有大量现成可用的 ...

11110
来自专栏Albert陈凯

NO

N ---- 非关系型数据库( Not Only SQL):这个词听起来几乎就是「SQL,结构化查询语言」的反义词,SQL 是传统的关系型数据管理系统(RDBM...

27860
来自专栏新智元

【并非愚人节】科学家创建可自我复制的神经网络,AI像生命体一样繁殖

19430
来自专栏Albert陈凯

CPU与GPU区别大揭秘

有网友在网上提问:“为什么现在更多需要用的是 GPU 而不是 CPU,比如挖矿甚至破解密码? ”以下是比较准确靠谱的回答:   1、现在更多被需要的依然是CP...

53730
来自专栏鸿的学习笔记

Upvote Dynamics on the Quora Network(上)

当一个答案被添加到Quora时,存在着将它分发给跟随作者的人的各种机制。其中最突出的是主页Feed和摘要电子邮件,但也有其他途径,如较新的“您关注的人”电子邮件...

7010
来自专栏机器学习实践二三事

【Google 年度顶级论文】机器学习系统,隐藏多少技术债?

原文在此:google原文 1. 介绍 随着机器学习(ML)社群持续积累了几年对于活跃系统(live systems)的经验,一种让人不舒服的趋势广泛地浮出...

304100
来自专栏织云平台团队的专栏

T4 级老专家:AIOps 在腾讯的探索和实践

我今天要讲的主题,AIOps,是一个比较新的话题,其实从概念的提出到我们做,只有差不多一年的时间。一个新事物,有其发展的周期,在腾讯里面我们做了比较多的探索,但...

14.1K00
来自专栏人工智能头条

有助于你掌握机器学习的十三个框架

17440
来自专栏数据的力量

如何选择合适的数据图表?

16840

扫码关注云+社区

领取腾讯云代金券