Hướng dẫn toàn diện về đào tạo nhận thức lượng tử hóa

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

Chào mừng bạn đến với hướng dẫn toàn diện về đào tạo nhận thức lượng tử hóa Keras.

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 sử dụng. Một khi bạn biết được các API bạn cần, tìm các thông số và các chi tiết ở mức độ thấp trong tài liệu API .

Các trường hợp sử dụng sau được đề cập:

  • Triển khai một mô hình với lượng tử hóa 8-bit với các bước sau.
    • Xác định một mô hình lượng tử hóa nhận biết.
    • Chỉ dành cho các kiểu Keras HDF5, hãy sử dụng logic điểm kiểm tra và giải mã đặc biệt. Đào tạo là tiêu chuẩn khác.
    • Tạo một mô hình lượng tử hóa từ mô hình lượng tử hóa nhận biết.
  • Thử nghiệm với lượng tử hóa.
    • Bất kỳ thứ gì để thử nghiệm không có đường dẫn triển khai được hỗ trợ.
    • Các lớp Keras tùy chỉnh nằm trong quá trình thử nghiệm.

Thành lập

Để tìm các API bạn cần và hiểu mục đích, bạn có thể chạy nhưng bỏ qua việc đọc phần này.

! pip uninstall -y tensorflow
! pip install -q tf-nightly
! pip install -q tensorflow-model-optimization

import tensorflow as tf
import numpy as np
import tensorflow_model_optimization as tfmot

import tempfile

input_shape = [20]
x_train = np.random.randn(1, 20).astype(np.float32)
y_train = tf.keras.utils.to_categorical(np.random.randn(1), num_classes=20)

def setup_model():
  model = tf.keras.Sequential([
      tf.keras.layers.Dense(20, input_shape=input_shape),
      tf.keras.layers.Flatten()
  ])
  return model

def setup_pretrained_weights():
  model= setup_model()

  model.compile(
      loss=tf.keras.losses.categorical_crossentropy,
      optimizer='adam',
      metrics=['accuracy']
  )

  model.fit(x_train, y_train)

  _, pretrained_weights = tempfile.mkstemp('.tf')

  model.save_weights(pretrained_weights)

  return pretrained_weights

def setup_pretrained_model():
  model = setup_model()
  pretrained_weights = setup_pretrained_weights()
  model.load_weights(pretrained_weights)
  return model

setup_model()
pretrained_weights = setup_pretrained_weights()
2021-10-01 11:29:25.336019: E tensorflow/stream_executor/cuda/cuda_driver.cc:271] failed call to cuInit: CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected

Xác định mô hình nhận biết lượng tử hóa

Bằng việc xác định mô hình theo các cách sau, có những con đường có sẵn để triển khai đến backends được liệt kê trong trang tổng quan . Theo mặc định, lượng tử hóa 8 bit được sử dụng.

Định lượng toàn bộ mô hình

Trường hợp sử dụng của bạn:

  • Các mô hình phân lớp không được hỗ trợ.

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

  • Hãy thử "Lượng tử hóa một số lớp" để bỏ qua lượng tử hóa các lớp làm giảm độ chính xác nhiều nhất.
  • Nói chung tốt hơn là finetune với đào tạo nhận thức lượng tử hóa thay vì đào tạo từ đầu.

Để làm cho toàn bộ mô hình nhận thức lượng tử hóa, áp dụng tfmot.quantization.keras.quantize_model cho mô hình.

base_model = setup_model()
base_model.load_weights(pretrained_weights) # optional but recommended for model accuracy

quant_aware_model = tfmot.quantization.keras.quantize_model(base_model)
quant_aware_model.summary()
Model: "sequential_2"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 quantize_layer (QuantizeLay  (None, 20)               3         
 er)                                                             
                                                                 
 quant_dense_2 (QuantizeWrap  (None, 20)               425       
 perV2)                                                          
                                                                 
 quant_flatten_2 (QuantizeWr  (None, 20)               1         
 apperV2)                                                        
                                                                 
=================================================================
Total params: 429
Trainable params: 420
Non-trainable params: 9
_________________________________________________________________

Lượng tử hóa một số lớp

Việc định lượng một mô hình có thể có ảnh hưởng tiêu cực đến độ chính xác. Bạn có thể định lượng một cách chọn lọc các lớp của mô hình để khám phá sự cân bằng giữa độ chính xác, tốc độ và kích thước mô hình.

