روز جامعه ML 9 نوامبر است! برای به روز رسانی از TensorFlow، JAX به ما بپیوندید، و بیشتر بیشتر بدانید

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

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

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

این صفحه موارد استفاده مختلف را مستند می کند و نحوه استفاده از 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()

مدل خوشه ای را تعریف کنید

خوشه یک مدل کامل (متوالی و کاربردی)

نکاتی برای دقت مدل بهتر:

  • شما باید یک مدل از پیش آموزش دیده با دقت قابل قبول را به این 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.KMEANS_PLUS_PLUS
}

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)                823       
_________________________________________________________________
cluster_flatten_2 (ClusterWe (None, 20)                0         
=================================================================
Total params: 823
Trainable params: 423
Non-trainable params: 400
_________________________________________________________________

دسته بندی چند لایه (مدلهای متوالی و کاربردی)

نکاتی برای دقت مدل بهتر:

  • شما باید یک مدل از پیش آموزش دیده با دقت قابل قبول را به این API منتقل کنید. مدلهای آموزش از ابتدا با خوشه بندی باعث می شود که دقت بیشتری به دست آید.
  • خوشه لایه بعد با پارامترهای کار برکنار شده (به عنوان مثال tf.keras.layers.Dense ، tf.keras.layers.Conv2D )، به عنوان اوایل لایه مخالف است.
  • در حین تنظیم دقیق ، لایه های اولیه را قبل از لایه های خوشه ای فریز کنید. با تعداد لایه های یخ زده به عنوان یک پارامتر فوق العاده رفتار کنید. از لحاظ تجربی ، انجماد بیشتر لایه های اولیه برای API خوشه بندی کنونی ایده آل است.
  • از خوشه بندی لایه های مهم (مانند مکانیسم توجه) خودداری کنید.

بیشتر: tfmot.clustering.keras.cluster_weights اسناد API جزئیات در مورد چگونگی تغییر پیکربندی خوشه ها در هر لایه فراهم می کند.

# 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)                823       
_________________________________________________________________
flatten_3 (Flatten)          (None, 20)                0         
=================================================================
Total params: 823
Trainable params: 423
Non-trainable params: 400
_________________________________________________________________

دسته بندی Keras سفارشی یا تعیین وزن کدام لایه برای خوشه بندی

tfmot.clustering.keras.ClusterableLayer در خدمت دو از موارد استفاده:

  1. هر لایه ای را که بومی پشتیبانی نمی شود ، از جمله یک لایه سفارشی Keras ، خوشه بندی کنید.
  2. تعیین کنید که کدام وزن لایه پشتیبانی شده باید خوشه بندی شود.

برای مثال، پیش فرض API به تنها خوشه هسته Dense لایه. مثال زیر نشان می دهد که چگونه می توان آن را تغییر داد تا تعصب را نیز خوشه بندی کند. توجه داشته باشید که ناشی از لایه keras، شما نیاز به نادیده گرفتن تابع get_clusterable_weights ، که در آن شما در نام متغیر تربیت شدنی به خوشه می شود و متغیر تربیت شدنی خود را مشخص کنید. به عنوان مثال ، اگر یک لیست خالی [] را برگردانید ، هیچ وزنی قابل جمع نیست.

اشتباه رایج: خوشه تعصب معمولا دقت مدل آسیب می رساند بیش از حد.

class MyDenseLayer(tf.keras.layers.Dense, tfmot.clustering.keras.ClusterableLayer):

  def get_clusterable_weights(self):
   # Cluster kernel and bias. This is just an example, clustering
   # bias usually hurts model accuracy.
   return [('kernel', self.kernel), ('bias', self.bias)]

# Use `cluster_weights` to make the `MyDenseLayer` layer train with clustering as usual.
model_for_clustering = tf.keras.Sequential([
  tfmot.clustering.keras.cluster_weights(MyDenseLayer(20, input_shape=[input_dim]), **clustering_params),
  tf.keras.layers.Flatten()
])

model_for_clustering.summary()
Model: "sequential_4"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
cluster_my_dense_layer (Clus (None, 20)                846       
_________________________________________________________________
flatten_4 (Flatten)          (None, 20)                0         
=================================================================
Total params: 846
Trainable params: 426
Non-trainable params: 420
_________________________________________________________________

شما همچنین ممکن است استفاده از tfmot.clustering.keras.ClusterableLayer به خوشه یک لایه سفارشی keras. برای این کار، شما را گسترش tf.keras.Layer به طور معمول و پیاده سازی __init__ ، call ، و build توابع، اما شما همچنین نیاز به گسترش clusterable_layer.ClusterableLayer کلاس و پیاده سازی:

  1. get_clusterable_weights ، که در آن شما وزن دانه را مشخص به خوشه می شود، به عنوان بالا نشان داده شده.
  2. get_clusterable_algorithm ، که در آن شما در الگوریتم خوشه بندی برای تانسور وزن را مشخص کنید. این به این دلیل است که شما باید نحوه تعیین وزن لایه های سفارشی برای خوشه بندی را مشخص کنید. بازگشت خوشه کلاس الگوریتم باید از مشتق شده clustering_algorithm.ClusteringAlgorithm کلاس و تابع get_pulling_indices باید رونویسی می شود. یک نمونه از این تابع، که از وزن صفوف 1D، 2D و 3D، را می توان یافت در اینجا .

یک مثال از این مورد استفاده می توان یافت در اینجا .

یک مدل خوشه ای را بازرسی و ضدعفونی کنید

مورد استفاده خود قرار دهید: این کد فقط برای قالب مدل 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:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.
WARNING:tensorflow:No training configuration found in the save file, so the model was *not* compiled. Compile it manually.
Model: "sequential_5"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
cluster_dense_4 (ClusterWeig (None, 20)                823       
_________________________________________________________________
cluster_flatten_5 (ClusterWe (None, 20)                0         
=================================================================
Total params: 823
Trainable params: 423
Non-trainable params: 400
_________________________________________________________________

دقت مدل خوشه ای را افزایش دهید

برای مورد استفاده خاص شما ، نکاتی وجود دارد که می توانید در نظر بگیرید:

  • راه اندازی Centroid نقش کلیدی در دقت مدل نهایی بهینه شده ایفا می کند. به طور کلی ، مقداردهی اولیه++ بر عملکرد اولیه خطی ، چگالی و تصادفی برتری دارد. هنگامی که از kmeans ++ استفاده نمی کنید ، مقداردهی اولیه از چگالی و مقداردهی تصادفی بهتر است ، زیرا تمایل ندارد وزنه های بزرگ را از دست بدهد. با این حال ، مقدار اولیه چگالی مشاهده شده است تا در مورد استفاده از خوشه های بسیار کمی بر روی وزن با توزیع دو بعدی دقت بیشتری به دست آورد.

  • هنگام تنظیم دقیق مدل خوشه ای ، میزان یادگیری را کمتر از آنچه در آموزش استفاده می شود ، تنظیم کنید.

  • برای ایده های کلی برای بهبود دقت مدل ، در مورد "تعریف یک مدل خوشه ای" به دنبال نکاتی برای موارد (موارد) استفاده خود باشید.

گسترش

مدل صادرات با فشرده سازی اندازه

اشتباه رایج: هر دو 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 343ms/step - loss: 16.1181 - accuracy: 0.0000e+00
final model
Model: "sequential_6"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_5 (Dense)              (None, 20)                420       
_________________________________________________________________
flatten_6 (Flatten)          (None, 20)                0         
=================================================================
Total params: 420
Trainable params: 420
Non-trainable params: 0
_________________________________________________________________


Size of gzipped clustered model without stripping: 3447.00 bytes
WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.
Size of gzipped clustered model with stripping: 1433.00 bytes