Эта страница была переведа с помощью Cloud Translation API.
Switch to English

Комплексное руководство по кластеризации веса

Посмотреть на TensorFlow.org Запустить в Google Colab Посмотреть источник на GitHub Скачать блокнот

Добро пожаловать в исчерпывающее руководство по кластеризации веса , входящее в состав инструментария TensorFlow Model Optimization.

На этой странице описаны различные варианты использования и показано, как использовать API для каждого из них. Как только вы узнаете, какие API вам нужны, найдите параметры и сведения о низком уровне в документации API :

В этом руководстве рассматриваются следующие варианты использования:

  • Определить кластерную модель.
  • Контрольная точка и десериализация кластерной модели.
  • Повысить точность кластерной модели.
  • Только для развертывания, вы должны предпринять шаги, чтобы увидеть преимущества сжатия.

Настроить

 ! 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

Определить кластерную модель

Кластеризация всей модели (последовательная и функциональная)

Советы по повышению точности модели:

  • Вы должны передать предварительно обученную модель с приемлемой точностью этому API. Обучение моделей с нуля с кластеризацией приводит к неубедительной точности
  • В некоторых случаях кластеризация определенных слоев отрицательно влияет на точность модели. Установите флажок «Кластеризация некоторых слоев», чтобы увидеть, как пропустить кластеризацию слоев, которые больше всего влияют на точность.

Для кластеризации всех слоев примените tfmot.clustering.keras.cluster_weights к модели.

 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
_________________________________________________________________

Кластер некоторых слоев (последовательные и функциональные модели)

Советы по повышению точности модели:

  • Вы должны передать предварительно обученную модель с приемлемой точностью этому API. Обучение моделей с нуля с кластеризацией приводит к неубедительной точности.
  • tf.keras.layers.Dense более поздние слои с более избыточными параметрами (например, tf.keras.layers.Dense , tf.keras.layers.Conv2D ), в отличие от ранних уровней.
  • Замораживайте ранние слои до кластерных слоев во время тонкой настройки. Рассматривайте количество замороженных слоев как гиперпараметр. Опытным путем замораживание большинства ранних слоев идеально подходит для текущего API кластеризации.
  • Избегайте кластеризации критических слоев (например, механизма внимания).

Дополнительная информация : tfmot.clustering.keras.cluster_weights API tfmot.clustering.keras.cluster_weights содержат подробную информацию о том, как изменять конфигурацию кластеризации для каждого слоя.

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

Контрольная точка и десериализация кластерной модели

Ваш вариант использования: этот код необходим только для формата модели HDF5 (не для весов HDF5 или других форматов).

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

Повысить точность кластерной модели

Для вашего конкретного случая использования есть советы, которые вы можете рассмотреть:

  • Инициализация Centroid играет ключевую роль в окончательной оптимизированной точности модели. В целом, линейная инициализация превосходит плотность и случайную инициализацию, так как она обычно не пропускает большие веса. Однако было обнаружено, что инициализация плотности дает лучшую точность в случае использования очень небольшого количества кластеров на весах с бимодальным распределением.

  • Установите скорость обучения ниже, чем при обучении при тонкой настройке кластерной модели.

  • Общие идеи по повышению точности модели см. В разделе «Определение кластерной модели».

развертывание

Экспорт модели со сжатием по размеру

Распространенная ошибка : и strip_clustering и применение стандартного алгоритма сжатия (например, с помощью gzip) необходимы, чтобы увидеть преимущества сжатия кластеризации.

 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