本文原作者陈云,本文整理自作者在知乎《PyTorch到底好用在哪里?》问题下的回答。AI 研习社已获得转载授权。
提问内容如下:
之前非常熟悉 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 我能轻松实现自己的想法
<span style="font-size: 14px; color: rgb(63, 63, 63);"><img src="https://pic3.zhimg.com/50/v2-7773e97be57bada3fba9f1a5c023d6ca_hd.jpg" data-caption=""data-rawwidth="480"data-rawheight="270"class="origin_image zh-lightbox-thumb"width="480"data-original="https://pic3.zhimg.com/v2-7773e97be57bada3fba9f1a5c023d6ca_r.jpg"></span>
而且 github 上很多 tensorflow 的代码也不能跑了不是吗?毕竟 TF 常年一步一大更新,不怎么考虑向后兼容。随着同学的更新 TF,我眼睁睁看的我的 TF 代码从运行正常,到警告,到报错
PyTorch 实现的项目在 github 上也有很多,不是吗?基本上所有的研究方向都能找到质量很高的 PyTorch 开源方案。
6. 关于 PyTorch 的几个误解
PyTorch 社区不强大 ?
看上文。
PyTorch 文档不齐全?
我觉得 PyTorch 的文档几乎是所有框架中最好的,这些文档都是作者在设计的时候就写好的,不是别人看着代码,凭借着自己理解写的。 而且 PyTorch 文档中的给出了很多示例,在 IPython 下可以直接拷贝运行,做实验测试。
<span style="font-size: 14px; color: rgb(63, 63, 63);"><img src="https://pic4.zhimg.com/50/v2-eaf22ce4a47228a10a6c5884fddd985f_hd.jpg" data-caption=""data-rawwidth="734"data-rawheight="828"class="origin_image zh-lightbox-thumb"width="734"data-original="https://pic4.zhimg.com/v2-eaf22ce4a47228a10a6c5884fddd985f_r.jpg"></span>
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),回复 1 领取
【超过 1000G 神经网络 / AI / 大数据,教程,论文】
知乎 “看山杯” 夺冠记
▼▼▼