专栏名称: 机器之心
专业的人工智能媒体和产业服务平台
目录
相关文章推荐
爱可可-爱生活  ·  本文通过在形式化定理证明领域的深入研究,揭示 ... ·  19 小时前  
爱可可-爱生活  ·  【Anthropic团队内部如何用Claud ... ·  昨天  
爱可可-爱生活  ·  本文开创性地提出了“嫁接”(grafting ... ·  昨天  
黄建同学  ·  揭秘 Antropic ... ·  2 天前  
爱可可-爱生活  ·  【[56星]gemini-code:为Cla ... ·  2 天前  
51好读  ›  专栏  ›  机器之心

PyTorch和TensorFlow到底哪个更好?看看一线开发者怎么说

机器之心  · 公众号  · AI  · 2017-03-01 13:47

正文

请到「今天看啥」查看全文



帖子一楼写道:


我还没有从 Torch7 迁移到 TensorFlow。我玩过 TensorFlow,但我发现 Torch7 更加直观(也许是我玩得不够?)。我也尝试了一点 PyTorch,所以我决定先看看效果。


使用了几周 PyTorch 之后,我认为我现在还不必迁移到 TensorFlow,至少在我感兴趣的项目上还不需要。用 PyTorch 写自定义模块真是简单至极。而且其动态图构建(dynamic graph construction)给我之前需要熬夜实现(或等待列表上)的东西带来了很多新想法。我认为对机器学习开发者来说,PyTorch 是一个了不起的工具集。我也知道 TensorFlow 的社区资源要强大得多,但如果要开发全新的项目(而不是为已有的架构重新写代码或阅读教程),社区也不一定能有很大的帮助。


这个 Reddit 帖子发出后得到了很多机器学习研究者和开发者的关注,他们纷纷跟贴谈论自己的想法和经验(不只是关于 PyTorch 和 TensorFlow,讨论中还涉及到更多工具)。机器之心在这里选择其中一些我们认为有价值的评论,希望能够给你的学习和研究带来帮助。以下按赞成数量排序。


ajmooch的回复:


我一直在做一个 TensorFlow 的项目,所以我可以公正地在 Theano+Lasagne, PyTorch 和 Tensorflow 三者之间做一个比较。但对于前两者,我可以给出一些漫漫的看法。


背景:大概在一年前我开始接触 Theano+Lasagne,并在我的两篇论文中使用了它。我上周改换到 PyTorch,并重新建了两个我以前用 Theano 实现的关键项目。


API:Theano 的图形构建和编译工作方式让我学习起来很费劲,但一旦我找到了它的窍门,一切都迎刃而解(这也许会花费两个月,但是我仍旧在学习 Python 和基本的神经网络方面的东西,所以对这一速度的参考价值持保留态度)。Lasagne 的 API,对我来说,就像是优雅的凯瑟琳女皇骑着逆戟鲸展开了战斗,也就是说我爱死它了。如果我提前知道我有多想要一个 Theano 的程式库去工作,我一定会写一个程式库,这大大地减轻了繁重的劳动。


PyTorch 的 API,另一方面来说感觉有些粗糙,但对它有一些限定词,这个稍后再谈。如果你只是做一些标准的任务(实现 ResNet 或者 VGG)我认为你不会有问题,但我一直都有一些分歧因为我所做的一切都有些奇怪。举个例子,在我当前的项目中,因为 strided 张量索引(tensor indexing)还未实现,我必须使用几个 hacky 解决方法,虽然当前的索引技术非常灵活,比起直接使用 numpy 风格的索引,它们少了很多直观性。中心的限定条件是,它们确实只是释放 friggin 的框架,当然并不是一切都实现,还有一些待解决的问题。Theano 发展时间长且已经成熟,我并没有观察到它或者 Lasagne 在这个过程中遇到过困难。


除此之外,对于 PyTorch 我最大的「抱怨」基本上是在神经网络 API 方面「事情并未按照我让他们组合的方式进行放置」。具体来说,我非常喜欢 Lasagne 的「层次(layers)」范式—但是一点点批判性的思维就会让你得出这个结论,这个范式尤其不适合动态图框架。我完全习惯于考虑并且优化我关于静态图形定义的思考过程,所以转换 API 方法是一个小的痛点。这非常重要-我花了很长时间思考「好吧,既然我不能使用自己的标准流控制写出一个常规的程序一样,写出这个图的 Theano,那么我该如何定义它呢,」这让我在思维的道路上变得越来越强大。


然而,动态图需要一个与「定义+运行」基本不同的 API,虽然我个人认为它并不直观,就在上周其单独执行定义的方法,正如 CJ 所说,打开了我的思路并给了我几十个项目的想法,这在以前是不可能的。我还想象,如果你在任何你想的地方使用 RNNs 做任何事情,比如,在没有消耗计算的前提下实现动态计算,接口的命令性质将会使它更容易这样做。


速度:所以我没有做广泛的基准测试,但是我惊讶的发现,PyTorch 是可以立即使用的,在我当前的项目的单 GPU 的训练时间比 theano+lasagne 快 100%。我已经在 Geforce gtx 980 和 Titan X 上测试了它,并实现了已经确认相同且在合理的误差范围内的网络。100% 逐字地在 CIFAR100 上从(在最简单的情况下)5 分/历元到 2.5 分/历元,并且在某些情况下降到 2 分钟/历元(即,快两倍)


这是相同的模板代码,使用了相同的数据提取程序(我不得不讽刺地说「fetcher」没有思考「去死吧,FETCHER(DIE, FETCHER!)」),除了实际的代码,训练和运行网络,一切都相同。


这让我感到惊讶,因为我的印象是,Theano 的广泛和积极的内存优化(在这种情况下,当你开始训练,只需花费几分钟进行编译)意味着它在单 GPU 下的速度非常快。我不知道什么导致了速度的提升,或者,因为他们同样都使用了 cuDNN 的最新版本(我仔细地检查了一遍以确保的确是这样),所以这一切的收获一定在天空的某一个地方,但我并不知道会在哪里。







请到「今天看啥」查看全文