TF学习系列1:Tensorflow 发展史

本文探讨了Tensorflow的发展历程,从其前身DistBelief到Tensorflow 2.0的改进,以及与PyTorch的比较。在学术界,PyTorch因其易用性和调试便利性而受到青睐,而工业界更倾向于Tensorflow,尤其是对于大规模部署和生产环境。Tensorflow的Tensorboard提供强大的可视化工具,而PyTorch则以动态图和Python原生编程体验受到喜爱。两者各有优势,选择取决于项目需求。
摘要由CSDN通过智能技术生成

参考:

https://www.zhihu.com/question/446540609/answer/1760866290

引言: 深度学习工具

2021年了,深度学习框架已经有很多了,甚至有很多微信文章教你搭建自己的深度学习框架。我们先来了解下当下热门的一些框架:谷歌的TensorFlow、Facebook的Pytorch。

1. Tensorflow

TensorFlow框架的前身是Google的DistBelief V2,是谷歌大脑项目的深bai度网络工具库,一些人认为TensorFlow是借鉴Theano重构的。首先目前面临比较麻烦的事情是版本分裂严重,2.0推出之后到2.4之间的版本几乎不可用,接口变更太多,runtime效率比1.X普遍损失50%左右的性能。另外缺少符号循环,当我们说可变长度序列时, 更需要该功能。不幸的是, TensorFlow不提供功能, 但是有限折叠可以解决这个问题。好处是有着庞大的维护团队,看看Google AI blog 每个月好几篇AI创新文章,基本上都是基于Tensorflow开发,另外还提供富有挑战性的数据集挑战赛。还是挺过瘾的。SUM:TensorFlow更适合大规模部署,特别是需要跨平台和嵌入式部署时。

2. Pytorch

PyTorch是Facebook出品的。本质上是Numpy的替代者,而且支持GPU、带有高级功能,可以用来搭建和训练深度神经网络。如果你熟悉Numpy、Python以及常见的深度学习概念(卷积层、循环层、SGD等),会非常容易上手PyTorch。基本上可以做到Python Native的编程模式。当然缺点是有的,例如在做大规模分布式并行的时候、大模型大击群、端侧部署和安全可信部署的时候,需要定制性修改大量的代码。SUM:PyTorch更有利于研究人员、爱好者、小规模项目等快速搞出原型。

转自链接:https://www.zhihu.com/question/446540609/answer/1760657429 来源:知乎

由上可见,Tensorflow在推出第二代框架后,出现了不少问题(接口变太多,运行效率低),这也是为什么TF2的keras语法看起来那么易懂的情况下,仍有很多人继续学习、使用TF1。目前广泛认为学术界使用pytorch多,因为好上手,调试方便;而工业界使用TF更多些,TF毕竟起步早,在工业部署方面打下的基础要由于pytorch,还有Google不遗余力地投入资源。所以很多文章给出的建议是两者都学习一下。最后附上维基百科查到的深度学习工具比较。 https://en.wikipedia.org/wiki/Comparison_of_deep-learning_software

 

言归正传,开始介绍Tensorflow是如何发展起来的。以下主要参考维基百科 https://en.wikipedia.org/wiki/TensorFlow

1. 前身:DistBelief 

从2011年开始,Google Brain将DistBelief构建为基于深度学习神经网络的专用机器学习系统。在研究和商业应用中,它的使用在不同的Alphabet中迅速增长。Google指派了包括Jeff Dean在内的多位计算机科学家,以将DistBelief的代码库简化和重构为一个更快,更强大的应用程序级库,该库成为TensorFlow。在2009年,由杰弗里·欣顿Geoffrey Hinton)领导的小组实施了广义反向传播 以及其他改进措施,使生成的神经网络具有更高的准确性,例如,语音识别错误减少了25%。

2. 发布:Tensorflow 

TensorFlow是Google Brain的第二代系统。版本1.0.0于2017年2月11日发布。TensorFlow可以在多个CPUGPU上运行(具有可选的CUDASYCL扩展)。TensorFlow可在64位LinuxmacOSWindows以及包括AndroidiOS在内的移动计算平台上使用。其灵活的体系结构允许在各种平台(CPU,GPU,TPU)之间以及从台式机到服务器集群再到移动设备和边缘设备的轻松部署计算。

TensorFlow计算表示为有状态 数据流 。TensorFlow的名称源自此类神经网络对多维数据数组执行的操作,这些操作称为张量。在2016年6月的Google I / O大会上,Jeff Dean表示GitHub上的1,500个存储库提到了TensorFlow,其中只有5个来自Google。