Trường hợp sử dụng của bạn:

  • Để triển khai tới một chương trình phụ trợ chỉ hoạt động tốt với các mô hình được lượng tử hóa hoàn toàn (ví dụ: EdgeTPU v1, hầu hết các DSP), hãy thử "Lượng tử hóa toàn bộ mô hình".

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

  • Nói chung tốt hơn là finetune với đào tạo nhận thức lượng tử hóa thay vì đào tạo từ đầu.
  • Hãy thử lượng tử hóa các lớp sau thay vì các lớp đầu tiên.
  • Tránh định lượng các lớp tới hạn (ví dụ: cơ chế chú ý).

Trong ví dụ dưới đây, quantize chỉ Dense lớp.

# Create a base model
base_model = setup_model()
base_model.load_weights(pretrained_weights) # optional but recommended for model accuracy

# Helper function uses `quantize_annotate_layer` to annotate that only the 
# Dense layers should be quantized.
def apply_quantization_to_dense(layer):
  if isinstance(layer, tf.keras.layers.Dense):
    return tfmot.quantization.keras.quantize_annotate_layer(layer)
  return layer

# Use `tf.keras.models.clone_model` to apply `apply_quantization_to_dense` 
# to the layers of the model.
annotated_model = tf.keras.models.clone_model(
    base_model,
    clone_function=apply_quantization_to_dense,
)

# Now that the Dense layers are annotated,
# `quantize_apply` actually makes the model quantization aware.
quant_aware_model = tfmot.quantization.keras.quantize_apply(annotated_model)
quant_aware_model.summary()
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.iter
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.beta_1
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.beta_2
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.decay
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.learning_rate
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'm' for (root).layer_with_weights-0.kernel
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'm' for (root).layer_with_weights-0.bias
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'v' for (root).layer_with_weights-0.kernel
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'v' for (root).layer_with_weights-0.bias
WARNING:tensorflow:A checkpoint was restored (e.g. tf.train.Checkpoint.restore or tf.keras.Model.load_weights) but not all checkpointed values were used. See above for specific issues. Use expect_partial() on the load status object, e.g. tf.train.Checkpoint.restore(...).expect_partial(), to silence these warnings, or use assert_consumed() to make the check explicit. See https://www.tensorflow.org/guide/checkpoint#loading_mechanics for details.
Model: "sequential_3"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 quantize_layer_1 (QuantizeL  (None, 20)               3         
 ayer)                                                           
                                                                 
 quant_dense_3 (QuantizeWrap  (None, 20)               425       
 perV2)                                                          
                                                                 
 flatten_3 (Flatten)         (None, 20)                0         
                                                                 
=================================================================
Total params: 428
Trainable params: 420
Non-trainable params: 8
_________________________________________________________________

Trong khi ví dụ này sử dụng các loại hình lớp để quyết định những gì để quantize, cách dễ nhất để quantize một lớp đặc biệt là để thiết lập của nó name tài sản, và tìm kiếm tên rằng trong clone_function .

print(base_model.layers[0].name)
dense_3

Dễ đọc hơn nhưng độ chính xác của mô hình có thể thấp hơn

Điều này không tương thích với việc tinh chỉnh có đào tạo nhận thức lượng tử hóa, đó là lý do tại sao nó có thể kém chính xác hơn các ví dụ trên.

Ví dụ chức năng

# Use `quantize_annotate_layer` to annotate that the `Dense` layer
# should be quantized.
i = tf.keras.Input(shape=(20,))
x = tfmot.quantization.keras.quantize_annotate_layer(tf.keras.layers.Dense(10))(i)
o = tf.keras.layers.Flatten()(x)
annotated_model = tf.keras.Model(inputs=i, outputs=o)

# Use `quantize_apply` to actually make the model quantization aware.
quant_aware_model = tfmot.quantization.keras.quantize_apply(annotated_model)

# For deployment purposes, the tool adds `QuantizeLayer` after `InputLayer` so that the
# quantized model can take in float inputs instead of only uint8.
quant_aware_model.summary()
Model: "model"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 input_1 (InputLayer)        [(None, 20)]              0         
                                                                 
 quantize_layer_2 (QuantizeL  (None, 20)               3         
 ayer)                                                           
                                                                 
 quant_dense_4 (QuantizeWrap  (None, 10)               215       
 perV2)                                                          
                                                                 
 flatten_4 (Flatten)         (None, 10)                0         
                                                                 
