本文原作者陈云,本文整理自作者在知乎《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 )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 )深度学习框架的设计可以很简单 !现在 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 / 大数据,教程,论文】 
 
     
 
     
 
     
 
     知乎 “看山杯” 夺冠记 
 
     ▼▼▼