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

Guía completa de agrupación de peso

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

Bienvenido a la guía completa para el agrupamiento de pesas , que forma parte del kit de herramientas de optimización del modelo TensorFlow.

Esta página documenta varios casos de uso y muestra cómo usar la API para cada uno. Una vez que sepa qué API necesita, busque los parámetros y los detalles de bajo nivel en los documentos de la API :

En esta guía, se cubren los siguientes casos de uso:

  • Definir un modelo agrupado.
  • Controle y deserialice un modelo agrupado.
  • Mejore la precisión del modelo agrupado.
  • Solo para la implementación, debe tomar medidas para ver los beneficios de compresión.

Preparar

 ! pip install -q tensorflow-model-optimization

import tensorflow as tf
import numpy as np
import tempfile
import os
import tensorflow_model_optimization as tfmot

input_dim = 20
output_dim = 20
x_train = np.random.randn(1, input_dim).astype(np.float32)
y_train = tf.keras.utils.to_categorical(np.random.randn(1), num_classes=output_dim)

def setup_model():
  model = tf.keras.Sequential([
      tf.keras.layers.Dense(input_dim, input_shape=[input_dim]),
      tf.keras.layers.Flatten()
  ])
  return model

def train_model(model):
  model.compile(
      loss=tf.keras.losses.categorical_crossentropy,
      optimizer='adam',
      metrics=['accuracy']
  )
  model.summary()
  model.fit(x_train, y_train)
  return model

def save_model_weights(model):
  _, pretrained_weights = tempfile.mkstemp('.h5')
  model.save_weights(pretrained_weights)
  return pretrained_weights

def setup_pretrained_weights():
  model= setup_model()
  model = train_model(model)
  pretrained_weights = save_model_weights(model)
  return pretrained_weights

def setup_pretrained_model():
  model = setup_model()
  pretrained_weights = setup_pretrained_weights()
  model.load_weights(pretrained_weights)
  return model

def save_model_file(model):
  _, keras_file = tempfile.mkstemp('.h5') 
  model.save(keras_file, include_optimizer=False)
  return keras_file

def get_gzipped_model_size(model):
  # It returns the size of the gzipped model in bytes.
  import os
  import zipfile

  keras_file = save_model_file(model)

  _, zipped_file = tempfile.mkstemp('.zip')
  with zipfile.ZipFile(zipped_file, 'w', compression=zipfile.ZIP_DEFLATED) as f:
    f.write(keras_file)
  return os.path.getsize(zipped_file)

setup_model()
pretrained_weights = setup_pretrained_weights()
 
Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 20)                420       
_________________________________________________________________
flatten_1 (Flatten)          (None, 20)                0         
=================================================================
Total params: 420
Trainable params: 420
Non-trainable params: 0
_________________________________________________________________
1/1 [==============================] - 0s 1ms/step - loss: 1.3192 - accuracy: 0.0000e+00

Definir un modelo agrupado

Agrupe un modelo completo (secuencial y funcional)

Consejos para una mejor precisión del modelo:

  • Debe pasar un modelo previamente entrenado con una precisión aceptable a esta API. Los modelos de entrenamiento desde cero con resultados de agrupamiento en una precisión inferior.
  • En algunos casos, la agrupación de ciertas capas tiene un efecto perjudicial en la precisión del modelo. Marque "Agrupar algunas capas" para ver cómo omitir la agrupación de las capas que más afectan la precisión.

Para agrupar todas las capas, aplique tfmot.clustering.keras.cluster_weights al modelo.

 import tensorflow_model_optimization as tfmot

cluster_weights = tfmot.clustering.keras.cluster_weights
CentroidInitialization = tfmot.clustering.keras.CentroidInitialization

clustering_params = {
  'number_of_clusters': 3,
  'cluster_centroids_init': CentroidInitialization.DENSITY_BASED
}

model = setup_model()
model.load_weights(pretrained_weights)

clustered_model = cluster_weights(model, **clustering_params)

clustered_model.summary()
 
