揭秘 TensorFlow 2.x 的强大之处:执行模式和模型构建 API 全面入门指南





5.00/5 (1投票)
本文提供了 TensorFlow 2.x 的综合指南,涵盖了其执行模式、模型构建 API 以及为机器学习项目选择正确方法的见解。
执行模式:TensorFlow 行为的核心
TensorFlow 2.x 支持两种主要的执行模式:即时执行(eager execution)和图模式(graph mode)。
1. 即时执行:入门
- 它是什幺:TensorFlow 2.x 的默认模式,其中操作会立即执行,类似于常规的 Python 代码。
- 它为什幺重要:简化了开发和调试,提供了交互式体验。
- 示例:
import tensorflow as tf x = tf.constant([[2, 3], [4, 1]]) y = tf.constant([[1, 5], [2, 1]]) result = tf.matmul(x, y) print(result)
2. 图模式:优化性能
TensorFlow 2.x 默认主要以即时执行模式运行。但是,您仍然可以通过使用 @tf.function
装饰函数,或者在 tf.compat.v1.Session()
的上下文中执行 TensorFlow 操作来使用图模式。当您使用 @tf.function
时,TensorFlow 会跟踪该函数并构建一个计算图来表示函数中的操作。然后,该图可以高效地执行,类似于传统的图模式。您可以通过检查即时执行是否启用 (tf.executing_eagerly()
),或者观察您是否正在使用 tf.function
或 tf.compat.v1.Session()
来判断您是否处于图模式。
- 它是什幺:构建一个
静态
计算图,用于跨各种硬件进行优化和部署。 - 它为什幺重要:提高了性能,并便于在不同平台上部署。
- 访问图模式:
tf.function
装饰器:将 Python 函数转换为与图兼容的操作- AutoGraph:自动转换
tf.function
函数中的控制流语句 - 检查图模式:您可以使用
tf.executing_eagerly()
来确定您是否处于图模式。
AutoGraph 和 tf.function
AutoGraph 是 TensorFlow 2.x 中引入的一项功能,在使用 tf.function
时,它会自动将 Python 控制流语句转换为相应的 TensorFlow 图操作。当您使用 @tf.function
装饰一个 Python 函数时,AutoGraph 会分析函数的控制流,并将循环和条件语句等 Python 结构转换为 TensorFlow 兼容的操作。开发者可以利用 AutoGraph 的优化来提高性能和与图模式执行的兼容性。AutoGraph 是您使用 tf.function
时发生的过程的一部分。它通过将 Pythonic 控制流转换为与图兼容的操作来自动优化您的代码,无需显式用户干预。您不需要显式进入“AutoGraph 模式”。相反,AutoGraph 无缝集成到使用 tf.function
的过程中。但是,区分 @tf.function
和 @tf.py_function
很重要:前者用于将 Python 函数转换为图函数以提高性能,而后者则有助于在 TensorFlow 操作内执行任意 Python 代码。
关于 @tf.function 和 @tf.py_function 的详细信息
现在,让我们深入探讨 @tf.function
和 @tf.py_function
之间的区别。
-
@tf.function
:此装饰器用于将 Python 函数转换为 TensorFlow 图函数。它会跟踪函数内的操作,并构建这些操作的图表示。这可以提高性能并改进执行效率,尤其是在使用 TensorFlow 的符号执行功能时。@tf.function
通常用于将 Python 函数转换为图函数。 -
@tf.py_function(Tout=tf.uint8)
:此装饰器用于包装 Python 函数并将其转换为 TensorFlow 操作。它允许您在 TensorFlow 操作中使用任意 Python 代码。Tout
参数指定输出张量的数据类型。当您需要应用 TensorFlow 不直接支持的复杂操作,或在 TensorFlow 操作中与 Python 库进行交互时,@tf.py_function
非常有用。
TensorFlow 中的模型构建
TensorFlow 2.x 提供了不同的 API 来构建模型,以满足不同的项目复杂度和用户偏好。
1. 符号 API:简单的方式
- Sequential API:适用于简单的、线性的层堆叠。
model = tf.keras.models.Sequential([ tf.keras.layers.Dense(10, activation='relu'), tf.keras.layers.Dense(1, activation='sigmoid') ])
- Functional API:适用于具有多个输入/输出、非线性拓扑或共享层的复杂模型。
inputs = tf.keras.Input(shape=(784,)) x = tf.keras.layers.Dense(64, activation='relu')(inputs) x = tf.keras.layers.Dense(64, activation='relu')(x) outputs = tf.keras.layers.Dense(10)(x) model = tf.keras.Model(inputs=inputs, outputs=outputs)
2. 命令式 API(模型子类化):最大灵活性
- 它是什幺:提供对模型定义的完全控制,最适合实验性或高度定制化的场景。
- 示例:
class MyModel(tf.keras.Model): def __init__(self): super(MyModel, self).__init__() self.dense1 = tf.keras.layers.Dense(64, activation='relu') self.dense2 = tf.keras.layers.Dense(10) def call(self, inputs): x = self.dense1(inputs) return self.dense2(x)
选择合适的 API:一种简化方法
- 符号 API:易于用于简单的模型,适合初学者。
- 函数式 API:为复杂模型提供灵活性,平衡了易用性和定制性。
- 命令式 API:高级用户可以利用其最大程度的控制和灵活性,尽管复杂性有所增加。
超越基础
- 数据管道:利用
tf.data
API 进行流线型的数据输入和预处理。 - 部署:探索 TensorFlow Lite(用于移动端)、TensorFlow.js(用于 Web 端)和 TensorFlow Serving(用于生产环境)以在各种平台上部署您的模型。
为您的项目选择合适的 API
现在我们已经介绍了 TensorFlow 2.x 中的符号 API、函数式 API 和命令式 API,了解如何为您的项目选择合适的 API 至关重要。每个 API 都具有其自身的优点和局限性,这对于您机器学习项目的成功至关重要。
符号 API
符号 API,以 Keras Sequential 和 Functional API 为代表,为构建机器学习模型提供了一个高级抽象。这些 API 非常适合模型结构与层堆叠或有向无环图(DAG)一致的项目。如果您的重点是模型检查、调试和测试,符号 API 提供了一种一致且直观的方式来定义和操作您的神经网络架构。符号 API 通常在图模式下使用。
函数式 API
TensorFlow 2.x 引入的函数式 API 为开发人员提供了一种灵活的构建复杂模型的方法。这些 API 在您的模型需要非线性拓扑、共享层或多个输入/输出的情况下表现出色。虽然主要在即时模式下使用,但函数式 API 在被 tf.function
包装时也可以在图模式下使用。如果您的项目需要复杂的架构和高效的模型构建,函数式 API 可提供必要的灵活性和可扩展性。函数式 API 主要在即时模式下使用,但在被 tf.function
包装时也可以在图模式下使用。
命令式 API
对于优先考虑最大灵活性和定制化的开发人员来说,以 Keras Subclassing API 为例的命令式 API 是不二之选。通过允许以命令式方式构建模型,类似于编写 NumPy 或面向对象的 Python 代码,命令式 API 在定义模型前向传播方面提供了无与伦比的自由度。然而,这种灵活性带来了比符号 API 更复杂的调试和更低的重用性。命令式 API 通常在即时模式下使用,使其成为快速原型设计和实验的理想选择。命令式 API 通常在即时模式下使用。
⚠️ 明智选择 ⚠️
在为您的项目选择合适的 API 时,请考虑模型的复杂性、所需的定制程度以及调试和维护的便捷性等因素。虽然符号 API 提供了一种结构化且直观的方法,但函数式 API 为复杂的架构提供了灵活性,而命令式 API 则赋予开发人员最大的控制权。通过了解每个 API 的优点和局限性,您可以做出符合您项目目标和开发偏好的明智决定。
符号张量及其在模型构建中的作用
符号张量在 TensorFlow 2.x 中构建模型时发挥着至关重要的作用,尤其是在使用 Sequential 和 Functional API 时。与常规张量不同,符号张量不持有具体的值,而是作为计算图中的占位符。这一特性支持动态计算,并有助于创建复杂的神经网络架构,而无需预定义值。
理解符号张量
符号张量是 TensorFlow 计算图中的占位符,允许在没有显式赋值的情况下定义模型结构。这些张量在模型构建中提供了灵活性,并促进了图中的操作,而无需在模型定义阶段需要具体值。
在模型构建中的应用
在 TensorFlow 2.x 中,符号张量广泛用于使用 Sequential 和 Functional API 定义神经网络架构。通过指定输入形状和层配置,符号张量为模型中的数据流创建了一个框架,从而在训练和推理期间实现动态计算。
与常规张量的区别
与持有具体数值的常规张量不同,符号张量在计算图中充当符号占位符。这种抽象允许创建通用的模型,这些模型可以处理不同的输入数据,而无需在模型定义过程中进行显式赋值。
结论
TensorFlow 2.x 多样化的 API 使开发人员能够精确高效地处理各种机器学习任务。无论您选择符号 API、函数式 API 还是命令式 API,每种 API 都提供了针对特定项目需求的独特优势。通过利用合适的 API 并理解其细微差别,您可以充分发挥 TensorFlow 2.x 的潜力,构建推动创新和产生影响的前沿机器学习模型。
有趣的阅读
历史
- 2024 年 3 月 4 日:初始版本