Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

Panduan komprehensif pengelompokan bobot

Lihat di TensorFlow.org Jalankan di Google Colab Lihat sumber di GitHub Unduh buku catatan

Selamat datang di panduan komprehensif untuk pengelompokan bobot , bagian dari toolkit Pengoptimalan Model TensorFlow.

Halaman ini mendokumentasikan berbagai kasus penggunaan dan menunjukkan cara menggunakan API untuk masing-masing kasus. Setelah Anda mengetahui API mana yang Anda butuhkan, temukan parameter dan detail level rendah di dokumen API :

Dalam panduan ini, kasus penggunaan berikut tercakup:

  • Tentukan model berkerumun.
  • Checkpoint dan deserialisasi model berkerumun.
  • Meningkatkan akurasi model cluster.
  • Untuk penerapan saja, Anda harus mengambil langkah-langkah untuk melihat manfaat kompresi.

Mempersiapkan

! 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.1; however, version 20.2.2 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

Tentukan model berkerumun

Kelompokkan seluruh model (berurutan dan fungsional)

Tips untuk akurasi model yang lebih baik:

  • Anda harus meneruskan model terlatih dengan akurasi yang dapat diterima ke API ini. Melatih model dari awal dengan hasil pengelompokan dalam akurasi di bawah standar.
  • Dalam beberapa kasus, pengelompokan lapisan tertentu memiliki efek merugikan pada akurasi model. Centang "Gugus beberapa lapisan" untuk melihat cara melewati pengelompokan lapisan yang paling memengaruhi akurasi.

Untuk mengelompokkan semua lapisan, terapkan tfmot.clustering.keras.cluster_weights ke model.

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
_________________________________________________________________

Cluster beberapa lapisan (model sekuensial dan fungsional)

Tips untuk akurasi model yang lebih baik:

  • Anda harus meneruskan model terlatih dengan akurasi yang dapat diterima ke API ini. Melatih model dari awal dengan hasil pengelompokan dalam akurasi di bawah standar.
  • Cluster layer selanjutnya dengan parameter yang lebih redundan (misalnya tf.keras.layers.Dense , tf.keras.layers.Conv2D ), sebagai lawan dari layer awal.
  • Bekukan lapisan awal sebelum lapisan berkerumun selama penyempurnaan. Perlakukan jumlah lapisan beku sebagai hyperparameter. Secara empiris, membekukan sebagian besar lapisan awal sangat ideal untuk API pengelompokan saat ini.
  • Hindari pengelompokan lapisan kritis (misalnya mekanisme perhatian).

Selengkapnya : dokumen API tfmot.clustering.keras.cluster_weights memberikan detail tentang cara memvariasikan konfigurasi pengelompokan per lapisan.

# 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 dan deserialisasi model berkerumun

Kasus penggunaan Anda: kode ini hanya diperlukan untuk format model HDF5 (bukan bobot HDF5 atau format lain).

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

Meningkatkan akurasi model cluster

Untuk kasus penggunaan khusus Anda, ada tips yang dapat Anda pertimbangkan:

  • Inisialisasi sentroid memainkan peran kunci dalam akurasi model akhir yang dioptimalkan. Secara umum, inisialisasi linier mengungguli kepadatan dan inisialisasi acak karena cenderung melewatkan bobot yang besar. Namun, inisialisasi massa jenis telah diamati untuk memberikan akurasi yang lebih baik untuk kasus penggunaan kluster yang sangat sedikit pada bobot dengan distribusi bimodal.

  • Setel kecepatan pemelajaran yang lebih rendah dari yang digunakan dalam pelatihan saat menyesuaikan model yang dikelompokkan.

  • Untuk ide umum untuk meningkatkan akurasi model, cari tips untuk kasus penggunaan Anda di bagian "Tentukan model berkerumun".

Penyebaran

Ekspor model dengan kompresi ukuran

Kesalahan umum : strip_clustering dan penerapan algoritme kompresi standar (mis. Via gzip) diperlukan untuk melihat manfaat kompresi dari 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 961us/step - loss: 2.7114 - 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: 1818.00 bytes
Size of gzipped clustered model with stripping: 1412.00 bytes