Questa pagina è stata tradotta dall'API Cloud Translation.
Switch to English

Guida completa al raggruppamento del peso

Visualizza su TensorFlow.org Esegui in Google Colab Visualizza sorgente su GitHub Scarica notebook

Benvenuti nella guida completa per il raggruppamento del peso , parte del toolkit TensorFlow Model Optimization.

Questa pagina documenta vari casi d'uso e mostra come utilizzare l'API per ciascuno di essi. Una volta che sai di quali API hai bisogno, trova i parametri e i dettagli di basso livello nei documenti dell'API :

In questa guida vengono trattati i seguenti casi d'uso:

  • Definisci un modello cluster.
  • Checkpoint e deserializzazione di un modello cluster.
  • Migliora la precisione del modello in cluster.
  • Solo per la distribuzione, è necessario eseguire passaggi per vedere i vantaggi della compressione.

Impostare

! 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()
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.
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: 16.1181 - accuracy: 0.0000e+00

Definisci un modello cluster

Raggruppa un intero modello (sequenziale e funzionale)

Suggerimenti per una migliore precisione del modello:

  • È necessario passare un modello pre-addestrato con una precisione accettabile a questa API. L'addestramento di modelli da zero con il raggruppamento si traduce in una precisione scadente.
  • In alcuni casi, il raggruppamento di determinati livelli ha un effetto negativo sulla precisione del modello. Seleziona "Raggruppa alcuni livelli" per vedere come saltare il raggruppamento dei livelli che influiscono maggiormente sulla precisione.

Per raggruppare tutti i livelli, applica tfmot.clustering.keras.cluster_weights al modello.

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
_________________________________________________________________

Raggruppa alcuni livelli (modelli sequenziali e funzionali)

Suggerimenti per una migliore precisione del modello:

  • È necessario trasmettere un modello pre-addestrato con una precisione accettabile a questa API. L'addestramento di modelli da zero con raggruppamento si traduce in una precisione scadente.
  • tf.keras.layers.Dense livelli successivi con parametri più ridondanti (ad esempio tf.keras.layers.Dense , tf.keras.layers.Conv2D ), al contrario dei primi livelli.
  • Congela i primi strati prima dei livelli raggruppati durante la messa a punto. Considera il numero di livelli congelati come un iperparametro. Empiricamente, il congelamento della maggior parte dei primi livelli è l'ideale per l'attuale API di clustering.
  • Evita di raggruppare i livelli critici (ad es. Meccanismo di attenzione).

Altro : i documenti dell'API tfmot.clustering.keras.cluster_weights forniscono dettagli su come variare la configurazione del cluster per livello.

# 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
_________________________________________________________________

Checkpoint e deserializzazione di un modello cluster

Il tuo caso d'uso: questo codice è necessario solo per il formato del modello HDF5 (non per i pesi HDF5 o altri formati).

# 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
_________________________________________________________________

Migliora la precisione del modello in cluster

Per il tuo caso d'uso specifico, ci sono suggerimenti che puoi prendere in considerazione:

  • L'inizializzazione del centroide gioca un ruolo chiave nell'accuratezza finale del modello ottimizzato. In generale, l'inizializzazione lineare supera la densità e l'inizializzazione casuale poiché non tende a perdere grandi pesi. Tuttavia, è stato osservato che l'inizializzazione della densità fornisce una migliore accuratezza nel caso di utilizzo di pochissimi cluster su pesi con distribuzioni bimodali.

  • Impostare una velocità di apprendimento inferiore a quella utilizzata nella formazione durante l'ottimizzazione del modello in cluster.

  • Per idee generali per migliorare l'accuratezza del modello, cerca i suggerimenti per i tuoi casi d'uso in "Definisci un modello cluster".

Distribuzione

Esporta modello con compressione delle dimensioni

Errore comune : sia strip_clustering che l'applicazione di un algoritmo di compressione standard (ad esempio tramite gzip) sono necessari per vedere i vantaggi di compressione del clustering.

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 984us/step - loss: 16.1181 - 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: 1809.00 bytes
Size of gzipped clustered model with stripping: 1399.00 bytes