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

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

بررسی اجمالی

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

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

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

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

این آموزش یک مدل MNIST را از ابتدا آموزش می دهد ، صحت آن را در TensorFlow بررسی می کند ، و سپس مدل را به کوانتاسیون محدوده دینامیکی به یک flatbuffer 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)
)
2021-09-12 11:15:11.173006: E tensorflow/stream_executor/cuda/cuda_driver.cc:271] failed call to cuInit: CUDA_ERROR_SYSTEM_DRIVER_MISMATCH: system has unsupported display driver / cuda driver combination
2021-09-12 11:15:11.173171: E tensorflow/stream_executor/cuda/cuda_diagnostics.cc:313] kernel version 470.57.2 does not match DSO version 470.63.1 -- cannot find working devices in this configuration
1875/1875 [==============================] - 11s 5ms/step - loss: 0.2621 - accuracy: 0.9256 - val_loss: 0.1208 - val_accuracy: 0.9627
<keras.callbacks.History at 0x7fc628be2550>

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

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

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

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

converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()
2021-09-12 11:15:22.477956: 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/tmphu4bq30h/assets
2021-09-12 11:15:22.930564: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-09-12 11:15:22.930614: 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/tmp2j3lul1o/assets
INFO:tensorflow:Assets written to: /tmp/tmp2j3lul1o/assets
2021-09-12 11:15:23.566446: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-09-12 11:15:23.566494: 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 180K
-rw-rw-r-- 1 kbuilder kbuilder 83K Sep 12 11:15 mnist_model.tflite
-rw-rw-r-- 1 kbuilder kbuilder 24K Sep 12 11:15 mnist_model_quant.tflite
-rw-rw-r-- 1 kbuilder kbuilder 25K Sep 12 11:14 mnist_model_quant_16x8.tflite
-rw-rw-r-- 1 kbuilder kbuilder 44K Sep 12 11:11 mnist_model_quant_f16.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.9627

برای دستیابی به موارد زیر ، ارزیابی مدل کوانتیزه محدوده پویا را تکرار کنید.

print(evaluate_model(interpreter_quant))
0.9631

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

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

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

شما می توانید نمودار یخ زده را با استفاده از روش های زیر به یک flatbuffer 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/tmp0ylf7auc/assets
INFO:tensorflow:Assets written to: /tmp/tmp0ylf7auc/assets
2021-09-12 11:15:50.335557: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-09-12 11:15:50.335615: 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/tmpb5zp9x41/assets
INFO:tensorflow:Assets written to: /tmp/tmpb5zp9x41/assets
2021-09-12 11:16:05.487162: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-09-12 11:16:05.487213: 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 Sep 12 11:15 /tmp/mnist_tflite_models/mnist_model.tflite
-rw-rw-r-- 1 kbuilder kbuilder  24K Sep 12 11:15 /tmp/mnist_tflite_models/mnist_model_quant.tflite
-rw-rw-r-- 1 kbuilder kbuilder  25K Sep 12 11:14 /tmp/mnist_tflite_models/mnist_model_quant_16x8.tflite
-rw-rw-r-- 1 kbuilder kbuilder  44K Sep 12 11:11 /tmp/mnist_tflite_models/mnist_model_quant_f16.tflite
-rw-rw-r-- 1 kbuilder kbuilder 171M Sep 12 11:15 /tmp/mnist_tflite_models/resnet_v2_101.tflite
-rw-rw-r-- 1 kbuilder kbuilder  45M Sep 12 11:16 /tmp/mnist_tflite_models/resnet_v2_101_quantized.tflite

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

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