2017年12月,来自Google,Cisco,RedHat,CoreOS和CaiCloud的开发人员在会议上介绍了Kubeflow。Kubeflow允许在Kubernetes上运行和部署TensorFlow 。

2018年3月,Google宣布了TensorFlow.js 1.0版,用于JavaScript中的机器学习。

2019年1月,谷歌宣布了TensorFlow 2.0。它于2019年9月正式可用。

2019年5月,谷歌宣布TensorFlow Graphics用于计算机图形学的深度学习。

3. 其他助力

为了更好地推广和使用TF,Google发布了以下作为助力。

Tensor processing unit (TPU)在2016年5月,谷歌宣布其张量处理单元(TPU),一个应用专用集成电路专为内置(ASIC,一个硬件芯片)机器学习和TensorFlow量身定做。TPU是可编程的AI加速器,旨在提供高吞吐量的低精度算术(例如8位),并且面向使用或运行模型,而不是训练模型。谷歌宣布,他们已经在数据中心内部运行了TPU一年以上,并发现它们提供了每瓦更好的优化性能一个数量级。用于机器学习。2017年5月,Google宣布了第二代产品以及TPU在Google Compute Engine中的可用性。第二代TPU提供高达180 teraflops的性能,当组织为64个TPU的集群时,可提供高达11.5 petaflops。在2018年5月,谷歌宣布了第三代TPU,可提供高达420 teraflops的性能和128 GB的高带宽内存(HBM)。Cloud TPU v3 Pods提供100 PB以上的性能和32 TB HBM。Google在2018年2月宣布,他们将在Google Cloud Platform上提供beta版的TPU 。

Edge TPU Edge TPU于2018年7月发布。Edge TPU是Google专门设计的ASIC芯片,旨在在小型客户端计算设备(例如称为边缘计算的智能手机)上运行TensorFlow Lite机器学习(ML)模型。

