Trang này được dịch bởi Cloud Translation API.
Switch to English

Hướng dẫn toàn diện về phân nhóm trọng lượng

Xem trên TensorFlow.org Chạy trong Google Colab Xem nguồn trên GitHub Tải xuống sổ tay

Chào mừng bạn đến với hướng dẫn toàn diện về phân nhóm trọng số , một phần của bộ công cụ Tối ưu hóa mô hình TensorFlow.

Trang này ghi lại các trường hợp sử dụng khác nhau và chỉ ra cách sử dụng API cho từng trường hợp. Khi bạn biết mình cần API nào, hãy tìm các thông số và chi tiết cấp thấp trong tài liệu API :

  • Nếu bạn muốn xem lợi ích của việc phân cụm trọng lượng và những gì được hỗ trợ, hãy kiểm tra tổng quan .
  • Đối với một ví dụ end-to-end duy nhất, hãy xem ví dụ phân cụm trọng số .

Trong hướng dẫn này, các trường hợp sử dụng sau được đề cập đến:

  • Xác định một mô hình phân cụm.
  • Checkpoint và deserialize một mô hình nhóm.
  • Cải thiện độ chính xác của mô hình phân cụm.
  • Chỉ để triển khai, bạn phải thực hiện các bước để thấy lợi ích của việc nén.

Thiết lập

! 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()
WARNING: You are using pip version 20.2.2; however, version 20.2.3 is available.
You should consider upgrading via the '/tmpfs/src/tf_docs_env/bin/python -m pip install --upgrade pip' command.
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: 16.1181 - accuracy: 0.0000e+00

Xác định mô hình phân cụm

Nhóm toàn bộ mô hình (tuần tự và chức năng)

Mẹo để có độ chính xác của mô hình tốt hơn:

  • Bạn phải chuyển một mô hình được đào tạo trước với độ chính xác có thể chấp nhận được tới API này. Đào tạo mô hình từ đầu với kết quả phân cụm mang lại độ chính xác phụ.
  • Trong một số trường hợp, việc phân cụm các lớp nhất định có ảnh hưởng bất lợi đến độ chính xác của mô hình. Kiểm tra "Nhóm một số lớp" để xem cách bỏ qua nhóm các lớp ảnh hưởng đến độ chính xác nhiều nhất.

Để phân cụm tất cả các lớp, hãy áp dụng tfmot.clustering.keras.cluster_weights vào mô hình.

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
_________________________________________________________________

Nhóm một số lớp (mô hình tuần tự và chức năng)

Mẹo để có độ chính xác của mô hình tốt hơn:

  • Bạn phải chuyển một mô hình được đào tạo trước với độ chính xác có thể chấp nhận được tới API này. Đào tạo mô hình từ đầu với kết quả phân cụm mang lại độ chính xác phụ.
  • Nhóm các lớp sau với nhiều tham số dư thừa hơn (ví dụ: tf.keras.layers.Dense , tf.keras.layers.Conv2D ), trái ngược với các lớp đầu tiên.
  • Đóng băng các lớp ban đầu trước khi các lớp được nhóm lại trong quá trình tinh chỉnh. Xử lý số lớp đông lạnh như một siêu tham số. Theo kinh nghiệm, việc đóng băng hầu hết các lớp ban đầu là lý tưởng cho API phân cụm hiện tại.
  • Tránh phân cụm các lớp quan trọng (ví dụ: cơ chế chú ý).

Thêm : tài liệu API tfmot.clustering.keras.cluster_weights cung cấp chi tiết về cách thay đổi cấu hình phân cụm cho mỗi lớp.

# 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
_________________________________________________________________

Checkpoint và deserialize một mô hình nhóm

Trường hợp sử dụng của bạn: mã này chỉ cần thiết cho định dạng kiểu HDF5 (không phải trọng lượng HDF5 hoặc các định dạng khác).

giường6120e58
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
_________________________________________________________________

Cải thiện độ chính xác của mô hình phân cụm

Đối với trường hợp sử dụng cụ thể của bạn, có những mẹo bạn có thể xem xét:

  • Khởi tạo Centroid đóng một vai trò quan trọng trong độ chính xác của mô hình được tối ưu hóa cuối cùng. Nói chung, khởi tạo tuyến tính tốt hơn mật độ và khởi tạo ngẫu nhiên vì nó không có xu hướng bỏ sót các trọng số lớn. Tuy nhiên, việc khởi tạo mật độ đã được quan sát để cung cấp độ chính xác tốt hơn cho trường hợp sử dụng rất ít cụm trên các trọng số có phân phối hai phương thức.

  • Đặt tốc độ học tập thấp hơn tốc độ được sử dụng trong đào tạo khi tinh chỉnh mô hình được phân nhóm.

  • Để biết các ý tưởng chung nhằm cải thiện độ chính xác của mô hình, hãy tìm các mẹo cho (các) trường hợp sử dụng của bạn trong phần "Xác định mô hình được phân nhóm".

Triển khai

Xuất mô hình với nén kích thước

Sai lầm phổ biến : cả strip_clustering và việc áp dụng một thuật toán nén tiêu chuẩn (ví dụ: qua gzip) đều cần thiết để thấy được lợi ích nén của phân cụm.

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 984us/step - loss: 16.1181 - 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: 1809.00 bytes
Size of gzipped clustered model with stripping: 1399.00 bytes