این صفحه به‌وسیله ‏Cloud Translation API‏ ترجمه شده است.
Switch to English

راهنمای جامع خوشه بندی وزن

مشاهده در TensorFlow.org در Google Colab اجرا کنید مشاهده منبع در GitHub بارگیری نوت بوک

به راهنمای جامع برای خوشه بندی وزن، بخشی از ابزار TensorFlow مدل بهینه سازی خوش آمدید.

این صفحه موارد مختلفی را اسناد می کند و نحوه استفاده از API برای هر یک را نشان می دهد. هنگامی که می دانید به کدام API نیاز دارید ، پارامترها و جزئیات سطح پایین را در اسناد API پیدا کنید :

در این راهنما موارد استفاده زیر پوشش داده شده است:

  • یک مدل خوشه ای تعریف کنید.
  • بازرسی و یک مدل خوشه دار deserialize کنید.
  • دقت مدل خوشهای را بهبود بخشید.
  • فقط برای استقرار ، شما باید اقدامات لازم را برای دیدن مزایای فشرده سازی انجام دهید.

برپایی

 ! 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.Conv2D ) ، بر خلاف لایه های اولیه.
  • لایه های اولیه را قبل از لایه های خوشه ای در هنگام تنظیم دقیق مسدود کنید. تعداد لایه های یخ زده را به عنوان یک ابرپرامتر درمان کنید. از نظر تجربی ، یخ زدن بیشتر لایه های اولیه برای API خوشه بندی فعلی ایده آل است.
  • از خوشه بندی لایه های مهم (به عنوان مثال مکانیسم توجه) خودداری کنید.

موارد بیشتر : اسناد 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
_________________________________________________________________

بازرسی و یک مدل خوشه دار deserialize کنید

مورد استفاده شما: این کد فقط برای قالب مدل 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