TensorFlow 2.x与1.x版本的编程范式变革

从声明式到命令式的转变

TensorFlow 1.x版本采用了声明式(Declarative)的编程范式。开发者需要首先构建一个计算图,定义所有操作和变量,然后在一个会话(Session)中执行这个图。这种方式需要预先定义完整的计算流程,包括占位符(placeholder)和变量初始化等步骤,代码较为冗长且调试困难。而在TensorFlow 2.x中,默认采用急切执行(Eager Execution)模式,这是一种命令式(Imperative)的编程方式。代码会立即被执行并返回结果,就如同使用普通的Python库一样,这使得开发过程更加直观,便于调试和迭代,极大地降低了入门门槛。

API的简化与清理

TensorFlow 2.x对API进行了大规模的精简和重构,移除了大量冗余的API,并推广使用Keras作为构建和训练模型的高级API。在TensorFlow 1.x中,复杂的层定义、损失函数和优化器需要较多的样板代码。而在2.x中,通过tf.keras,可以用更简洁的代码实现相同的功能,例如使用`tf.keras.Sequential`快速堆叠模型层。同时,诸如变量作用域(variable_scope)等概念被移除,取而代之的是更符合Python习惯的面向对象设计。

会话(Session)的消亡

会话(Session)是TensorFlow 1.x的核心概念之一,所有计算图的运行都必须在会话中进行,通过`sess.run()`来触发。这不仅增加了代码的复杂性,也使理解程序执行流程变得困难。TensorFlow 2.x彻底移除了会话机制,在急切执行模式下,函数和操作会直接被计算,无需构建会话。对于需要图执行以获得性能优势的场景,可以使用`@tf.function`装饰器将Python函数转换为高效的TensorFlow图,实现了命令式编程的易用性与声明式编程的性能优势相结合。

变量与初始化的改进

在TensorFlow 1.x中,变量的初始化是一个显式步骤,需要在会话中调用`tf.global_variables_initializer()`来执行,容易因忘记初始化而导致错误。TensorFlow 2.x中,变量在创建后即可使用,初始化是即刻进行的。此外,1.x中用于接收输入数据的占位符(placeholder)也被移除,取而代之的是普通的Python函数参数,数据可以直接传递给模型,使得数据输入管道更加清晰和易于管理。

对深度学习开发的影响

这些变革对深度学习开发产生了深远影响。TensorFlow 2.x通过降低框架的复杂性,使得研究人员和工程师能够更快速地构建原型和进行实验,将精力更多地集中在模型结构和算法本身,而非框架的细节上。Keras的深度集成提供了用户友好的接口,同时又保持了足够的灵活性以支持高级定制。`tf.function`的引入使得开发者可以在开发阶段享受急切执行的便利,在部署阶段无缝切换到静态图的高性能模式,实现了开发效率与运行时性能的良好平衡。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