März 28, 2023 — Posted by the TensorFlow & Keras teamsTensorFlow 2.12 and Keras 2.12 have been released! Highlights of this release include the new Keras model saving and exporting format, the keras.utils.FeatureSpace utility, SavedModel fingerprinting, Python 3.11 wheels for TensorFlow and many more.TensorFlow CoreSavedModel FingerprintingModels saved with tf.saved_model.save now come with a fingerprint fil…
Posted by the TensorFlow & Keras teams
TensorFlow 2.12 and Keras 2.12 have been released! Highlights of this release include the new Keras model saving and exporting format, the keras.utils.FeatureSpace
utility, SavedModel fingerprinting, Python 3.11 wheels for TensorFlow and many more.
Models saved with tf.saved_model.save
now come with a fingerprint file containing hashes to uniquely identify the SavedModel. Multiple fingerprints are derived from the model content, allowing you to compare the structure, graph, signatures, and weights across models. Read more about fingerprinting in the RFC and check out the read_fingerprint
API and Fingerprint
class.
tf.function
now uses the Python inspect
library to consistently mimic the decorated function’s signature. WYSIWYG: decorated and non-decorated behavior is identical, even for complex uses like wrapping (functools.wraps
) and partial application (functools.partial
).
We now detect incompatible tf.function
input types (such as mismatched functools.wraps
calls). Additionally, we have improved type constraining logic (input_signature
) for better error messages and consistency (e.g. a function with no parameters now automatically has input_signature=[]
).
Additionally, we have added experimental.extension_type.as_dict()
to convert tf.experimental.ExtensionType
s to Python dict
s.
The biggest new Keras feature in this release is the new model export formats. We've completely reworked Keras saving and serialization to cleanly separate two key use cases:
1. Python saving & reloading. This is when you save a Keras model to re-instantiate it later in a Python runtime, exactly as it was. We achieve this with a new file format, called the "Keras v3" format (.keras
). You can start using it by callingmodel.save("your_model.keras", save_format="keras_v3")
.
2. Model export for inference in a runtime that might not support Python at all (e.g. the TF Serving runtime). You can create a lightweight (single-file) export viamodel.export("your_model")
– and reload it in TF Serving or Python viatf.saved_model.load("your_model")
. By default, this format only preserves a single serving endpoint, the forward pass of the model, available upon reload as.serve()
. Further customization is available through thekeras.export.ExportArchive
class.
In the 2.13 release, keras_v3
will become the default for all files with the .keras
extension. The format supports non-numerical state such as vocabulary files and lookup tables, and it is easy to save custom layers with exotic state elements (such as a FIFOQueue
). The format does not rely on loading arbitrary code through bytecode or pickling, so it is safe by default. This is a big advance for secure ML. Note that due to this safety-first mindset, Python lambdas
are disallowed at loading time. If you want to use a lambda
, and you trust the source of the model, you can pass safe_mode=False
to the loading method.
The legacy formats ("h5" and "Keras SavedModel" format based on TF SavedModel) will stay supported in perpetuity. However, we recommend that you consider adopting the new Keras v3 format for richer Python-side model saving/reloading, and using export()
for inference-optimized model export.
Another exciting feature is the introduction of the keras.utils.FeatureSpace
utility. It enables one-step indexing and preprocessing of structured data – including feature hashing and feature crossing. See the [feature space tutorial](https://keras.io/examples/structured_data/structured_data_classification_with_feature_space/) for more information.
Like all Keras APIs, FeatureSpace
is built with progressive disclosure of complexity in mind, so it is fully customizable – you can even specify custom feature types that rely on your own preprocessing layers. For instance, if you want to create a feature that encodes a text paragraph, that's just two lines of code:
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",
) |
tf.data
has added support for warm-starting input processing. If warm_start=True
(on tf.data.experimental.OptimizationOptions
), tf.data will start preemptively start background threads during iterator creation (instead of waiting for the first call to GetNext
). This allows users to improve latency to the initial GetNext
call at the expense of higher memory usage.tf.data
added a new rerandomize_each_iteration
argument to tf.data.Dataset.random()
, to control whether the sequence of generated random numbers should be re-randomized every epoch, or not (the default behavior). If seed
is set and rerandomize_each_iteration=True
, random()
will produce a different (deterministic) sequence of numbers every epoch. This can be useful when training over a relatively smaller number of input examples to ensure that the model doesn’t learn the sequence itself.März 28, 2023 — Posted by the TensorFlow & Keras teamsTensorFlow 2.12 and Keras 2.12 have been released! Highlights of this release include the new Keras model saving and exporting format, the keras.utils.FeatureSpace utility, SavedModel fingerprinting, Python 3.11 wheels for TensorFlow and many more.TensorFlow CoreSavedModel FingerprintingModels saved with tf.saved_model.save now come with a fingerprint fil…