=================================================================
Total params: 218
Trainable params: 210
Non-trainable params: 8
_________________________________________________________________

Ví dụ tuần tự

# Use `quantize_annotate_layer` to annotate that the `Dense` layer
# should be quantized.
annotated_model = tf.keras.Sequential([
  tfmot.quantization.keras.quantize_annotate_layer(tf.keras.layers.Dense(20, input_shape=input_shape)),
  tf.keras.layers.Flatten()
])

# Use `quantize_apply` to actually make the model quantization aware.
quant_aware_model = tfmot.quantization.keras.quantize_apply(annotated_model)

quant_aware_model.summary()
Model: "sequential_4"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 quantize_layer_3 (QuantizeL  (None, 20)               3         
 ayer)                                                           
                                                                 
 quant_dense_5 (QuantizeWrap  (None, 20)               425       
 perV2)                                                          
                                                                 
 flatten_5 (Flatten)         (None, 20)                0         
                                                                 
=================================================================
Total params: 428
Trainable params: 420
Non-trainable params: 8
_________________________________________________________________

Checkpoint và deserialize

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

# Define the model.
base_model = setup_model()
base_model.load_weights(pretrained_weights) # optional but recommended for model accuracy
quant_aware_model = tfmot.quantization.keras.quantize_model(base_model)

# Save or checkpoint the model.
_, keras_model_file = tempfile.mkstemp('.h5')
quant_aware_model.save(keras_model_file)

# `quantize_scope` is needed for deserializing HDF5 models.
with tfmot.quantization.keras.quantize_scope():
  loaded_model = tf.keras.models.load_model(keras_model_file)

loaded_model.summary()
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.iter
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.beta_1
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.beta_2
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.decay
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.learning_rate
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'm' for (root).layer_with_weights-0.kernel
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'm' for (root).layer_with_weights-0.bias
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'v' for (root).layer_with_weights-0.kernel
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'v' for (root).layer_with_weights-0.bias
WARNING:tensorflow:A checkpoint was restored (e.g. tf.train.Checkpoint.restore or tf.keras.Model.load_weights) but not all checkpointed values were used. See above for specific issues. Use expect_partial() on the load status object, e.g. tf.train.Checkpoint.restore(...).expect_partial(), to silence these warnings, or use assert_consumed() to make the check explicit. See https://www.tensorflow.org/guide/checkpoint#loading_mechanics for details.
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 #   
=================================================================
 quantize_layer_4 (QuantizeL  (None, 20)               3         
 ayer)                                                           
                                                                 
 quant_dense_6 (QuantizeWrap  (None, 20)               425       
 perV2)                                                          
                                                                 
 quant_flatten_6 (QuantizeWr  (None, 20)               1         
 apperV2)                                                        
                                                                 
=================================================================
Total params: 429
Trainable params: 420
Non-trainable params: 9
_________________________________________________________________

Tạo và triển khai mô hình lượng tử hóa

Nói chung, hãy tham khảo tài liệu về chương trình phụ trợ triển khai mà bạn sẽ sử dụng.

Đây là một ví dụ cho chương trình phụ trợ TFLite.

base_model = setup_pretrained_model()
quant_aware_model = tfmot.quantization.keras.quantize_model(base_model)

# Typically you train the model here.

converter = tf.lite.TFLiteConverter.from_keras_model(quant_aware_model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]

