TensorFlow 2.12 和 Keras 2.12 的新功能?
2023 年 3 月 28 日

发布者:TensorFlow & Keras 团队

TensorFlow 2.12 和 Keras 2.12 已发布!此版本亮点包括新的 Keras 模型保存和导出格式、keras.utils.FeatureSpace 工具、SavedModel 指纹、TensorFlow 的 Python 3.11 轮子等等。

TensorFlow Core

SavedModel 指纹

使用 tf.saved_model.save 保存的模型现在带有一个指纹文件,其中包含哈希值,用于唯一标识 SavedModel。从模型内容中派生出多个指纹,允许您比较模型的结构、图形、签名和权重。在 RFC 中阅读更多关于指纹的信息,并查看 read_fingerprint API 和 Fingerprint 类。

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 运行时环境中以供稍后重新实例化时,它将与最初保存时完全相同。我们通过一种新的文件格式来实现这一点,称为 **“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 中重新加载它。默认情况下,此格式仅保留一个服务端点,即模型的前向传递,在重新加载后可作为 .serve() 获得。keras.export.ExportArchive 类提供了进一步的自定义选项。

在 2.13 版本中,keras_v3 将成为所有扩展名为 .keras 的文件的默认格式。该格式支持非数值状态,例如词汇文件和查找表,并且易于保存具有异域状态元素(例如 FIFOQueue)的自定义层。该格式不依赖于通过字节码或腌制加载任意代码,因此默认情况下是安全的。这对安全的机器学习来说是一个巨大的进步。请注意,由于这种以安全为中心的思维方式,Python lambdas 在加载时是不允许的。如果您想使用 lambda,并且您信任模型的来源,您可以在加载方法中传递 safe_mode=False

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

FeatureSpace

另一个令人兴奋的功能是引入了 keras.utils.FeatureSpace 工具。它使结构化数据的单步索引和预处理成为可能,包括特征哈希和特征交叉。请参阅 [特征空间教程](https://keras.org.cn/examples/structured_data/structured_data_classification_with_feature_space/) 了解更多信息。

与所有 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 调用的延迟。

跨 epochs 重新随机化

tf.datatf.data.Dataset.random() 中添加了一个新的 rerandomize_each_iteration 参数,以控制在每次 epoch 中是否应该重新随机化生成的随机数序列(默认行为)。如果设置了 seed 并且 rerandomize_each_iteration=Truerandom() 将在每次 epoch 中生成不同的(确定性)数字序列。当在相对较少的输入示例上进行训练时,这可能很有用,以确保模型不会学习该序列本身。

基础设施更新

  • Protobuf Python 运行时版本已升级至 4.21.9。所有 protobuf *_pb2.py 存根现在使用 protoc 3.21.9 生成。最小支持的 protobuf 运行时版本是 3.20.3。
  • 我们在此版本中发布了 TensorFlow 包的 Python 3.11 轮子!
  • 我们从本版本中移除了 Python 3.7 支持。展望未来,我们不再发布针对 Python 3.7 的补丁。
下一篇文章
What’s new in TensorFlow 2.12 and Keras 2.12?

TensorFlow & Keras 团队发布TensorFlow 2.12 和 Keras 2.12 已发布!此版本亮点包括新的 Keras 模型保存和导出格式、keras.utils.FeatureSpace 实用程序、SavedModel 指纹、TensorFlow 的 Python 3.11 轮子等等。TensorFlow CoreSavedModel 指纹使用 tf.saved_model.save 保存的模型现在附带指纹文件…