کمی سازی محدوده دینامیکی پس از آموزش

مشاهده در TensorFlow.org در Google Colab اجرا شود مشاهده منبع در GitHub دانلود دفترچه یادداشت مدل TF Hub را ببینید

بررسی اجمالی

TensorFlow آرشیو در حال حاضر پشتیبانی از تبدیل وزن به کمی دقت 8 به عنوان بخشی از تبدیل مدل از graphdefs tensorflow به فرمت بافر تخت TensorFlow بازگشت به محتوا |. کوانتیزاسیون دامنه دینامیکی به کاهش 4 برابری در اندازه مدل دست می یابد. علاوه بر این، TFLite از کوانتیزاسیون و کم‌کم‌سازی فعال‌سازی‌ها پشتیبانی می‌کند تا این امکان را فراهم کند:

  1. استفاده از هسته های کوانتیزه شده برای اجرای سریعتر در صورت وجود.
  2. اختلاط هسته های ممیز شناور با هسته های کوانتیزه برای بخش های مختلف نمودار.

فعال سازی ها همیشه در ممیز شناور ذخیره می شوند. برای عملیات‌هایی که از هسته‌های کوانتیزه‌شده پشتیبانی می‌کنند، فعال‌سازی‌ها قبل از پردازش به‌صورت پویا با دقت ۸ بیت کوانتیزه می‌شوند و پس از پردازش برای دقت شناور، کوانتیزه می‌شوند. بسته به مدلی که تبدیل می شود، این می تواند سرعت محاسبات ممیز شناور خالص را افزایش دهد.

در مقابل به آموزش آگاه تدریج ، وزن هستند آموزش ارسال کوانتیزه شده و فعال سازی به صورت پویا در استنتاج در این روش کوانتیزه. بنابراین، وزن های مدل برای جبران خطاهای ناشی از کوانتیزاسیون مجدد آموزش داده نمی شوند. بررسی دقت مدل کوانتیزه برای اطمینان از قابل قبول بودن تخریب بسیار مهم است.

این آموزش یک مدل MNIST را از ابتدا آموزش می‌دهد، دقت آن را در TensorFlow بررسی می‌کند و سپس مدل را به یک بافر مسطح Tensorflow Lite با کوانتیزه‌سازی محدوده دینامیکی تبدیل می‌کند. در نهایت دقت مدل تبدیل شده را بررسی کرده و آن را با مدل شناور اصلی مقایسه می کند.

یک مدل MNIST بسازید

برپایی

import logging
logging.getLogger("tensorflow").setLevel(logging.DEBUG)

import tensorflow as tf
from tensorflow import keras
import numpy as np
import pathlib

یک مدل TensorFlow را آموزش دهید

# Load MNIST dataset
mnist = keras.datasets.mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

# Normalize the input image so that each pixel value is between 0 to 1.
train_images = train_images / 255.0
test_images = test_images / 255.0

# Define the model architecture
model = keras.Sequential([
  keras.layers.InputLayer(input_shape=(28, 28)),
  keras.layers.Reshape(target_shape=(28, 28, 1)),
  keras.layers.Conv2D(filters=12, kernel_size=(3, 3), activation=tf.nn.relu),
  keras.layers.MaxPooling2D(pool_size=(2, 2)),
  keras.layers.Flatten(),
  keras.layers.Dense(10)
])

# Train the digit classification model
model.compile(optimizer='adam',
              loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])
model.fit(
  train_images,
  train_labels,
  epochs=1,
  validation_data=(test_images, test_labels)
)
1875/1875 [==============================] - 6s 2ms/step - loss: 0.3260 - accuracy: 0.9063 - val_loss: 0.1721 - val_accuracy: 0.9499
<keras.callbacks.History at 0x7fb7a1c4ed90>

به عنوان مثال، از آنجایی که شما مدل را فقط برای یک دوره آموزش داده اید، بنابراین فقط با دقت 96٪ تمرین می کند.

تبدیل به یک مدل TensorFlow Lite

با استفاده از پایتون TFLiteConverter ، شما می توانید در حال حاضر مدل آموزش دیده را به یک مدل TensorFlow بازگشت به محتوا | تبدیل کنید.

در حال حاضر مدل با استفاده از بار TFLiteConverter :

converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()
2021-11-02 11:23:32.211024: W tensorflow/python/util/util.cc:348] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.
INFO:tensorflow:Assets written to: /tmp/tmpua453ven/assets
2021-11-02 11:23:32.640259: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-11-02 11:23:32.640302: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency.

آن را در یک فایل tflite بنویسید:

tflite_models_dir = pathlib.Path("/tmp/mnist_tflite_models/")
tflite_models_dir.mkdir(exist_ok=True, parents=True)
tflite_model_file = tflite_models_dir/"mnist_model.tflite"
tflite_model_file.write_bytes(tflite_model)
84500

برای فرمول اندازهگیری مدل در صادرات، تنظیم optimizations پرچم برای بهینه سازی برای اندازه:

converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_quant_model = converter.convert()
tflite_model_quant_file = tflite_models_dir/"mnist_model_quant.tflite"
tflite_model_quant_file.write_bytes(tflite_quant_model)
INFO:tensorflow:Assets written to: /tmp/tmpaw0wsb_y/assets
INFO:tensorflow:Assets written to: /tmp/tmpaw0wsb_y/assets
2021-11-02 11:23:33.235475: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-11-02 11:23:33.235512: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency.
23904

توجه داشته باشید که فایل منجر، حدود است 1/4 اندازه.

