דף זה תורגם על ידי Cloud Translation API.
Switch to English

משקל באשכול מדריך מקיף

צפה על TensorFlow.org הפעל ב Google Colab מקור צפה על GitHub מחברת להורדה

ברוכים הבאים למדריך המקיף עבור אשכולות במשקל, חלק Toolkit אופטימיזציה דגם TensorFlow.

דף זה מתעד מקרי שימוש שונים ומראה כיצד להשתמש ב- API עבור כול אחד. ברגע שאתה יודע אילו ממשקי API שאתה צריך, למצוא את הפרמטרים ופרטים ברמה הנמוכה ב docs 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 הזה. הכשרת מודלים מאפסים עם clustering תוצאות דיוק subpar.
  • בחלק מהמקרים, clustering שכבות מסוימות יש השפעה מזיקה על דיוק המודל. סמן את האפשרות "אשכול כמה שכבות" כדי לראות איך לדלג clustering שכבות שמשפיעות דיוק ביותר.

לאשכול כל השכבות, להחיל 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 הזה. הכשרת מודלים מאפסים עם clustering תוצאות דיוק subpar.
  • אשכול שכבות מאוחר עם פרמטרים מיותר יותר (למשל tf.keras.layers.Dense , tf.keras.layers.Conv2D ), לעומת השכבות הראשונות.
  • להקפיא מוקדם שכבות לפני השכבות באשכולות במהלך הכוונון העדין. פנקו את מספר שכבות קפוא כמו hyperparameter. אמפירי, מקפיא שכבות המוקדמות ביותר הוא אידיאלי עבור ה- API באשכול הנוכחי.
  • הימנע clustering שכבות קריטיות (מנגנון תשומה למשל).

יותר: tfmot.clustering.keras.cluster_weights Docs 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)                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 משחק תפקיד מרכזי דיוק מודל אופטימיזציה הסופי. באופן כללי, הצפיפות בביצועיו האתחול ליניארי אתחול אקראי שכן הוא אינו נוטה משקולות גדולות מיס. עם זאת, אתחול צפיפות נצפה לתת דיוק טוב יותר במקרה של שימוש אשכולות מעט מאוד על משקולות עם הפצות bimodal.

  • קבע תעריף הלמידה כי היא נמוכה מזו הנהוגה באימון כאשר הכוונון העדין המודל אשכולות.

  • לקבלת רעיונות כלליים לשיפור מודל דיוק, לחפש עצות עבור המקרה שלכם (ים) תחת "הגדרת מודל אשכולות".

פְּרִיסָה

מודל יצוא עם דחיסת גודל

טעות נפוצה: הן 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