quantized_tflite_model = converter.convert()
1/1 [==============================] - 0s 269ms/step - loss: 16.1181 - accuracy: 0.0000e+00
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.iter
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.beta_1
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.beta_2
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.decay
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.learning_rate
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'm' for (root).layer_with_weights-0.kernel
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'm' for (root).layer_with_weights-0.bias
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'v' for (root).layer_with_weights-0.kernel
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'v' for (root).layer_with_weights-0.bias
WARNING:tensorflow:A checkpoint was restored (e.g. tf.train.Checkpoint.restore or tf.keras.Model.load_weights) but not all checkpointed values were used. See above for specific issues. Use expect_partial() on the load status object, e.g. tf.train.Checkpoint.restore(...).expect_partial(), to silence these warnings, or use assert_consumed() to make the check explicit. See https://www.tensorflow.org/guide/checkpoint#loading_mechanics for details.
2021-10-01 11:29:28.281011: W tensorflow/python/util/util.cc:368] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.
WARNING:absl:Found untraced functions such as dense_7_layer_call_fn, dense_7_layer_call_and_return_conditional_losses, flatten_7_layer_call_fn, flatten_7_layer_call_and_return_conditional_losses, dense_7_layer_call_fn while saving (showing 5 of 10). These functions will not be directly callable after loading.
INFO:tensorflow:Assets written to: /tmp/tmps5i7uwfh/assets
INFO:tensorflow:Assets written to: /tmp/tmps5i7uwfh/assets
2021-10-01 11:29:29.254470: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:363] Ignored output_format.
2021-10-01 11:29:29.254516: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:366] Ignored drop_control_dependency.
WARNING:absl:Buffer deduplication procedure will be skipped when flatbuffer library is not properly loaded
2021-10-01 11:29:29.360670: W tensorflow/compiler/mlir/lite/flatbuffer_export.cc:704] Cannot get mac count for %2 = "tfl.fully_connected"(%0, %1, %cst_0) {fused_activation_function = "NONE", keep_num_dims = false, weights_format = "DEFAULT"} : (tensor<?x20x!quant.uniform<i8:f32, 3.9215686274509805E-9:-1>>, tensor<*x!quant.uniform<i8<-127:127>:f32, 0.047244094488188976>>, none) -> tensor<?x20x!quant.uniform<i8:f32, 0.047058823529411764>>

Thử nghiệm với lượng tử hóa

Trường hợp sử dụng của bạn: sử dụng các API phương tiện sau đó có không ủng hộ con đường để triển khai. Ví dụ, chuyển đổi TFLite và triển khai nhân chỉ hỗ trợ lượng tử hóa 8 bit. Các tính năng cũng là thử nghiệm và không có khả năng tương thích ngược.

Thiết lập: DefaultDenseQuantizeConfig

Thử nghiệm đòi hỏi phải sử dụng tfmot.quantization.keras.QuantizeConfig , trong đó mô tả làm thế nào để quantize trọng lượng, kích hoạt, và kết quả đầu ra của một lớp.

Dưới đây là một ví dụ định nghĩa giống nhau QuantizeConfig sử dụng cho Dense lớp trong giá trị mặc định API.

Trong công tác tuyên truyền về phía trước trong ví dụ này, LastValueQuantizer trả lại trong get_weights_and_quantizers được gọi với layer.kernel như đầu vào, sản xuất một sản lượng. Này thay thế sản lượng layer.kernel trong công tác tuyên truyền về phía trước ban đầu của Dense lớp, thông qua logic quy định tại set_quantize_weights . Ý tưởng tương tự cũng áp dụng cho các kích hoạt và kết quả đầu ra.

LastValueQuantizer = tfmot.quantization.keras.quantizers.LastValueQuantizer
MovingAverageQuantizer = tfmot.quantization.keras.quantizers.MovingAverageQuantizer

class DefaultDenseQuantizeConfig(tfmot.quantization.keras.QuantizeConfig):
    # Configure how to quantize weights.
    def get_weights_and_quantizers(self, layer):
      return [(layer.kernel, LastValueQuantizer(num_bits=8, symmetric=True, narrow_range=False, per_axis=False))]

    # Configure how to quantize activations.
    def get_activations_and_quantizers(self, layer):
      return [(layer.activation, MovingAverageQuantizer(num_bits=8, symmetric=False, narrow_range=False, per_axis=False))]

    def set_quantize_weights(self, layer, quantize_weights):
      # Add this line for each item returned in `get_weights_and_quantizers`
      # , in the same order
      layer.kernel = quantize_weights[0]

    def set_quantize_activations(self, layer, quantize_activations):
      # Add this line for each item returned in `get_activations_and_quantizers`
      # , in the same order.
      layer.activation = quantize_activations[0]

    # Configure how to quantize outputs (may be equivalent to activations).
    def get_output_quantizers(self, layer):
      return []

    def get_config(self):
      return {}

Lượng tử hóa lớp Keras tùy chỉnh

Ví dụ này sử dụng DefaultDenseQuantizeConfig để quantize các CustomLayer .

Việc áp dụng cấu hình giống nhau trong các trường hợp sử dụng "Thử nghiệm với lượng tử hóa".

quantize_annotate_layer = tfmot.quantization.keras.quantize_annotate_layer
quantize_annotate_model = tfmot.quantization.keras.quantize_annotate_model
quantize_scope = tfmot.quantization.keras.quantize_scope

