Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Entrenamiento consciente de cuantificación en el ejemplo de Keras

Ver en TensorFlow.org Ejecutar en Google Colab Ver fuente en GitHub Descargar cuaderno

Visión general

Bienvenido a un ejemplo completo de formación consciente de la cuantificación .

Otras paginas

Para obtener una introducción a lo que es el entrenamiento consciente de la cuantificación y para determinar si debe usarlo (incluido lo que es compatible), consulte la página de descripción general .

Para encontrar rápidamente las API que necesita para su caso de uso (más allá de cuantificar completamente un modelo con 8 bits), consulte la guía completa .

Resumen

En este tutorial, podrá:

  1. Entrenar a un tf.keras modelo para MNIST desde cero.
  2. Ajuste el modelo aplicando la API de entrenamiento con reconocimiento de cuantificación, vea la precisión y exporte un modelo con reconocimiento de cuantificación.
  3. Utilice el modelo para crear un modelo realmente cuantificado para el backend de TFLite.
  4. Vea la persistencia de la precisión en TFLite y un modelo 4 veces más pequeño. Para ver los beneficios de latencia en dispositivos móviles, pruebe los ejemplos de TFLite en el repositorio de aplicaciones de TFLite .

Preparar

 pip uninstall -y tensorflow
 pip install -q tf-nightly
 pip install -q tensorflow-model-optimization
Found existing installation: tensorflow 2.3.0
Uninstalling tensorflow-2.3.0:
  Successfully uninstalled tensorflow-2.3.0
WARNING: You are using pip version 20.2.2; however, version 20.2.3 is available.
You should consider upgrading via the '/tmpfs/src/tf_docs_env/bin/python -m pip install --upgrade pip' command.
WARNING: You are using pip version 20.2.2; however, version 20.2.3 is available.
You should consider upgrading via the '/tmpfs/src/tf_docs_env/bin/python -m pip install --upgrade pip' command.

import tempfile
import os

import tensorflow as tf

from tensorflow import keras

Entrene un modelo para MNIST sin entrenamiento consciente de cuantificación

# Load MNIST dataset
mnist = keras.datasets.mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

# Normalize the input image so that each pixel value is between 0 to 1.
train_images = train_images / 255.0
test_images = test_images / 255.0

# Define the model architecture.
model = keras.Sequential([
  keras.layers.InputLayer(input_shape=(28, 28)),
  keras.layers.Reshape(target_shape=(28, 28, 1)),
  keras.layers.Conv2D(filters=12, kernel_size=(3, 3), activation='relu'),
  keras.layers.MaxPooling2D(pool_size=(2, 2)),
  keras.layers.Flatten(),
  keras.layers.Dense(10)
])

# Train the digit classification model
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

model.fit(
  train_images,
  train_labels,
  epochs=1,
  validation_split=0.1,
)
1688/1688 [==============================] - 8s 4ms/step - loss: 0.5175 - accuracy: 0.8544 - val_loss: 0.1275 - val_accuracy: 0.9648

<tensorflow.python.keras.callbacks.History at 0x7f37f03b39e8>

Clone y ajuste el modelo preentrenado con entrenamiento consciente de cuantificación

Definir el modelo

Aplicará el entrenamiento consciente de la cuantificación a todo el modelo y verá esto en el resumen del modelo. Todas las capas tienen ahora el prefijo "cuant".

Tenga en cuenta que el modelo resultante es consciente de la cuantificación pero no cuantificado (por ejemplo, los pesos son float32 en lugar de int8). Las secciones siguientes muestran cómo crear un modelo cuantificado a partir del que reconoce la cuantificación.

En la guía completa , puede ver cómo cuantificar algunas capas para mejorar la precisión del modelo.

import tensorflow_model_optimization as tfmot

quantize_model = tfmot.quantization.keras.quantize_model

# q_aware stands for for quantization aware.
q_aware_model = quantize_model(model)

# `quantize_model` requires a recompile.
q_aware_model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

