![]() | ![]() | ![]() | ![]() |
Bienvenue dans le guide complet de la formation prenant en charge la quantification Keras.
Cette page documente divers cas d'utilisation et montre comment utiliser l'API pour chacun d'eux. Une fois que vous savez de quelles API vous avez besoin, recherchez les paramètres et les détails de bas niveau dans la documentation de l' API .
- Si vous souhaitez voir les avantages de la formation prenant en charge la quantification et ce qui est pris en charge, consultez la présentation .
- Pour un exemple unique de bout en bout, consultez l' exemple de formation prenant en charge la quantification .
Les cas d'utilisation suivants sont couverts:
- Déployez un modèle avec une quantification 8 bits avec ces étapes.
- Définissez un modèle prenant en charge la quantification.
- Pour les modèles Keras HDF5 uniquement, utilisez une logique de point de contrôle et de désérialisation spéciale. La formation est par ailleurs standard.
- Créez un modèle quantifié à partir du modèle prenant en charge la quantification.
- Expérimentez la quantification.
- Tout ce qui est destiné à l'expérimentation n'a pas de chemin de déploiement pris en charge.
- Les couches Keras personnalisées relèvent de l'expérimentation.
Installer
Pour trouver les API dont vous avez besoin et comprendre les objectifs, vous pouvez exécuter mais ignorer la lecture de cette section.
! pip uninstall -y tensorflow
! pip install -q tf-nightly
! pip install -q tensorflow-model-optimization
import tensorflow as tf
import numpy as np
import tensorflow_model_optimization as tfmot
import tempfile
input_shape = [20]
x_train = np.random.randn(1, 20).astype(np.float32)
y_train = tf.keras.utils.to_categorical(np.random.randn(1), num_classes=20)
def setup_model():
model = tf.keras.Sequential([
tf.keras.layers.Dense(20, input_shape=input_shape),
tf.keras.layers.Flatten()
])
return model
def setup_pretrained_weights():
model= setup_model()
model.compile(
loss=tf.keras.losses.categorical_crossentropy,
optimizer='adam',
metrics=['accuracy']
)
model.fit(x_train, y_train)
_, pretrained_weights = tempfile.mkstemp('.tf')
model.save_weights(pretrained_weights)
return pretrained_weights
def setup_pretrained_model():
model = setup_model()
pretrained_weights = setup_pretrained_weights()
model.load_weights(pretrained_weights)
return model
setup_model()
pretrained_weights = setup_pretrained_weights()
Définir un modèle prenant en charge la quantification
En définissant des modèles de la manière suivante, des chemins d'accès au déploiement vers les backends sont disponibles dans la page de présentation . Par défaut, la quantification 8 bits est utilisée.
Quantifier le modèle entier
Votre cas d'utilisation:
- Les modèles sous-classés ne sont pas pris en charge.
Conseils pour une meilleure précision du modèle:
- Essayez «Quantifier certaines couches» pour ignorer la quantification des couches qui réduisent le plus la précision.
- Il est généralement préférable de s'accorder avec une formation sensible à la quantification plutôt qu'une formation à partir de zéro.
Pour rendre l'ensemble du modèle conscient de la quantification, appliquez tfmot.quantization.keras.quantize_model
au modèle.
base_model = setup_model()
base_model.load_weights(pretrained_weights) # optional but recommended for model accuracy
quant_aware_model = tfmot.quantization.keras.quantize_model(base_model)
quant_aware_model.summary()
Model: "sequential_2" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= quantize_layer (QuantizeLaye (None, 20) 3 _________________________________________________________________ quant_dense_2 (QuantizeWrapp (None, 20) 425 _________________________________________________________________ quant_flatten_2 (QuantizeWra (None, 20) 1 ================================================================= Total params: 429 Trainable params: 420 Non-trainable params: 9 _________________________________________________________________
Quantifier certaines couches
La quantification d'un modèle peut avoir un effet négatif sur la précision. Vous pouvez quantifier sélectivement les couches d'un modèle pour explorer le compromis entre précision, vitesse et taille du modèle.
Votre cas d'utilisation:
- Pour déployer sur un backend qui ne fonctionne bien qu'avec des modèles entièrement quantifiés (par exemple EdgeTPU v1, la plupart des DSP), essayez "Quantifier le modèle entier".
Conseils pour une meilleure précision du modèle:
- Il est généralement préférable de s'accorder avec une formation sensible à la quantification plutôt qu'une formation à partir de zéro.
- Essayez de quantifier les dernières couches au lieu des premières couches.
- Évitez de quantifier les couches critiques (par exemple, mécanisme d'attention).
Dans l'exemple ci-dessous, ne quantifiez que les couches Dense
.
# Create a base model
base_model = setup_model()
base_model.load_weights(pretrained_weights) # optional but recommended for model accuracy
# Helper function uses `quantize_annotate_layer` to annotate that only the
# Dense layers should be quantized.
def apply_quantization_to_dense(layer):
if isinstance(layer, tf.keras.layers.Dense):
return tfmot.quantization.keras.quantize_annotate_layer(layer)
return layer
# Use `tf.keras.models.clone_model` to apply `apply_quantization_to_dense`
# to the layers of the model.
annotated_model = tf.keras.models.clone_model(
base_model,
clone_function=apply_quantization_to_dense,
)
# Now that the Dense layers are annotated,
# `quantize_apply` actually makes the model quantization aware.
quant_aware_model = tfmot.quantization.keras.quantize_apply(annotated_model)
quant_aware_model.summary()
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.iter WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.beta_1 WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.beta_2 WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.decay WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.learning_rate WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'm' for (root).layer_with_weights-0.kernel WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'm' for (root).layer_with_weights-0.bias WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'v' for (root).layer_with_weights-0.kernel WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'v' for (root).layer_with_weights-0.bias WARNING:tensorflow:A checkpoint was restored (e.g. tf.train.Checkpoint.restore or tf.keras.Model.load_weights) but not all checkpointed values were used. See above for specific issues. Use expect_partial() on the load status object, e.g. tf.train.Checkpoint.restore(...).expect_partial(), to silence these warnings, or use assert_consumed() to make the check explicit. See https://www.tensorflow.org/guide/checkpoint#loading_mechanics for details. Model: "sequential_3" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= quantize_layer_1 (QuantizeLa (None, 20) 3 _________________________________________________________________ quant_dense_3 (QuantizeWrapp (None, 20) 425 _________________________________________________________________ flatten_3 (Flatten) (None, 20) 0 ================================================================= Total params: 428 Trainable params: 420 Non-trainable params: 8 _________________________________________________________________
Bien que cet exemple utilise le type de calque pour décider de ce qu'il faut quantifier, le moyen le plus simple de quantifier un calque particulier est de définir sa propriété name
et de rechercher ce nom dans la fonction clone_function
.
print(base_model.layers[0].name)
dense_3
Précision du modèle plus lisible mais potentiellement inférieure
Ceci n'est pas compatible avec le réglage fin avec un entraînement prenant en charge la quantification, c'est pourquoi il peut être moins précis que les exemples ci-dessus.
Exemple fonctionnel
# Use `quantize_annotate_layer` to annotate that the `Dense` layer
# should be quantized.
i = tf.keras.Input(shape=(20,))
x = tfmot.quantization.keras.quantize_annotate_layer(tf.keras.layers.Dense(10))(i)
o = tf.keras.layers.Flatten()(x)
annotated_model = tf.keras.Model(inputs=i, outputs=o)
# Use `quantize_apply` to actually make the model quantization aware.
quant_aware_model = tfmot.quantization.keras.quantize_apply(annotated_model)
# For deployment purposes, the tool adds `QuantizeLayer` after `InputLayer` so that the
# quantized model can take in float inputs instead of only uint8.
quant_aware_model.summary()
Model: "model" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_1 (InputLayer) [(None, 20)] 0 _________________________________________________________________ quantize_layer_2 (QuantizeLa (None, 20) 3 _________________________________________________________________ quant_dense_4 (QuantizeWrapp (None, 10) 215 _________________________________________________________________ flatten_4 (Flatten) (None, 10) 0 ================================================================= Total params: 218 Trainable params: 210 Non-trainable params: 8 _________________________________________________________________
Exemple séquentiel
# Use `quantize_annotate_layer` to annotate that the `Dense` layer
# should be quantized.
annotated_model = tf.keras.Sequential([
tfmot.quantization.keras.quantize_annotate_layer(tf.keras.layers.Dense(20, input_shape=input_shape)),
tf.keras.layers.Flatten()
])
# Use `quantize_apply` to actually make the model quantization aware.
quant_aware_model = tfmot.quantization.keras.quantize_apply(annotated_model)
quant_aware_model.summary()
Model: "sequential_4" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= quantize_layer_3 (QuantizeLa (None, 20) 3 _________________________________________________________________ quant_dense_5 (QuantizeWrapp (None, 20) 425 _________________________________________________________________ flatten_5 (Flatten) (None, 20) 0 ================================================================= Total params: 428 Trainable params: 420 Non-trainable params: 8 _________________________________________________________________
Checkpoint et désérialisation
Votre cas d'utilisation: ce code n'est nécessaire que pour le format du modèle HDF5 (pas les poids HDF5 ou d'autres formats).
# Define the model.
base_model = setup_model()
base_model.load_weights(pretrained_weights) # optional but recommended for model accuracy
quant_aware_model = tfmot.quantization.keras.quantize_model(base_model)
# Save or checkpoint the model.
_, keras_model_file = tempfile.mkstemp('.h5')
quant_aware_model.save(keras_model_file)
# `quantize_scope` is needed for deserializing HDF5 models.
with tfmot.quantization.keras.quantize_scope():
loaded_model = tf.keras.models.load_model(keras_model_file)
loaded_model.summary()
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.iter WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.beta_1 WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.beta_2 WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.decay WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.learning_rate WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'm' for (root).layer_with_weights-0.kernel WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'm' for (root).layer_with_weights-0.bias WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'v' for (root).layer_with_weights-0.kernel WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'v' for (root).layer_with_weights-0.bias WARNING:tensorflow:A checkpoint was restored (e.g. tf.train.Checkpoint.restore or tf.keras.Model.load_weights) but not all checkpointed values were used. See above for specific issues. Use expect_partial() on the load status object, e.g. tf.train.Checkpoint.restore(...).expect_partial(), to silence these warnings, or use assert_consumed() to make the check explicit. See https://www.tensorflow.org/guide/checkpoint#loading_mechanics for details. WARNING:tensorflow:No training configuration found in the save file, so the model was *not* compiled. Compile it manually. Model: "sequential_5" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= quantize_layer_4 (QuantizeLa (None, 20) 3 _________________________________________________________________ quant_dense_6 (QuantizeWrapp (None, 20) 425 _________________________________________________________________ quant_flatten_6 (QuantizeWra (None, 20) 1 ================================================================= Total params: 429 Trainable params: 420 Non-trainable params: 9 _________________________________________________________________
Créer et déployer un modèle quantifié
En général, reportez-vous à la documentation du backend de déploiement que vous utiliserez.
Ceci est un exemple pour le backend TFLite.
base_model = setup_pretrained_model()
quant_aware_model = tfmot.quantization.keras.quantize_model(base_model)
# Typically you train the model here.
converter = tf.lite.TFLiteConverter.from_keras_model(quant_aware_model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
quantized_tflite_model = converter.convert()
1/1 [==============================] - 0s 267ms/step - loss: 1.3382 - accuracy: 0.0000e+00 WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.iter WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.beta_1 WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.beta_2 WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.decay WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.learning_rate WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'm' for (root).layer_with_weights-0.kernel WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'm' for (root).layer_with_weights-0.bias WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'v' for (root).layer_with_weights-0.kernel WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'v' for (root).layer_with_weights-0.bias WARNING:tensorflow:A checkpoint was restored (e.g. tf.train.Checkpoint.restore or tf.keras.Model.load_weights) but not all checkpointed values were used. See above for specific issues. Use expect_partial() on the load status object, e.g. tf.train.Checkpoint.restore(...).expect_partial(), to silence these warnings, or use assert_consumed() to make the check explicit. See https://www.tensorflow.org/guide/checkpoint#loading_mechanics for details. WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/training/tracking/tracking.py:109: Model.state_updates (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version. Instructions for updating: This property should not be used in TensorFlow 2.0, as updates are applied automatically. WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/training/tracking/tracking.py:109: Layer.updates (from tensorflow.python.keras.engine.base_layer) is deprecated and will be removed in a future version. Instructions for updating: This property should not be used in TensorFlow 2.0, as updates are applied automatically. INFO:tensorflow:Assets written to: /tmp/tmpx2wcgxt9/assets
Expérimentez avec la quantification
Votre cas d'utilisation : l'utilisation des API suivantes signifie qu'il n'y a pas de chemin pris en charge pour le déploiement. Les fonctionnalités sont également expérimentales et ne sont pas soumises à une compatibilité descendante.
-
tfmot.quantization.keras.QuantizeConfig
-
tfmot.quantization.keras.quantizers.Quantizer
-
tfmot.quantization.keras.quantizers.LastValueQuantizer
-
tfmot.quantization.keras.quantizers.MovingAverageQuantizer
Configuration: DefaultDenseQuantizeConfig
L'expérimentation nécessite l'utilisation de tfmot.quantization.keras.QuantizeConfig
, qui décrit comment quantifier les poids, les activations et les sorties d'une couche.
Voici un exemple qui définit le même QuantizeConfig
utilisé pour la couche Dense
dans les valeurs par défaut de l'API.
Lors de la propagation avant dans cet exemple, le LastValueQuantizer
renvoyé dans get_weights_and_quantizers
est appelé avec layer.kernel
comme entrée, produisant une sortie. La sortie remplace layer.kernel
dans la propagation directe d'origine de la couche Dense
, via la logique définie dans set_quantize_weights
. La même idée s'applique aux activations et aux sorties.
LastValueQuantizer = tfmot.quantization.keras.quantizers.LastValueQuantizer
MovingAverageQuantizer = tfmot.quantization.keras.quantizers.MovingAverageQuantizer
class DefaultDenseQuantizeConfig(tfmot.quantization.keras.QuantizeConfig):
# Configure how to quantize weights.
def get_weights_and_quantizers(self, layer):
return [(layer.kernel, LastValueQuantizer(num_bits=8, symmetric=True, narrow_range=False, per_axis=False))]
# Configure how to quantize activations.
def get_activations_and_quantizers(self, layer):
return [(layer.activation, MovingAverageQuantizer(num_bits=8, symmetric=False, narrow_range=False, per_axis=False))]
def set_quantize_weights(self, layer, quantize_weights):
# Add this line for each item returned in `get_weights_and_quantizers`
# , in the same order
layer.kernel = quantize_weights[0]
def set_quantize_activations(self, layer, quantize_activations):
# Add this line for each item returned in `get_activations_and_quantizers`
# , in the same order.
layer.activation = quantize_activations[0]
# Configure how to quantize outputs (may be equivalent to activations).
def get_output_quantizers(self, layer):
return []
def get_config(self):
return {}
Quantifier la couche Keras personnalisée
Cet exemple utilise DefaultDenseQuantizeConfig
pour quantifier le CustomLayer
.
L'application de la configuration est la même dans tous les cas d'utilisation «Expérience de quantification».
- Appliquez
tfmot.quantization.keras.quantize_annotate_layer
auCustomLayer
et transmettez leQuantizeConfig
. - Utilisez
tfmot.quantization.keras.quantize_annotate_model
pour continuer à quantifier le reste du modèle avec les valeurs par défaut de l'API.
quantize_annotate_layer = tfmot.quantization.keras.quantize_annotate_layer
quantize_annotate_model = tfmot.quantization.keras.quantize_annotate_model
quantize_scope = tfmot.quantization.keras.quantize_scope
class CustomLayer(tf.keras.layers.Dense):
pass
model = quantize_annotate_model(tf.keras.Sequential([
quantize_annotate_layer(CustomLayer(20, input_shape=(20,)), DefaultDenseQuantizeConfig()),
tf.keras.layers.Flatten()
]))
# `quantize_apply` requires mentioning `DefaultDenseQuantizeConfig` with `quantize_scope`
# as well as the custom Keras layer.
with quantize_scope(
{'DefaultDenseQuantizeConfig': DefaultDenseQuantizeConfig,
'CustomLayer': CustomLayer}):
# Use `quantize_apply` to actually make the model quantization aware.
quant_aware_model = tfmot.quantization.keras.quantize_apply(model)
quant_aware_model.summary()
Model: "sequential_8" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= quantize_layer_6 (QuantizeLa (None, 20) 3 _________________________________________________________________ quant_custom_layer (Quantize (None, 20) 425 _________________________________________________________________ quant_flatten_9 (QuantizeWra (None, 20) 1 ================================================================= Total params: 429 Trainable params: 420 Non-trainable params: 9 _________________________________________________________________
Modifier les paramètres de quantification
Erreur courante: quantifier le biais à moins de 32 bits nuit généralement trop à la précision du modèle.
Cet exemple modifie la couche Dense
pour utiliser 4 bits pour ses pondérations au lieu des 8 bits par défaut. Le reste du modèle continue d'utiliser les valeurs par défaut de l'API.
quantize_annotate_layer = tfmot.quantization.keras.quantize_annotate_layer
quantize_annotate_model = tfmot.quantization.keras.quantize_annotate_model
quantize_scope = tfmot.quantization.keras.quantize_scope
class ModifiedDenseQuantizeConfig(DefaultDenseQuantizeConfig):
# Configure weights to quantize with 4-bit instead of 8-bits.
def get_weights_and_quantizers(self, layer):
return [(layer.kernel, LastValueQuantizer(num_bits=4, symmetric=True, narrow_range=False, per_axis=False))]
L'application de la configuration est la même dans tous les cas d'utilisation «Expérience de quantification».
- Appliquez
tfmot.quantization.keras.quantize_annotate_layer
à la coucheDense
et passez dansQuantizeConfig
. - Utilisez
tfmot.quantization.keras.quantize_annotate_model
pour continuer à quantifier le reste du modèle avec les valeurs par défaut de l'API.
model = quantize_annotate_model(tf.keras.Sequential([
# Pass in modified `QuantizeConfig` to modify this Dense layer.
quantize_annotate_layer(tf.keras.layers.Dense(20, input_shape=(20,)), ModifiedDenseQuantizeConfig()),
tf.keras.layers.Flatten()
]))
# `quantize_apply` requires mentioning `ModifiedDenseQuantizeConfig` with `quantize_scope`:
with quantize_scope(
{'ModifiedDenseQuantizeConfig': ModifiedDenseQuantizeConfig}):
# Use `quantize_apply` to actually make the model quantization aware.
quant_aware_model = tfmot.quantization.keras.quantize_apply(model)
quant_aware_model.summary()
Model: "sequential_9" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= quantize_layer_7 (QuantizeLa (None, 20) 3 _________________________________________________________________ quant_dense_9 (QuantizeWrapp (None, 20) 425 _________________________________________________________________ quant_flatten_10 (QuantizeWr (None, 20) 1 ================================================================= Total params: 429 Trainable params: 420 Non-trainable params: 9 _________________________________________________________________
Modifier des parties du calque à quantifier
Cet exemple modifie la couche Dense
pour ignorer la quantification de l'activation. Le reste du modèle continue d'utiliser les valeurs par défaut de l'API.
quantize_annotate_layer = tfmot.quantization.keras.quantize_annotate_layer
quantize_annotate_model = tfmot.quantization.keras.quantize_annotate_model
quantize_scope = tfmot.quantization.keras.quantize_scope
class ModifiedDenseQuantizeConfig(DefaultDenseQuantizeConfig):
def get_activations_and_quantizers(self, layer):
# Skip quantizing activations.
return []
def set_quantize_activations(self, layer, quantize_activations):
# Empty since `get_activaations_and_quantizers` returns
# an empty list.
return
L'application de la configuration est la même dans tous les cas d'utilisation «Expérience de quantification».
- Appliquez
tfmot.quantization.keras.quantize_annotate_layer
à la coucheDense
et passez dansQuantizeConfig
. - Utilisez
tfmot.quantization.keras.quantize_annotate_model
pour continuer à quantifier le reste du modèle avec les valeurs par défaut de l'API.
model = quantize_annotate_model(tf.keras.Sequential([
# Pass in modified `QuantizeConfig` to modify this Dense layer.
quantize_annotate_layer(tf.keras.layers.Dense(20, input_shape=(20,)), ModifiedDenseQuantizeConfig()),
tf.keras.layers.Flatten()
]))
# `quantize_apply` requires mentioning `ModifiedDenseQuantizeConfig` with `quantize_scope`:
with quantize_scope(
{'ModifiedDenseQuantizeConfig': ModifiedDenseQuantizeConfig}):
# Use `quantize_apply` to actually make the model quantization aware.
quant_aware_model = tfmot.quantization.keras.quantize_apply(model)
quant_aware_model.summary()
Model: "sequential_10" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= quantize_layer_8 (QuantizeLa (None, 20) 3 _________________________________________________________________ quant_dense_10 (QuantizeWrap (None, 20) 423 _________________________________________________________________ quant_flatten_11 (QuantizeWr (None, 20) 1 ================================================================= Total params: 427 Trainable params: 420 Non-trainable params: 7 _________________________________________________________________
Utiliser un algorithme de quantification personnalisé
La classe tfmot.quantization.keras.quantizers.Quantizer
est un appelable qui peut appliquer n'importe quel algorithme à ses entrées.
Dans cet exemple, les entrées sont les poids, et nous appliquons les calculs de la fonction FixedRangeQuantizer
__call__ aux poids. Au lieu des valeurs de poids d'origine, la sortie de FixedRangeQuantizer
est maintenant transmise à tout ce qui aurait utilisé les poids.
quantize_annotate_layer = tfmot.quantization.keras.quantize_annotate_layer
quantize_annotate_model = tfmot.quantization.keras.quantize_annotate_model
quantize_scope = tfmot.quantization.keras.quantize_scope
class FixedRangeQuantizer(tfmot.quantization.keras.quantizers.Quantizer):
"""Quantizer which forces outputs to be between -1 and 1."""
def build(self, tensor_shape, name, layer):
# Not needed. No new TensorFlow variables needed.
return {}
def __call__(self, inputs, training, weights, **kwargs):
return tf.keras.backend.clip(inputs, -1.0, 1.0)
def get_config(self):
# Not needed. No __init__ parameters to serialize.
return {}
class ModifiedDenseQuantizeConfig(DefaultDenseQuantizeConfig):
# Configure weights to quantize with 4-bit instead of 8-bits.
def get_weights_and_quantizers(self, layer):
# Use custom algorithm defined in `FixedRangeQuantizer` instead of default Quantizer.
return [(layer.kernel, FixedRangeQuantizer())]
L'application de la configuration est la même dans tous les cas d'utilisation «Expérience de quantification».
- Appliquez
tfmot.quantization.keras.quantize_annotate_layer
à la coucheDense
et passez dansQuantizeConfig
. - Utilisez
tfmot.quantization.keras.quantize_annotate_model
pour continuer à quantifier le reste du modèle avec les valeurs par défaut de l'API.
model = quantize_annotate_model(tf.keras.Sequential([
# Pass in modified `QuantizeConfig` to modify this `Dense` layer.
quantize_annotate_layer(tf.keras.layers.Dense(20, input_shape=(20,)), ModifiedDenseQuantizeConfig()),
tf.keras.layers.Flatten()
]))
# `quantize_apply` requires mentioning `ModifiedDenseQuantizeConfig` with `quantize_scope`:
with quantize_scope(
{'ModifiedDenseQuantizeConfig': ModifiedDenseQuantizeConfig}):
# Use `quantize_apply` to actually make the model quantization aware.
quant_aware_model = tfmot.quantization.keras.quantize_apply(model)
quant_aware_model.summary()
Model: "sequential_11" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= quantize_layer_9 (QuantizeLa (None, 20) 3 _________________________________________________________________ quant_dense_11 (QuantizeWrap (None, 20) 423 _________________________________________________________________ quant_flatten_12 (QuantizeWr (None, 20) 1 ================================================================= Total params: 427 Trainable params: 420 Non-trainable params: 7 _________________________________________________________________