pytorch 和 tensorflow的区别和选择

pytorch 和 tensorflow的区别

1 图的创建及调试

       pytorch 图结构的创建是动态的,即图是运行时创建;更易调试pytorch代码,调试pytorch代码就像调试python代码一样,可以利用pdp在任何地方设置断点;

       tensorflow 图结构的创建是静态的,即图首先被"编译",然后在运行;不易调试要么从会话请求检查变量,要么学习使用tfdbg调试器;

2  灵活性

        tensorflow:静态计算图,数据参数在CPU与GPU之间迁移麻烦,调试麻烦
             pytorch:动态计算图,数据参数在CPU与GPU之间迁移十分灵活,调试简便

3 设备管理---------------内存 显存

        tensorflow:不需要手动调整,简单

TensorFlow的设备管理非常好用。通常你不需要进行调整,因为默认的设置就很好。例如,TensorFlow会假设你想运行在GPU上(如果有的话);

TensorFlow设备管理唯一的缺点是,默认情况下,它会占用所有的GPU显存。简单的解决办法是指定CUDA_VISIBLE_DEVICES。有时候大家会忘了这一点,所以GPU在空闲的时候,也会显得很忙。
       pytorch:需要明确启用的设备,启用CUDA时,需要明确把一切移入设备;

            缺点:代码需要频繁的检查CUDA是否可用,及明确的设备管理,在编写能同时在CPU和GPU上运行的代码时尤其如此

关于这点,凭个人喜好,我比较喜欢手动启用CUDA_VISIBLE_DEVICES,我个人对内存、显存的管理较严;

reference: https://blog.csdn.net/bl128ve900/article/details/97392868

 

区别详解

tensorflow是谷歌开源的深度学习框架,有全面且详细的文档

pytorch是facebook开源的深度学习框架,

区别1 动态图及静态图的定义及调试方面

tensorflow是静态图,我们需要先构建一个tensorflow的计算图,构建好以后,这样一个计算图是不能变的,然后我们在传入不同的数据进行计算;这样带来一个问题:固定了计算流程(计算图),势必带来不灵活,如果我们想改变计算逻辑,将变得很麻烦!

具体来说:在tensorflow中,首先构架张量的计算图维度及给变量分配占位符,接着必须运行会话才能计算所有计算结果,并且不容易调试

pytorch是动态图,可以和python的逻辑是一样的,要对变量做任何操作都是灵活的。

一个好的框架应该要具备三点:方便实现大计算图;可自动求变量的导数;可简单的运行在GPU上;pytorch都做到了,但是现在很多公司用的都是TensorFlow,而pytorch由于比较灵活,在学术科研上用得比较多一点。鄙人认为可能,Google可能下手早一些,而Facebook作后来者,虽然灵活,但是很多公司已经入了TensorFlow的坑了,要全部迁移出来还是很费功夫;而且,TensorFlow在GPU的分布式计算上更为出色,在数据量巨大时效率比pytorch要高一些,我觉得这个也是一个重要的原因吧。

pytorch胜过TensorFlow

区别2:可视化方面

可视化是理解模型性能和工作的关键。 tensorboard具有图形和模型的实时表示功能,非常方便;不仅可以获得神经网络的图形表示,还能够获得实时的损失和准确度图,用以描绘模型在特定迭代中的精确度。

pytorch和tensorflow起鼓相当

区别3 部署

tensorflow强于pytorch

具体表现:内置框架 TensorFlow Serving 帮助我们在特制的 gPRC 服务器上部署需要的模型,同时支持移动端部署模型;

                    同样支持分布式训练;

pytorch: 在部署时需要Flask或其他工具在模型上编写一个REST API

                    pytorch的分布式训练支持性能不理想

区别4 数据并行-----------很重要的区别之一

PyTorch 是声明式数据并行:用 torch.nn.DataParellel 封装任何模型,模型能在批处理维度上实现并行,这样你就可以毫不费力的使用多个 GPU;

tensorflow需要手动调整数据并行

note: 两个框架都支持分布式执行,提供用于定义集群的高水平界面

区别5 pytorch更像一个框架,tensorflow更像一个库

pytorch搭建模型时,编写框架会在特定区域为我们提供有用的抽象,用以解决具体问题;如引入datasets模块,它包含的封装器适用于DL架构的常见数据集;nn.Module用于搭建自定义模型;torch.nn包包含很多可用模块,作为构架模型的基础;pytorch用面向对象的方式定义基本程序块,通过扩展子类来构建DL框架

tensorflow给人的感觉更像一个库,所有操作都是低阶操作,需要些很多样本代码;由此,渐渐出现了一批围绕 TensorFlow 的高级封装器,如slim tflearn keras estimator等等;你在如何使用 TensorFlow 上有很大的自由度,同样也能自由选择使用最匹配任务的框架;

小结: TensorFlow 和 PyTorch 都能提供有用的抽象,减少样板代码的数量,加快模型的部署速度;二者的不同之处在于pytorch采用面向对象的方式;tensorflow有多种选择方式。

总结: tensorflow是谷歌开源的一款成熟强大的DL框架,有强大的可视化功能,高水平模型开发,强大的部署选项,支持移动平台,适用于以下情况:

(1)开发用于生产的模型; (2)开发需要在移动平台上部署的模型;(3)想要非常好的社区支持和较为全面的帮助文档;

(4) 想要丰富的多种形式的学习资源  (5) 想要或需要使用 Tensorboard  (6) 需要用到大规模的分布式模型训练

pytorch是facebook开源的一款强大的DL框架,适用于以下情况:

(1)正在做机器学习研究,或开发的产品在非功能性需求方面要求不高;(2) 想要获得更好的开发和调试经验;

(3)喜欢很有“Python 味”的东西

建议: 

        PyTorch因其动态的计算方法和简单性而越来越受欢迎。 建议初学者在继续使用TensorFlow之前在PyTorch上工作,这有助于他们专注于模型而不是花时间构建图形。

reference: 

                 https://zhuanlan.zhihu.com/p/37102973

                 https://www.jianshu.com/p/6e42dae05d3b

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Tensorflow,深度学习)