由 TensorFlow&Keras 团队发布
TensorFlow 2.12 和 Keras 2.12 已发布!有关此版本的亮点包括新的 Keras 模型保存和导出格式、keras.utils.FeatureSpace 实用程序、SavedModel 指纹、Python 3.11 的 TensorFlow wheels 等等。
TensorFlow 核心
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 的保存和序列化,以清晰地分离两个关键用例:
-
Python 保存和重新加载。 这是您将 Keras 模型保存以便以后在 Python 运行时中完全重新实例化它的情况。我们使用一个称为“Keras v3”格式(.keras)的新文件格式来实现这一点。您可以通过调用
model.save("your_model.keras", save_format="keras_v3")
来开始使用它。 -
模型导出,用于在可能根本不支持 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)的自定义层。该格式不依赖于通过字节码或 pickling 加载任意代码,因此默认情况下是安全的。这是安全机器学习的一个重大进展。请注意,由于这种安全第一的思维方式,Python lambda 在加载时被禁止使用。如果您想使用一个 lambda,并且您信任模型的来源,可以将 safe_mode=False
传递给加载方法。
传统格式(“h5”和基于 TF SavedModel 的”Keras SavedModel”格式)将继续得到支持。然而,我们建议您考虑采用新的 Keras v3 格式进行更丰富的 Python-side 模型保存/重新加载,并使用 export() 进行针对推理的模型导出。
FeatureSpace
另一个令人兴奋的功能是介绍了 keras.utils.FeatureSpace
实用程序。它使结构化数据的一步索引和预处理变得简单 - 包括特征哈希和特征交叉。请参见 特征空间教程 以获取更多信息。
与所有 Keras API 一样,FeatureSpace 以渐进式披露复杂性为目标构建,因此它是完全可定制的 - 您甚至可以指定依赖于您自己的预处理层的自定义特征类型。例如,如果您想创建一个编码文本段落的特征,只需要两行代码:
这只是发布亮点 - 还包括许多其他与 Keras 相关的改进,请务必查看 发布说明!
tf.data
热启动
tf.data
添加了支持热启动输入处理的功能。如果在 tf.data.experimental.OptimizationOptions
上 warm_start=True
,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 wheels!
- 我们取消了此版本的 Python 3.7 支持。今后,我们将不再为 Python 3.7 发布补丁。