このページは Cloud Translation API によって翻訳されました。
Switch to English

重量クラスタリング包括的なガイド

TensorFlow.org上に表示します Googleのコラボで実行します GitHubの上のソースを表示 ダウンロードノート

TensorFlowモデルの最適化ツールキットの一部で、 重量クラスタリングのための総合的なガイドへようこそ。

このページには、各1のためにAPIを使用する方法の様々なユースケースやショーが記載されています。あなたが必要とどの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()
 
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.Densetf.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)                423       
_________________________________________________________________
flatten_3 (Flatten)          (None, 20)                0         
=================================================================
Total params: 423
Trainable params: 23
Non-trainable params: 400
_________________________________________________________________

チェックポイントとクラスタ化されたモデルをデシリアライズ

ご利用の場合:このコードは、唯一の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
_________________________________________________________________

クラスタ化されたモデルの精度を向上させます

あなたの特定のユースケースでは、あなたが考えることができますヒントがあります:

  • 重心の初期化は、最終的な最適化されたモデルの精度に重要な役割を果たしています。一般的には、リニア初期化よりも優れ密度とランダムな初期化はそれが大きなウェイトを欠場する傾向がないからです。しかしながら、密度の初期化は、二峰性分布の重みに非常に少数のクラスタを使用する場合のためのより良い精度を与えることが観察されています。

  • とき微調整クラスタ化されたモデルのトレーニングに使用されるものよりも低い学習率を設定します。

  • 一般的なアイデアは、下のご使用の場合(複数可)のためのヒントについては、モデルの精度、外観を向上させるためには、「クラスタ化されたモデルを定義します」。

配備

サイズ圧縮と輸出モデル

よくある間違い :両方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