TensorFlow 2.12 和 Keras 2.12 新功能简介

发布人: TensorFlow 和 Keras 团队

TensorFlow 2.12 和 Keras 2.12 现已发布!此版本的亮点包括全新的 Keras 模型保存和导出格式、keras.utils.FeatureSpace 实用程序、SavedModel 指纹识别、适用于 TensorFlow 的 Python 3.11 Wheel 软件包及更多内容。

TensorFlow Core

SavedModel 指纹识别

使用 tf.saved_model.save 保存的模型如今附带一个指纹文件,其中包含用于唯一标识 SavedModel 的哈希值。该机制可以根据模型内容生产多个指纹,以便您比较不同模型之间的结构、计算图、签名和权重。如需了解有关指纹识别的更多信息,您可以参阅 RFC,也可以查看 read_fingerprint APIFingerprint 类。

tf.function

tf.function 目前使用 Python inspect 库,来一致地模仿装饰函数的签名。经过装饰的行为和未经装饰的行为是相同的,甚至对于包装 (functools.wraps) 和部分应用 (functools.partial) 等复杂用法也是如此,这就是所谓的 “所见即所得”。

现在,我们可以检测不兼容的 tf.function 输入类型 (如不匹配的 functools.wraps 调用)。为了优化错误消息并提高一致性,我们还对类型约束逻辑 (input_signature) 进行了改进 (例如,某个不含参数的函数如今自动拥有 input_signature=[])。

此外,我们还添加了 experimental.extension_type.as_dict(),以将 tf.experimental.ExtensionType 转换为 Python dict

Keras

全新的模型格式

此版本中最重要的 Keras 新功能就是全新的模型导出格式。我们已经完全重新设计了 Keras 的保存和序列化,以清晰地区分两个关键用例:

  1. Python 保存和重新加载。当您保存 Keras 模型以便稍后在 Python 运行时将其重新实例化时,就会保存和重新加载 Python,而且重新加载的模型与保存时完全相同。我们会借助一个名为 “Keras v3” 格式 (.keras) 的全新文件格式实现此目标。您可以通过调用 model.save("your_model.keras", save_format="keras_v3") 开始使用此格式。

  2. 模型导出,用于在可能完全不支持 Python 的运行时 (例如 TF Serving 运行时) 中进行推理。您可以通过 model.export("your_model") 创建轻量级 (单一文件) 导出,然后通过 tf.saved_model.load("your_model") 在 TF Serving 或 Python 中重新加载。默认情况下,此格式仅保留一个 Serving 端点,即模型的前向传递,重新加载后可作为 .serve() 被调用。您可以通过 keras.export.ExportArchive 类进一步实现自定义。

在 2.13 版本中,keras_v3 将成为所有扩展名为 .keras 的文件的默认格式。此格式支持非数值状态,如词汇表文件和对照表,并且可以轻松保存具有特殊状态元素 (例如 FIFOQueue) 的自定义层。此格式并不依赖字节码或 pickling 加载任意代码,因此默认情况下十分安全。这是安全机器学习领域的一个重大进展。请注意,在这种安全第一的思维方式下,加载时会禁用 Python lambdas。如果您想使用 lambda 并且信任模型的来源,您可以将 safe_mode=False 传递给加载方法。

旧格式 (“h5” 和基于 TF SavedModel 的 “Keras SavedModel” 格式) 仍受支持。但我们建议您考虑采用全新的 Keras v3 格式以实现更丰富的 Python 端模型保存/重新加载,并使用 export() 进行推理优化模型导出。

FeatureSpace

此版本另外一个激动人心的功能是引入了 keras.utils.FeatureSpace 实用工具。此实用程序可实现对结构化数据进行一步索引和预处理,包括特征哈希和特征交叉。您可以参阅 特征空间教程 了解更多信息。

与所有 Keras API 一样,FeatureSpace 实用工具的设计考虑了渐进式呈现复杂性的原则,因此它支持完全自定义,您甚至可以指定依赖自有预处理层的自定义特征类型。例如,如果您想创建一个编码文本段落的特征,只需两行代码:

from tensorflow.keras import layers, utils

custom_layer = layers.TextVectorization(output_mode="tf_idf")

feature_space = utils.FeatureSpace(

    features={
        "text": FeatureSpace.feature(
            preprocessor=custom_layer, dtype="string", output_mode="float"
        ),
    },
    output_mode="concat",
)

以上只是亮点介绍,新版本还推出了许多其他与 Keras 相关的改进,您可以查看 版本说明,了解更多内容!

tf.data

温启动

tf.data 已新增对温启动输入处理的支持。如果 warm_start=True (在 tf.data.experimental.OptimizationOptions 上),tf.data 将会在迭代器创建过程中抢先启动后台线程 (而不是等待第一次调用 GetNext)。这使得用户可以缩短初始 GetNext 调用的延迟时间,但此过程需要消耗更多内存用量。

跨周期重新随机化

tf.data 向 tf.data.Dataset.random() 添加了一个全新的 rerandomize_each_iteration 参数,用于控制每个周期内所生成的随机数字的顺序是否应该重新随机排列,或是保持不变 (默认情况)。如果设置了 seed,并且 rerandomize_each_iteration=True,则 random() 将在每个周期生成不同的 (确定性) 数字序列。这在对相对较少的输入示例进行训练时十分有用,可以确保模型不会学习序列本身。

基础设施更新

  • Protobuf Python 运行时版本升级到 4.21.9。目前所有 protobuf *_pb2.py 存根均使用 protoc 3.21.9 生成。受支持的最低 protobuf 运行时版本为 3.20.3。

  • 我们在此版本中发布了适用于 TensorFlow 软件包的 Python 3.11 Wheel 软件包!

  • 我们从此版本中移除了对 Python 3.7 的支持。今后,我们将不再为 Python 3.7 发布补丁程序。

原文:What’s new in TensorFlow 2.12 and Keras 2.12?
中文:TensorFlow 公众号