class CustomLayer(tf.keras.layers.Dense):
  pass

model = quantize_annotate_model(tf.keras.Sequential([
   quantize_annotate_layer(CustomLayer(20, input_shape=(20,)), DefaultDenseQuantizeConfig()),
   tf.keras.layers.Flatten()
]))

# `quantize_apply` requires mentioning `DefaultDenseQuantizeConfig` with `quantize_scope`
# as well as the custom Keras layer.
with quantize_scope(
  {'DefaultDenseQuantizeConfig': DefaultDenseQuantizeConfig,
   'CustomLayer': CustomLayer}):
  # Use `quantize_apply` to actually make the model quantization aware.
  quant_aware_model = tfmot.quantization.keras.quantize_apply(model)

quant_aware_model.summary()
Model: "sequential_8"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 quantize_layer_6 (QuantizeL  (None, 20)               3         
 ayer)                                                           
                                                                 
 quant_custom_layer (Quantiz  (None, 20)               425       
 eWrapperV2)                                                     
                                                                 
 quant_flatten_9 (QuantizeWr  (None, 20)               1         
 apperV2)                                                        
                                                                 
=================================================================
Total params: 429
Trainable params: 420
Non-trainable params: 9
_________________________________________________________________

Sửa đổi các thông số lượng tử hóa

Sai lầm phổ biến: lượng tử hóa các thiên vị để ít hơn 32-bit thường gây tổn hại mô hình chính xác quá nhiều.

Ví dụ này sửa đổi Dense lớp để sử dụng 4-bit cho trọng lượng của nó thay vì mặc định 8-bit. Phần còn lại của mô hình tiếp tục sử dụng mặc định API.

quantize_annotate_layer = tfmot.quantization.keras.quantize_annotate_layer
quantize_annotate_model = tfmot.quantization.keras.quantize_annotate_model
quantize_scope = tfmot.quantization.keras.quantize_scope

class ModifiedDenseQuantizeConfig(DefaultDenseQuantizeConfig):
    # Configure weights to quantize with 4-bit instead of 8-bits.
    def get_weights_and_quantizers(self, layer):
      return [(layer.kernel, LastValueQuantizer(num_bits=4, symmetric=True, narrow_range=False, per_axis=False))]

Việc áp dụng cấu hình giống nhau trong các trường hợp sử dụng "Thử nghiệm với lượng tử hóa".

model = quantize_annotate_model(tf.keras.Sequential([
   # Pass in modified `QuantizeConfig` to modify this Dense layer.
   quantize_annotate_layer(tf.keras.layers.Dense(20, input_shape=(20,)), ModifiedDenseQuantizeConfig()),
   tf.keras.layers.Flatten()
]))

# `quantize_apply` requires mentioning `ModifiedDenseQuantizeConfig` with `quantize_scope`:
with quantize_scope(
  {'ModifiedDenseQuantizeConfig': ModifiedDenseQuantizeConfig}):
  # Use `quantize_apply` to actually make the model quantization aware.
  quant_aware_model = tfmot.quantization.keras.quantize_apply(model)

quant_aware_model.summary()
Model: "sequential_9"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 quantize_layer_7 (QuantizeL  (None, 20)               3         
 ayer)                                                           
                                                                 
 quant_dense_9 (QuantizeWrap  (None, 20)               425       
 perV2)                                                          
                                                                 
 quant_flatten_10 (QuantizeW  (None, 20)               1         
 rapperV2)                                                       
                                                                 
=================================================================
Total params: 429
Trainable params: 420
Non-trainable params: 9
_________________________________________________________________

Sửa đổi các phần của lớp để định lượng

Ví dụ này sửa đổi Dense lớp để bỏ qua quantizing kích hoạt. Phần còn lại của mô hình tiếp tục sử dụng mặc định API.

quantize_annotate_layer = tfmot.quantization.keras.quantize_annotate_layer
quantize_annotate_model = tfmot.quantization.keras.quantize_annotate_model
quantize_scope = tfmot.quantization.keras.quantize_scope

class ModifiedDenseQuantizeConfig(DefaultDenseQuantizeConfig):
    def get_activations_and_quantizers(self, layer):
      # Skip quantizing activations.
      return []

    def set_quantize_activations(self, layer, quantize_activations):
      # Empty since `get_activaations_and_quantizers` returns
      # an empty list.
      return