q_aware_model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
quantize_layer (QuantizeLaye (None, 28, 28)            3         
_________________________________________________________________
quant_reshape (QuantizeWrapp (None, 28, 28, 1)         1         
_________________________________________________________________
quant_conv2d (QuantizeWrappe (None, 26, 26, 12)        147       
_________________________________________________________________
quant_max_pooling2d (Quantiz (None, 13, 13, 12)        1         
_________________________________________________________________
quant_flatten (QuantizeWrapp (None, 2028)              1         
_________________________________________________________________
quant_dense (QuantizeWrapper (None, 10)                20295     
=================================================================
Total params: 20,448
Trainable params: 20,410
Non-trainable params: 38
_________________________________________________________________

Entrene y evalúe el modelo contra la línea de base

Para demostrar el ajuste fino después de entrenar el modelo por solo una época, ajuste con el entrenamiento consciente de cuantificación en un subconjunto de los datos de entrenamiento.

train_images_subset = train_images[0:1000] # out of 60000
train_labels_subset = train_labels[0:1000]

q_aware_model.fit(train_images_subset, train_labels_subset,
                  batch_size=500, epochs=1, validation_split=0.1)
2/2 [==============================] - 1s 167ms/step - loss: 0.1298 - accuracy: 0.9571 - val_loss: 0.1671 - val_accuracy: 0.9600

<tensorflow.python.keras.callbacks.History at 0x7f376c6db7b8>

Para este ejemplo, hay una pérdida mínima o nula en la precisión de la prueba después del entrenamiento con reconocimiento de cuantificación, en comparación con la línea de base.

_, baseline_model_accuracy = model.evaluate(
    test_images, test_labels, verbose=0)

_, q_aware_model_accuracy = q_aware_model.evaluate(
   test_images, test_labels, verbose=0)

print('Baseline test accuracy:', baseline_model_accuracy)
print('Quant test accuracy:', q_aware_model_accuracy)
Baseline test accuracy: 0.9609000086784363
Quant test accuracy: 0.9628999829292297

Cree un modelo cuantificado para el backend de TFLite

Después de esto, tiene un modelo realmente cuantificado con pesos int8 y activaciones uint8.

converter = tf.lite.TFLiteConverter.from_keras_model(q_aware_model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]

quantized_tflite_model = converter.convert()
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/tmpoct8ii0p/assets

Vea la persistencia de la precisión de TF a TFLite

Defina una función auxiliar para evaluar el modelo TF Lite en el conjunto de datos de prueba.

import numpy as np

def evaluate_model(interpreter):
  input_index = interpreter.get_input_details()[0]["index"]
  output_index = interpreter.get_output_details()[0]["index"]

  # Run predictions on every image in the "test" dataset.
  prediction_digits = []
  for i, test_image in enumerate(test_images):
    if i % 1000 == 0:
      print('Evaluated on {n} results so far.'.format(n=i))
    # Pre-processing: add batch dimension and convert to float32 to match with
    # the model's input data format.
    test_image = np.expand_dims(test_image, axis=0).astype(np.float32)
    interpreter.set_tensor(input_index, test_image)

    # Run inference.
    interpreter.invoke()

    # Post-processing: remove batch dimension and find the digit with highest
    # probability.
    output = interpreter.tensor(output_index)
    digit = np.argmax(output()[0])
    prediction_digits.append(digit)

  print('\n')
  # Compare prediction results with ground truth labels to calculate accuracy.
  prediction_digits = np.array(prediction_digits)
  accuracy = (prediction_digits == test_labels).mean()
  return accuracy

Evalúa el modelo cuantificado y ve que la precisión de TensorFlow persiste en el backend de TFLite.

interpreter = tf.lite.Interpreter(model_content=quantized_tflite_model)
interpreter.allocate_tensors()

test_accuracy = evaluate_model(interpreter)

print('Quant TFLite test_accuracy:', test_accuracy)
print('Quant TF test accuracy:', q_aware_model_accuracy)
Evaluated on 0 results so far.
Evaluated on 1000 results so far.
Evaluated on 2000 results so far.
Evaluated on 3000 results so far.
Evaluated on 4000 results so far.
Evaluated on 5000 results so far.
Evaluated on 6000 results so far.
Evaluated on 7000 results so far.
Evaluated on 8000 results so far.
Evaluated on 9000 results so far.


Quant TFLite test_accuracy: 0.963
Quant TF test accuracy: 0.9628999829292297

Ver modelo 4 veces más pequeño de cuantificación

Creas un modelo flotante TFLite y luego ves que el modelo TFLite cuantificado es 4 veces más pequeño.

# Create float TFLite model.
float_converter = tf.lite.TFLiteConverter.from_keras_model(model)
float_tflite_model = float_converter.convert()

# Measure sizes of models.
_, float_file = tempfile.mkstemp('.tflite')
_, quant_file = tempfile.mkstemp('.tflite')

with open(quant_file, 'wb') as f:
  f.write(quantized_tflite_model)

with open(float_file, 'wb') as f:
  f.write(float_tflite_model)

print("Float model in Mb:", os.path.getsize(float_file) / float(2**20))
print("Quantized model in Mb:", os.path.getsize(quant_file) / float(2**20))
INFO:tensorflow:Assets written to: /tmp/tmpy0445k6u/assets

INFO:tensorflow:Assets written to: /tmp/tmpy0445k6u/assets

Float model in Mb: 0.08053970336914062
Quantized model in Mb: 0.02339935302734375

Conclusión

En este instructivo, vio cómo crear modelos con reconocimiento de cuantificación con la API del kit de herramientas de optimización de modelos de TensorFlow y luego modelos cuantificados para el backend de TFLite.

Viste un beneficio de compresión del tamaño del modelo 4x para un modelo para MNIST, con una diferencia de precisión mínima. Para ver los beneficios de latencia en dispositivos móviles, pruebe los ejemplos de TFLite en el repositorio de aplicaciones de TFLite .

Le animamos a que pruebe esta nueva capacidad, que puede ser especialmente importante para la implementación en entornos con recursos limitados.