이 페이지는 Cloud Translation API를 통해 번역되었습니다.
Switch to English

가중치 클러스터링 종합 가이드

TensorFlow.org에서보기 Google Colab에서 실행 GitHub에서 소스보기 노트북 다운로드

TensorFlow 모델 최적화 툴킷의 일부인 가중치 클러스터링에 대한 종합 안내서에 오신 것을 환영합니다.

이 페이지는 다양한 사용 사례를 문서화하고 각각에 대해 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.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)                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
_________________________________________________________________

군집 모델의 정확도 향상

특정 사용 사례에 대해 고려해야 할 팁이 있습니다.

  • 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