Model: "sequential_2"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
cluster_dense_2 (ClusterWeig (None, 20)                423       
_________________________________________________________________
cluster_flatten_2 (ClusterWe (None, 20)                0         
=================================================================
Total params: 423
Trainable params: 23
Non-trainable params: 400
_________________________________________________________________

Agrupe algunas capas (modelos secuenciales y funcionales)

Consejos para una mejor precisión del modelo:

  • Debe pasar un modelo previamente entrenado con una precisión aceptable a esta API. Los modelos de entrenamiento desde cero con resultados de agrupamiento en una precisión inferior.
  • Cluster capas posteriores con los parámetros más redundantes (por ejemplo tf.keras.layers.Dense , tf.keras.layers.Conv2D ), en oposición a las primeras capas.
  • Congele las primeras capas antes de las capas agrupadas durante el ajuste fino. Trate el número de capas congeladas como un hiperparámetro. Empíricamente, congelar la mayoría de las capas iniciales es ideal para la API de agrupamiento actual.
  • Evite agrupar capas críticas (p. Ej., Mecanismo de atención).

Más : los documentos de la API tfmot.clustering.keras.cluster_weights proporcionan detalles sobre cómo variar la configuración de la agrupación por capa.

 # Create a base model
base_model = setup_model()
base_model.load_weights(pretrained_weights)

# Helper function uses `cluster_weights` to make only 
# the Dense layers train with clustering
def apply_clustering_to_dense(layer):
  if isinstance(layer, tf.keras.layers.Dense):
    return cluster_weights(layer, **clustering_params)
  return layer

# Use `tf.keras.models.clone_model` to apply `apply_clustering_to_dense` 
# to the layers of the model.
clustered_model = tf.keras.models.clone_model(
    base_model,
    clone_function=apply_clustering_to_dense,
)

clustered_model.summary()
 
Model: "sequential_3"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
cluster_dense_3 (ClusterWeig (None, 20)                423       
_________________________________________________________________
flatten_3 (Flatten)          (None, 20)                0         
=================================================================
Total params: 423
Trainable params: 23
Non-trainable params: 400
_________________________________________________________________

Punto de control y deserialización de un modelo agrupado

Su caso de uso: este código solo es necesario para el formato del modelo HDF5 (no para los pesos HDF5 u otros formatos).

 # Define the model.
base_model = setup_model()
base_model.load_weights(pretrained_weights)
clustered_model = cluster_weights(base_model, **clustering_params)

# Save or checkpoint the model.
_, keras_model_file = tempfile.mkstemp('.h5')
clustered_model.save(keras_model_file, include_optimizer=True)

# `cluster_scope` is needed for deserializing HDF5 models.
with tfmot.clustering.keras.cluster_scope():
  loaded_model = tf.keras.models.load_model(keras_model_file)

loaded_model.summary()
 
WARNING:tensorflow:No training configuration found in the save file, so the model was *not* compiled. Compile it manually.
Model: "sequential_4"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
cluster_dense_4 (ClusterWeig (None, 20)                423       
_________________________________________________________________
cluster_flatten_4 (ClusterWe (None, 20)                0         
=================================================================
Total params: 423
Trainable params: 23
Non-trainable params: 400
_________________________________________________________________

Mejora la precisión del modelo agrupado

Para su caso de uso específico, hay algunos consejos que puede considerar:

  • La inicialización del centroide desempeña un papel clave en la precisión final del modelo optimizado. En general, la inicialización lineal supera la densidad y la inicialización aleatoria, ya que no tiende a perder grandes pesos. Sin embargo, se ha observado que la inicialización de densidad proporciona una mejor precisión para el caso de usar muy pocos grupos en pesos con distribuciones bimodales.

  • Establezca una tasa de aprendizaje que sea inferior a la utilizada en el entrenamiento al ajustar el modelo agrupado.

  • Para obtener ideas generales para mejorar la precisión del modelo, busque consejos para su (s) caso (s) de uso en "Definir un modelo agrupado".

Despliegue

Exportar modelo con compresión de tamaño

Error común : tanto strip_clustering como la aplicación de un algoritmo de compresión estándar (por ejemplo, a través de gzip) son necesarios para ver los beneficios de compresión de la agrupación.

 model = setup_model()
clustered_model = cluster_weights(model, **clustering_params)

clustered_model.compile(
    loss=tf.keras.losses.categorical_crossentropy,
    optimizer='adam',
    metrics=['accuracy']
)

clustered_model.fit(
    x_train,
    y_train
)

final_model = tfmot.clustering.keras.strip_clustering(clustered_model)

print("final model")
final_model.summary()

print("\n")
print("Size of gzipped clustered model without stripping: %.2f bytes" 
      % (get_gzipped_model_size(clustered_model)))
print("Size of gzipped clustered model with stripping: %.2f bytes" 
      % (get_gzipped_model_size(final_model)))
 
1/1 [==============================] - 0s 1ms/step - loss: 2.2136 - accuracy: 0.0000e+00
final model
Model: "sequential_5"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_5 (Dense)              (None, 20)                420       
_________________________________________________________________
flatten_5 (Flatten)          (None, 20)                0         
=================================================================
Total params: 420
Trainable params: 420
Non-trainable params: 0
_________________________________________________________________


Size of gzipped clustered model without stripping: 1822.00 bytes
Size of gzipped clustered model with stripping: 1408.00 bytes