TensorFlow Lite 2017年5月,谷歌发布了专门用于移动开发的软件TensorFlow Lite。在2019年1月,TensorFlow团队发布了移动GPU推理引擎的开发人员预览版,其中包括Android设备上的OpenGL ES 3.1 Compute Shaders和iOS设备上的Metal Compute Shaders。[在2019年5月,Google宣布其TensorFlow Lite Micro(也称为微控制器TensorFlow Lite)和ARM的uTensor将合并。TensorFlow Lite使用FlatBuffers作为网络模型的数据序列化格式,而避开了标准TensorFlow模型使用的协议缓冲区格式。

Pixel Visual Core(PVC)2017年10月,谷歌发布了Google Pixel 2,该产品采用了Pixel Visual Core(PVC),这是一种针对移动设备的完全可编程的图像视觉AI处理器。PVC支持用于机器学习的TensorFlow(以及用于图像处理的Halide)。

Colaboratory:这是一个TensorFlow Jupyter笔记本环境,不需要使用任何设置。

Machine Learning Crash Course(MLCC)Google在2018年3月1日发布了其机器学习速成课程(MLCC)。最初旨在帮助Google员工掌握实用的人工智能和机器学习基础知识的Google,最终在向公众发布该课程之前,在全球多个城市推出了免费的TensorFlow工作坊。

4. 改进:TensorFlow 2.0 

在2016年发布PyTorch之后,TensorFlow的受欢迎程度下降了。TensorFlow团队宣布于2019年9月发布该库的一个新的主要版本。TensorFlow2.0引入了许多更改,其中最重要的是TensorFlow keras,从而改变了自动微分方案从静态的计算图表,对“定义,由润”计划最初是由制造流行Chainer后来PyTorch。其他重大变化包括删除旧库,在不同版本的TensorFlow上经过训练的模型之间的交叉兼容性以及对GPU性能的重大改进。

5. Tensorflow vs Pytorch

最后我们来简单谈谈他们两者的区别体现在哪里。参考自:

https://realpython.com/pytorch-vs-tensorflow/

https://towardsdatascience.com/pytorch-vs-tensorflow-spotting-the-difference-25c75777377b

https://towardsdatascience.com/tensorflow-or-pytorch-146f5397278a

https://www.tooploox.com/blog/pytorch-vs-tensorflow-a-detailed-comparison

https://www.udacity.com/blog/2020/05/pytorch-vs-tensorflow-what-you-need-to-know.html

差异1-动态图与静态图的定义

这两个框架都在张量上运行,并且可以将任何模型视为有向无环图(DAG),但是在定义它们的方式上却大不相同。

TensorFlow遵循“数据即代码,代码即数据”的习惯用法。在TensorFlow中,你可以在模型运行之前静态定义图。与外部世界的所有通信都是通过tf.Session对象执行的,tf.Placeholder这些对象是在运行时将由外部数据替换的张量。

在PyTorch中,事情变得更加必要和动态:你可以随时定义,更改和执行节点,而无需特殊的会话接口或占位符。总体而言,该框架与Python语言更加紧密地集成在一起,并且在大多数情况下感觉更加原生。当你使用TensorFlow编写代码时,有时会觉得你的模型位于一堵砖墙后面,砖墙上有几个小孔可以进行通信。 

差异2-调试

由于PyTorch中的计算图是在运行时定义的,因此你可以使用我们最喜欢的Python调试工具,例如pdb,ipdb,PyCharm调试器或旧的可信赖的打印语句。

TensorFlow并非如此,可以选择使用称为tfdbg的特殊工具,该工具允许在运行时评估tensorflow表达式并浏览会话范围内的所有张量和操作。当然,你将无法使用它调试任何python代码,因此有必要单独使用pdb。

 

差异3-可视化

关于可视化,Tensorboard很棒。该工具随TensorFlow一起提供,对于调试和比较不同的训练运行非常有用。例如,考虑你训练了一个模型,然后调整了一些超参数并再次对其进行了训练。两种运行都可以同时显示在Tensorboard上,以显示可能的差异。Tensorboard可以:

  • 显示模型图
  • 绘制标量变量
  • 可视化分布和直方图
  • 可视化图像
  • 可视化嵌入
  • 播放音讯

Tensorboard可以显示可以通过tf.summary模块收集的各种摘要,tf.summary.FileWriter 将其用于保存到磁盘。

要启动Tensorboard,请执行tensorboard --logdir=./tensorboard。由于该工具是一个Web应用程序,因此在云实例上使用非常方便。

来自PyTorch方面的Tensorboard竞争对手是无处不在的。它不功能齐全,但是使用起来更方便。此外,确实存在与Tensorboard的集成。此外,你可以自由使用标准的绘图工具- matplotlibseaborn

差异4 –部署

如果我们开始谈论部署,那么TensorFlow无疑是目前的赢家:有TensorFlow Serving,这是一个在专用gRPC服务器上部署模型的框架。还支持移动设备。

当我们切换回PyTorch时,我们可以使用Flask或其他替代方法在模型之上编写REST API。如果gRPC不适合你的用例,也可以使用TensorFlow模型来完成。但是,如果需要考虑性能,TensorFlow Serving可能是更好的选择。

Tensorflow还支持PyTorch目前缺乏的分布式训练。

差异5 –数据并行性

PyTorch与TensorFlow的最大区别之一是 声明式数据并行: 你可以使用 torch.nn.DataParallel包装任何模块,它将(几乎神奇地)在批处理维度上并行化。这样,你几乎可以毫不费力地利用多个GPU。

另一方面,TensorFlow允许你微调要在特定设备上运行的每个操作。但是,定义并行性是更手动的方式,需要仔细考虑。

就是说,使用TensorFlow时,你可以实现在PyTorch中可以做的所有事情,但是要付出更多的努力(作为奖励,你可以拥有更多的控制权)。

同样值得注意的是,这两个框架都支持分布式执行,并提供了用于定义集群的高级接口。

差异6 –框架或库

PyTorch看起来像一个框架,编程框架为我们提供了特定领域中的有用对象,以及使用它们来解决具体问题的便捷方式。这就是将框架与库分开的本质。

datasets模块,其中包含用于基准深度学习架构的流行数据集的包装。nn.Module用于构建自定义卷积神经网络分类器。PyTorch为我们提供了一个构建基块,以创建复杂的深度学习体系结构。torch.nn软件包中有大量现成的模块,我们可以将其用作模型的基础。请注意,PyTorch如何使用面向对象的方法来定义基本的构建基块,并为我们提供一些“轨道”,同时提供通过子类扩展功能的能力。

普通的TensorFlow感觉上更像是一个库而不是一个框架:所有操作都是非常底层的,即使你不想这样做,也需要编写很多样板代码(让我们一遍又一遍地定义那些偏见和权重... )。

随着时间的流逝,围绕TensorFlow出现了一个完整的高级包装生态系统。所有这些目的都是为了简化你使用库的方式。它们中的许多当前位于tensorflow.contrib模块(不被认为是稳定的API)上,并且其中一些开始迁移到主存储库中(请参阅参考资料tf.layers)。

所以,你必须对如何使用TensorFlow的什么框架将适合的任务最好的一个很大的自由度:TFLearntf.contrib.learnKerastf.layers等。

因此,TensorFlow和PyTorch之间的主要区别在于,PyTorch可能会感觉更“ pythonic”,并且具有面向对象的方法,而TensorFlow有多个选项可供选择。

PyTorch更加清晰和易于开发,torch.nn.Module使你能够以OOP方式定义可重用模块,而我发现这种方法非常灵活和强大。你可以通过torch.nn.Sequential(hi Keras hi)编写所有类型的模块。另外,你还具有function 形式的所有内置模块,这可能非常方便。总体而言,API的所有部分都可以很好地配合使用。

当然,你可以在普通的TensorFlow中编写非常干净的代码,但在获得此代码之前,它需要更多的技巧和反复试验。当涉及Keras或TFLearn之类的更高级别的框架时,准备失去TensorFlow所提供的至少一些灵活性。

差异7-生产还是研究

如果要生产解决方案或在神经网络中进行研究是不同的。在这种情况下,决定选择哪一个很重要。

TensorFlow是一个非常强大且成熟的Python库,具有强大的可视化功能和各种用于高性能模型开发的选项。它具有准备用于生产的推出选项,并自动支持Web和移动平台。

另一方面,PyTorch仍然是一个年轻的框架,但是拥有一个非常活跃的社区,尤其是在研究领域。该门户网站的渐变中显示附图所示PyTorch的兴起和应用基础上,发表在各大会议的主题(CVPR,ICRL,ICML,NIPS,ACL,ICCV等)的研究论文数量的研究团体。

 

从2018年的图中可以看出,与2019年相比,PyTorch框架的使用很少。因此,如果你要创建与人工智能相关的产品,TensorFlow是一个不错的选择。如果你想进行研究,我建议使用PyTorch。

TensorFlow和PyTorch都是出色的工具,它们使数据科学家的生活更加轻松和美好。当谈到选择最好的一个,它是不是第一个或第二个。这与要传递的期望效果有关。

两种框架都各有利弊。在优秀的开发人员双方的共同努力下,两个框架都只会变得更好,并弥补它们的缺点,这自然是很自然的,这使得比较更加困难,差异也不太明显。因此,当问“选择哪一个?”这个问题时 最好的答案是“最适合该项目的人。” 

最后,这两种工具都不是处于真空状态。他们不断地相互影响,模仿自己最方便的解决方案,同时抛弃过时的解决方案。因此,很可能在不久的将来两者都将类似于不可区分的观点。因此,实际上,很快就不会有像问题一样的“更好的TensorFlow或PyTorch”了。

结论

TensorFlow是一个功能强大且成熟的深度学习库,具有强大的可视化功能以及用于高级模型开发的多种选项。它具有可用于生产环境的部署选项,并支持移动平台。如果你满足以下条件,TensorFlow是一个不错的选择:

  • 开发生产模型
  • 开发需要部署在移动平台上的模型
  • 想要良好的社区支持和全面的文档
  • 想要各种形式的丰富学习资源(TensorFlow具有完整的MOOC
  • 想要或需要使用Tensorboard
  • 需要使用大规模的分布式模型训练

PyTorch仍然是一个年轻的框架,正在迅速发展。如果你满足以下条件,则可能会很合适:

  • 做研究或的生产非功能性要求不是很严格
  • 想要更好的开发和调试经验
  • 热爱Pythonic

github有一个对比代码,感兴趣的同学可以看看 https://github.com/kdubovikov/tf-vs-pytorch/blob/master/pytorch_vs_tf_simple_model.ipynb

在TensorFlow和PyTorch中创建神经网络的方式并没有真正的区别,除了在一些细节方面,程序员必须实现训练和评估循环的方式以及一些超参数喜欢epochsbatch_size在不同的步骤中指定。

实际上,这两个框架在过去两年中一直在不断融合,相互学习并采用它们的最佳功能。例如,在TensorFlow 2.2中,训练步骤可以等同于PyTorch,现在程序员可以通过实现来指定循环主体的详细内容traint_step()。因此,不必担心选择“错误的”框架,它们会融合!最重要的是要学习背后的深度学习概念,你在其中一个框架中获得的所有知识将在另一个框架中对你有用。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dujiahei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值