Việc áp dụng cấu hình giống nhau trong các trường hợp sử dụng "Thử nghiệm với lượng tử hóa".

model = quantize_annotate_model(tf.keras.Sequential([
   # Pass in modified `QuantizeConfig` to modify this Dense layer.
   quantize_annotate_layer(tf.keras.layers.Dense(20, input_shape=(20,)), ModifiedDenseQuantizeConfig()),
   tf.keras.layers.Flatten()
]))

# `quantize_apply` requires mentioning `ModifiedDenseQuantizeConfig` with `quantize_scope`:
with quantize_scope(
  {'ModifiedDenseQuantizeConfig': ModifiedDenseQuantizeConfig}):
  # Use `quantize_apply` to actually make the model quantization aware.
  quant_aware_model = tfmot.quantization.keras.quantize_apply(model)

quant_aware_model.summary()
Model: "sequential_10"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 quantize_layer_8 (QuantizeL  (None, 20)               3         
 ayer)                                                           
                                                                 
 quant_dense_10 (QuantizeWra  (None, 20)               423       
 pperV2)                                                         
                                                                 
 quant_flatten_11 (QuantizeW  (None, 20)               1         
 rapperV2)                                                       
                                                                 
=================================================================
Total params: 427
Trainable params: 420
Non-trainable params: 7
_________________________________________________________________

Sử dụng thuật toán lượng tử hóa tùy chỉnh

Các tfmot.quantization.keras.quantizers.Quantizer lớp là một callable có thể áp dụng bất kỳ thuật toán để đầu vào của nó.

Trong ví dụ này, đầu vào là các trọng, và chúng tôi áp dụng toán học trong FixedRangeQuantizer chức năng __call__ đến trọng lượng. Thay vì các trọng giá trị ban đầu, đầu ra của FixedRangeQuantizer bây giờ truyền cho bất cứ điều gì có thể đã sử dụng các trọng số.

quantize_annotate_layer = tfmot.quantization.keras.quantize_annotate_layer
quantize_annotate_model = tfmot.quantization.keras.quantize_annotate_model
quantize_scope = tfmot.quantization.keras.quantize_scope

class FixedRangeQuantizer(tfmot.quantization.keras.quantizers.Quantizer):
  """Quantizer which forces outputs to be between -1 and 1."""

  def build(self, tensor_shape, name, layer):
    # Not needed. No new TensorFlow variables needed.
    return {}

  def __call__(self, inputs, training, weights, **kwargs):
    return tf.keras.backend.clip(inputs, -1.0, 1.0)

  def get_config(self):
    # Not needed. No __init__ parameters to serialize.
    return {}


class ModifiedDenseQuantizeConfig(DefaultDenseQuantizeConfig):
    # Configure weights to quantize with 4-bit instead of 8-bits.
    def get_weights_and_quantizers(self, layer):
      # Use custom algorithm defined in `FixedRangeQuantizer` instead of default Quantizer.
      return [(layer.kernel, FixedRangeQuantizer())]

Việc áp dụng cấu hình giống nhau trong các trường hợp sử dụng "Thử nghiệm với lượng tử hóa".

model = quantize_annotate_model(tf.keras.Sequential([
   # Pass in modified `QuantizeConfig` to modify this `Dense` layer.
   quantize_annotate_layer(tf.keras.layers.Dense(20, input_shape=(20,)), ModifiedDenseQuantizeConfig()),
   tf.keras.layers.Flatten()
]))

# `quantize_apply` requires mentioning `ModifiedDenseQuantizeConfig` with `quantize_scope`:
with quantize_scope(
  {'ModifiedDenseQuantizeConfig': ModifiedDenseQuantizeConfig}):
  # Use `quantize_apply` to actually make the model quantization aware.
  quant_aware_model = tfmot.quantization.keras.quantize_apply(model)

quant_aware_model.summary()
Model: "sequential_11"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 quantize_layer_9 (QuantizeL  (None, 20)               3         
 ayer)                                                           
                                                                 
 quant_dense_11 (QuantizeWra  (None, 20)               423       
 pperV2)                                                         
                                                                 
 quant_flatten_12 (QuantizeW  (None, 20)               1         
 rapperV2)                                                       
                                                                 
=================================================================
Total params: 427
Trainable params: 420
Non-trainable params: 7
_________________________________________________________________