![]() | ![]() | ![]() | ![]() |
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 .
- Nếu bạn muốn nhìn thấy những lợi ích của lượng tử đào tạo nhận thức và những gì đang được hỗ trợ, xem cái nhìn tổng quan .
- Đối với một đơn dụ end-to-end, xem lượng tử biết ví dụ đào tạo .
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.
-
tfmot.quantization.keras.QuantizeConfig
-
tfmot.quantization.keras.quantizers.Quantizer
-
tfmot.quantization.keras.quantizers.LastValueQuantizer
-
tfmot.quantization.keras.quantizers.MovingAverageQuantizer
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".
- Áp dụng
tfmot.quantization.keras.quantize_annotate_layer
đếnCustomLayer
và vượt qua trongQuantizeConfig
. - Sử dụng
tfmot.quantization.keras.quantize_annotate_model
tiếp tục quantize phần còn lại của mô hình với giá trị 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 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".
- Áp dụng
tfmot.quantization.keras.quantize_annotate_layer
đếnDense
lớp và vượt qua trongQuantizeConfig
. - Sử dụng
tfmot.quantization.keras.quantize_annotate_model
tiếp tục quantize phần còn lại của mô hình với giá trị mặc định API.
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".
- Áp dụng
tfmot.quantization.keras.quantize_annotate_layer
đếnDense
lớp và vượt qua trongQuantizeConfig
. - Sử dụng
tfmot.quantization.keras.quantize_annotate_model
tiếp tục quantize phần còn lại của mô hình với giá trị mặc định API.
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".
- Áp dụng
tfmot.quantization.keras.quantize_annotate_layer
đếnDense
lớp và vượt qua trongQuantizeConfig
. - Sử dụng
tfmot.quantization.keras.quantize_annotate_model
tiếp tục quantize phần còn lại của mô hình với giá trị mặc định API.
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 _________________________________________________________________