Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

Ağırlık kümeleme kapsamlı kılavuzu

TensorFlow.org üzerinde görüntüle Google Colab'da yayınla Kaynağı GitHub'da görüntüle Not defterini indir

TensorFlow Model Optimizasyon araç setinin bir parçası olan ağırlık kümeleme için kapsamlı kılavuza hoş geldiniz.

Bu sayfa çeşitli kullanım örneklerini belgelemekte ve her biri için API'nın nasıl kullanılacağını göstermektedir. Hangi API'lara ihtiyacınız olduğunu öğrendikten sonra, API belgelerinde parametreleri ve düşük düzeyli ayrıntıları bulun:

Bu kılavuzda aşağıdaki kullanım durumları ele alınmaktadır:

  • Kümelenmiş bir model tanımlayın.
  • Kümelenmiş bir modeli kontrol edin ve serisini kaldırın.
  • Kümelenmiş modelin doğruluğunu artırın.
  • Yalnızca dağıtım için sıkıştırma avantajlarını görmek üzere adımlar atmanız gerekir.

Kurmak

 ! 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

Kümelenmiş bir model tanımlama

Bütün bir modeli kümeleme (sıralı ve işlevsel)

Daha iyi model doğruluğu için ipuçları :

  • Bu API'ya kabul edilebilir doğrulukta önceden eğitilmiş bir model geçmelisiniz. Kümeleme ile sıfırdan eğitim modelleri, subpar doğruluğunu sağlar.
  • Bazı durumlarda, belirli katmanların kümelenmesinin model doğruluğu üzerinde zararlı bir etkisi vardır. Doğruluğu en fazla etkileyen katmanların nasıl kümeleneceğini atlamak için "Bazı katmanları kümele" seçeneğini işaretleyin.

Tüm katmanları tfmot.clustering.keras.cluster_weights için modele tfmot.clustering.keras.cluster_weights uygulayın.

 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
_________________________________________________________________

Bazı katmanları kümeleme (sıralı ve işlevsel modeller)

Daha iyi model doğruluğu için ipuçları :

  • Bu API'ya kabul edilebilir doğrulukta önceden eğitilmiş bir model geçmelisiniz. Kümeleme ile sıfırdan eğitim modelleri, subpar doğruluğunu sağlar.
  • Daha sonraki katmanları, erken katmanlardan farklı olarak daha fazla yedek parametreyle (örn. tf.keras.layers.Dense , tf.keras.layers.Conv2D ) tf.keras.layers.Conv2D .
  • İnce ayar sırasında kümelenmiş katmanlardan önce erken katmanları dondurun. Donmuş katman sayısını hiperparametre olarak kabul edin. Ampirik olarak, erken katmanların çoğunun dondurulması mevcut kümeleme API'sı için idealdir.
  • Kritik katmanları kümelemekten kaçının (örn. Dikkat mekanizması).

Diğer : tfmot.clustering.keras.cluster_weights API dokümanları, katman başına kümeleme yapılandırmasının nasıl değiştirileceği hakkında ayrıntılar sağlar.

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

Kümelenmiş bir modeli kontrol etme ve serisini kaldırma

Kullanım durumunuz: bu kod yalnızca HDF5 model biçimi için gereklidir (HDF5 ağırlıkları veya diğer biçimler için değil).

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

Kümelenmiş modelin doğruluğunu artırın

Özel kullanım durumunuz için göz önünde bulundurabileceğiniz ipuçları vardır:

  • Centroid başlatma, optimize edilmiş son model doğruluğunda önemli bir rol oynar. Genel olarak, doğrusal başlatma yoğunluğu ve rasgele başlatmayı aşar, çünkü büyük ağırlıkları kaçırmaz. Bununla birlikte, yoğunluk başlatmanın, bimodal dağılımlı ağırlıklar üzerinde çok az sayıda küme kullanılması durumunda daha iyi doğruluk sağladığı gözlemlenmiştir.

  • Kümelenmiş modele ince ayar yaparken eğitimde kullanılandan daha düşük bir öğrenme oranı ayarlayın.

  • Model doğruluğunu artırmaya yönelik genel fikirler için, "Kümelenmiş bir model tanımla" altında kullanım örnek (ler) inize ilişkin ipuçlarına bakın.

yayılma

Modeli boyut sıkıştırma ile dışa aktarma

Sık karşılaşılan hata : Kümelemenin sıkıştırma avantajlarını görmek için strip_clustering ve standart bir sıkıştırma algoritması (örn. Gzip aracılığıyla) uygulamak gerekir.

 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