ls -lh {tflite_models_dir}
total 136K
-rw-rw-r-- 1 kbuilder kbuilder 83K Nov  2 11:23 mnist_model.tflite
-rw-rw-r-- 1 kbuilder kbuilder 24K Nov  2 11:23 mnist_model_quant.tflite
-rw-rw-r-- 1 kbuilder kbuilder 25K Nov  2 11:20 mnist_model_quant_16x8.tflite

مدل های TFLite را اجرا کنید

مدل TensorFlow Lite را با استفاده از مترجم Python TensorFlow Lite اجرا کنید.

مدل را در یک مترجم بارگذاری کنید

interpreter = tf.lite.Interpreter(model_path=str(tflite_model_file))
interpreter.allocate_tensors()
interpreter_quant = tf.lite.Interpreter(model_path=str(tflite_model_quant_file))
interpreter_quant.allocate_tensors()

مدل را روی یک تصویر تست کنید

test_image = np.expand_dims(test_images[0], axis=0).astype(np.float32)

input_index = interpreter.get_input_details()[0]["index"]
output_index = interpreter.get_output_details()[0]["index"]

interpreter.set_tensor(input_index, test_image)
interpreter.invoke()
predictions = interpreter.get_tensor(output_index)
import matplotlib.pylab as plt

plt.imshow(test_images[0])
template = "True:{true}, predicted:{predict}"
_ = plt.title(template.format(true= str(test_labels[0]),
                              predict=str(np.argmax(predictions[0]))))
plt.grid(False)

png

مدل ها را ارزیابی کنید

# A helper function to evaluate the TF Lite model using "test" dataset.
def evaluate_model(interpreter):
  input_index = interpreter.get_input_details()[0]["index"]
  output_index = interpreter.get_output_details()[0]["index"]

  # Run predictions on every image in the "test" dataset.
  prediction_digits = []
  for test_image in test_images:
    # Pre-processing: add batch dimension and convert to float32 to match with
    # the model's input data format.
    test_image = np.expand_dims(test_image, axis=0).astype(np.float32)
    interpreter.set_tensor(input_index, test_image)

    # Run inference.
    interpreter.invoke()

    # Post-processing: remove batch dimension and find the digit with highest
    # probability.
    output = interpreter.tensor(output_index)
    digit = np.argmax(output()[0])
    prediction_digits.append(digit)

  # Compare prediction results with ground truth labels to calculate accuracy.
  accurate_count = 0
  for index in range(len(prediction_digits)):
    if prediction_digits[index] == test_labels[index]:
      accurate_count += 1
  accuracy = accurate_count * 1.0 / len(prediction_digits)

  return accuracy
print(evaluate_model(interpreter))
0.9499

ارزیابی را در مدل کوانتیزه دامنه دینامیکی تکرار کنید تا به دست آورید:

print(evaluate_model(interpreter_quant))
0.95

در این مثال، مدل فشرده تفاوتی در دقت ندارد.

بهینه سازی یک مدل موجود

Resnets با لایه های پیش فعال سازی (Resnet-v2) به طور گسترده ای برای برنامه های بینایی استفاده می شود. قبل از آموزش دیده نمودار منجمد برای RESNET-v2-101 در دسترس است Tensorflow توپی .

شما می توانید نمودار منجمد شده را به یک بافر مسطح TensorFLow Lite با کوانتیزه کردن توسط:

import tensorflow_hub as hub

resnet_v2_101 = tf.keras.Sequential([
  keras.layers.InputLayer(input_shape=(224, 224, 3)),
  hub.KerasLayer("https://tfhub.dev/google/imagenet/resnet_v2_101/classification/4")
])

converter = tf.lite.TFLiteConverter.from_keras_model(resnet_v2_101)
# Convert to TF Lite without quantization
resnet_tflite_file = tflite_models_dir/"resnet_v2_101.tflite"
resnet_tflite_file.write_bytes(converter.convert())
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: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.
INFO:tensorflow:Assets written to: /tmp/tmpxtji1amp/assets
INFO:tensorflow:Assets written to: /tmp/tmpxtji1amp/assets
2021-11-02 11:23:57.616139: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-11-02 11:23:57.616201: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency.
178509352
# Convert to TF Lite with quantization
converter.optimizations = [tf.lite.Optimize.DEFAULT]
resnet_quantized_tflite_file = tflite_models_dir/"resnet_v2_101_quantized.tflite"
resnet_quantized_tflite_file.write_bytes(converter.convert())
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: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.
INFO:tensorflow:Assets written to: /tmp/tmpg169iato/assets
INFO:tensorflow:Assets written to: /tmp/tmpg169iato/assets
2021-11-02 11:24:12.965799: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-11-02 11:24:12.965851: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency.
46256864
ls -lh {tflite_models_dir}/*.tflite
-rw-rw-r-- 1 kbuilder kbuilder  83K Nov  2 11:23 /tmp/mnist_tflite_models/mnist_model.tflite
-rw-rw-r-- 1 kbuilder kbuilder  24K Nov  2 11:23 /tmp/mnist_tflite_models/mnist_model_quant.tflite
-rw-rw-r-- 1 kbuilder kbuilder  25K Nov  2 11:20 /tmp/mnist_tflite_models/mnist_model_quant_16x8.tflite
-rw-rw-r-- 1 kbuilder kbuilder 171M Nov  2 11:23 /tmp/mnist_tflite_models/resnet_v2_101.tflite
-rw-rw-r-- 1 kbuilder kbuilder  45M Nov  2 11:24 /tmp/mnist_tflite_models/resnet_v2_101_quantized.tflite

حجم مدل از 171 مگابایت به 43 مگابایت کاهش می یابد. دقت این مدل در imagenet می توان با استفاده از اسکریپت های ارائه شده برای ارزیابی دقت اندازه گیری TFLite .

دقت مدل top-1 بهینه شده 76.8 است، مانند مدل ممیز شناور.