Ta strona została przetłumaczona przez Cloud Translation API.
Switch to English

Kompleksowy przewodnik dotyczący grupowania wag

Zobacz na TensorFlow.org Uruchom w Google Colab Wyświetl źródło na GitHub Pobierz notatnik

Witamy w obszernym przewodniku dotyczącym grupowania wag , będącym częścią zestawu narzędzi TensorFlow Model Optimization.

Ta strona dokumentuje różne przypadki użycia i pokazuje, jak używać API w każdym z nich. Gdy już wiesz, których interfejsów API potrzebujesz, znajdź parametry i szczegółowe informacje niskiego poziomu w dokumentacji API :

  • Jeśli chcesz zobaczyć korzyści płynące z grupowania wag i funkcje obsługiwane, zapoznaj się z omówieniem .
  • Aby zapoznać się z pojedynczym, kompleksowym przykładem, zobacz przykład grupowania wag .

W tym przewodniku omówiono następujące przypadki użycia:

  • Zdefiniuj model klastrowy.
  • Sprawdź i zdeserializuj model klastrowy.
  • Popraw dokładność modelu skupionego.
  • Tylko w przypadku wdrożenia musisz podjąć kroki, aby zobaczyć zalety kompresji.

Ustawiać

 ! 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

Zdefiniuj model klastrowy

Klaster cały model (sekwencyjny i funkcjonalny)

Wskazówki dotyczące lepszej dokładności modelu:

  • Musisz przekazać wstępnie wytrenowany model z akceptowalną dokładnością do tego interfejsu API. Uczenie modeli od podstaw z klastrowaniem skutkuje niską dokładnością.
  • W niektórych przypadkach grupowanie pewnych warstw ma szkodliwy wpływ na dokładność modelu. Zaznacz „Grupuj niektóre warstwy”, aby zobaczyć, jak pominąć grupowanie warstw, które mają największy wpływ na dokładność.

Aby zgrupować wszystkie warstwy, zastosuj tfmot.clustering.keras.cluster_weights do modelu.

 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
_________________________________________________________________

Klaster kilka warstw (modele sekwencyjne i funkcjonalne)

Wskazówki dotyczące lepszej dokładności modelu:

  • Musisz przekazać wstępnie wytrenowany model z akceptowalną dokładnością do tego interfejsu API. Uczenie modeli od podstaw z klastrowaniem skutkuje niską dokładnością.
  • Klaster późniejsze warstwy z bardziej redundantnymi parametrami (np. tf.keras.layers.Dense , tf.keras.layers.Conv2D ), w przeciwieństwie do wczesnych warstw.
  • Zablokuj wczesne warstwy przed warstwami skupionymi podczas dostrajania. Traktuj liczbę zamrożonych warstw jako hiperparametr. Z empirycznego punktu widzenia zamrażanie większości wczesnych warstw jest idealne dla bieżącego interfejsu API do klastrowania.
  • Unikaj grupowania krytycznych warstw (np. Mechanizmu uwagi).

Więcej : dokumentacja interfejsu API tfmot.clustering.keras.cluster_weights zawiera szczegółowe informacje na temat różnicowania konfiguracji klastrowania na warstwę.

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

Sprawdź i zdeserializuj model klastrowy

Twój przypadek użycia: ten kod jest potrzebny tylko dla formatu modelu HDF5 (nie dotyczy wag HDF5 ani innych formatów).

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

Popraw dokładność modelu skupionego

Istnieją wskazówki, które możesz wziąć pod uwagę w swoim konkretnym przypadku użycia:

  • Inicjalizacja środka ciężkości odgrywa kluczową rolę w ostatecznej zoptymalizowanej dokładności modelu. Ogólnie rzecz biorąc, inicjalizacja liniowa przewyższa gęstość i inicjalizację losową, ponieważ zwykle nie pomija dużych wag. Jednak zaobserwowano, że inicjalizacja gęstości zapewnia lepszą dokładność w przypadku stosowania bardzo niewielu klastrów na wagach z rozkładami bimodalnymi.

  • Ustaw współczynnik uczenia się niższy niż współczynnik używany podczas szkolenia podczas dostrajania modelu klastrowego.

  • Aby uzyskać ogólne pomysły na poprawę dokładności modelu, poszukaj wskazówek dotyczących przypadków użycia w sekcji „Zdefiniuj model klastrowy”.

Rozlokowanie

Eksportuj model z kompresją rozmiaru

Powszechny błąd : zarówno strip_clustering jak i zastosowanie standardowego algorytmu kompresji (np. Przez gzip) są konieczne, aby zobaczyć zalety kompresji klastrowania.

 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