این صفحه به‌وسیله ‏Cloud Translation API‏ ترجمه شده است.
Switch to English

آموزش آگاهی از اندازه گیری در مثال کراس

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

بررسی اجمالی

برای آموزش آگاهی از مقداردهی به یک مثال از انتها به انتها خوش آمدید.

صفحات دیگر

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

برای یافتن سریع API های مورد نیاز برای مورد استفاده خود (فراتر از اندازه گیری کامل یک مدل با 8 بیت) ، به راهنمای جامع مراجعه کنید.

خلاصه

در این آموزش ، شما:

  1. یک مدل tf.keras از ابتدا برای MNIST آموزش دهید.
  2. با استفاده از API آموزش آگاهی از میزان ، مدل را دقیق تنظیم کنید ، صحت را ببینید و یک مدل آگاه از میزان را صادر کنید.
  3. از این مدل برای ایجاد یک مدل کاملاً کوانتیزه شده برای TFLite استفاده کنید.
  4. ماندگاری دقت را در TFLite و یک مدل 4 برابر کوچکتر مشاهده کنید. برای دیدن مزایای تأخیر در تلفن همراه ، نمونه های TFLite را در مخزن برنامه TFLite امتحان کنید .

برپایی

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

Found existing installation: tensorflow 2.3.0
Uninstalling tensorflow-2.3.0:
  Successfully uninstalled tensorflow-2.3.0
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.
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.

import tempfile
import os

import tensorflow as tf

from tensorflow import keras

بدون آموزش آگاهی از کمی سازی ، یک مدل برای MNIST آموزش دهید

# 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='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=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

model.fit(
  train_images,
  train_labels,
  epochs=1,
  validation_split=0.1,
)
1688/1688 [==============================] - 8s 4ms/step - loss: 0.5175 - accuracy: 0.8544 - val_loss: 0.1275 - val_accuracy: 0.9648

<tensorflow.python.keras.callbacks.History at 0x7f37f03b39e8>

شبیه سازی و ریزه کاری از قبل آموزش دیده با آموزش آگاهی از مقداردهی

مدل را تعریف کنید

شما آموزش آگاهی از مقداردهی را برای کل مدل اعمال خواهید کرد و این را در خلاصه مدل مشاهده خواهید کرد. اکنون تمام لایه ها با "quant" پیشوند می شوند.

توجه داشته باشید که مدل بدست آمده از مقداردهی آگاه است اما کوانتیزه نمی شود (به عنوان مثال وزنها به جای int8 float32 هستند). بخشهای بعد نشان می دهد که چگونه یک مدل کوانتیزه شده از مدل آگاه سازی کمی سازی ایجاد کنید.

در راهنمای جامع ، می توانید نحوه کمی سازی برخی از لایه ها برای بهبود دقت مدل را مشاهده کنید.

import tensorflow_model_optimization as tfmot

quantize_model = tfmot.quantization.keras.quantize_model

# q_aware stands for for quantization aware.
q_aware_model = quantize_model(model)

# `quantize_model` requires a recompile.
q_aware_model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

q_aware_model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
quantize_layer (QuantizeLaye (None, 28, 28)            3         
_________________________________________________________________
quant_reshape (QuantizeWrapp (None, 28, 28, 1)         1         
_________________________________________________________________
quant_conv2d (QuantizeWrappe (None, 26, 26, 12)        147       
_________________________________________________________________
quant_max_pooling2d (Quantiz (None, 13, 13, 12)        1         
_________________________________________________________________
quant_flatten (QuantizeWrapp (None, 2028)              1         
_________________________________________________________________
quant_dense (QuantizeWrapper (None, 10)                20295     
=================================================================
Total params: 20,448
Trainable params: 20,410
Non-trainable params: 38
_________________________________________________________________

آموزش و ارزیابی مدل بر اساس پایه

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

train_images_subset = train_images[0:1000] # out of 60000
train_labels_subset = train_labels[0:1000]

q_aware_model.fit(train_images_subset, train_labels_subset,
                  batch_size=500, epochs=1, validation_split=0.1)
2/2 [==============================] - 1s 167ms/step - loss: 0.1298 - accuracy: 0.9571 - val_loss: 0.1671 - val_accuracy: 0.9600

<tensorflow.python.keras.callbacks.History at 0x7f376c6db7b8>

برای این مثال ، پس از آموزش آگاهی از مقداردهی ، در مقایسه با سطح پایه ، حداقل از دست دادن و از دست دادن دقت آزمون وجود دارد.

_, baseline_model_accuracy = model.evaluate(
    test_images, test_labels, verbose=0)

_, q_aware_model_accuracy = q_aware_model.evaluate(
   test_images, test_labels, verbose=0)

print('Baseline test accuracy:', baseline_model_accuracy)
print('Quant test accuracy:', q_aware_model_accuracy)
Baseline test accuracy: 0.9609000086784363
Quant test accuracy: 0.9628999829292297

یک مدل کوانتیزه برای TFLite ایجاد کنید

پس از این ، شما یک مدل کوانتیزه با وزن int8 و فعال سازی uint8 دارید.

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

quantized_tflite_model = converter.convert()
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/training/tracking/tracking.py:109: Model.state_updates (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/training/tracking/tracking.py:109: Layer.updates (from tensorflow.python.keras.engine.base_layer) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.
INFO:tensorflow:Assets written to: /tmp/tmpoct8ii0p/assets

ماندگاری دقت از TF تا TFLite را ببینید

برای ارزیابی مدل TF Lite در مجموعه داده آزمایش ، یک تابع کمکی تعریف کنید.

import numpy as np

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 i, test_image in enumerate(test_images):
    if i % 1000 == 0:
      print('Evaluated on {n} results so far.'.format(n=i))
    # 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)

  print('\n')
  # Compare prediction results with ground truth labels to calculate accuracy.
  prediction_digits = np.array(prediction_digits)
  accuracy = (prediction_digits == test_labels).mean()
  return accuracy

شما مدل كوانتيزه شده را ارزيابي مي كنيد و مي بينيد كه دقت TensorFlow در مورد TFLite ادامه دارد.

interpreter = tf.lite.Interpreter(model_content=quantized_tflite_model)
interpreter.allocate_tensors()

test_accuracy = evaluate_model(interpreter)

print('Quant TFLite test_accuracy:', test_accuracy)
print('Quant TF test accuracy:', q_aware_model_accuracy)
Evaluated on 0 results so far.
Evaluated on 1000 results so far.
Evaluated on 2000 results so far.
Evaluated on 3000 results so far.
Evaluated on 4000 results so far.
Evaluated on 5000 results so far.
Evaluated on 6000 results so far.
Evaluated on 7000 results so far.
Evaluated on 8000 results so far.
Evaluated on 9000 results so far.


Quant TFLite test_accuracy: 0.963
Quant TF test accuracy: 0.9628999829292297

مدل 4 برابر کوچکتر از مقداردهی را ببینید

شما یک مدل TFLite شناور ایجاد می کنید و سپس می بینید که مدل TFLite کمی شده 4 برابر کوچکتر است.

# Create float TFLite model.
float_converter = tf.lite.TFLiteConverter.from_keras_model(model)
float_tflite_model = float_converter.convert()

# Measure sizes of models.
_, float_file = tempfile.mkstemp('.tflite')
_, quant_file = tempfile.mkstemp('.tflite')

with open(quant_file, 'wb') as f:
  f.write(quantized_tflite_model)

with open(float_file, 'wb') as f:
  f.write(float_tflite_model)

print("Float model in Mb:", os.path.getsize(float_file) / float(2**20))
print("Quantized model in Mb:", os.path.getsize(quant_file) / float(2**20))
INFO:tensorflow:Assets written to: /tmp/tmpy0445k6u/assets

INFO:tensorflow:Assets written to: /tmp/tmpy0445k6u/assets

Float model in Mb: 0.08053970336914062
Quantized model in Mb: 0.02339935302734375

نتیجه

در این آموزش ، نحوه ایجاد مدلهای آگاهی از کوانتیزه را با TensorFlow Model Optimization Toolkit API و سپس مدلهای کوانتیزه شده برای TFLite مشاهده کردید.

شما با کمترین تفاوت دقت ، فشرده سازی اندازه مدل 4x را برای یک مدل برای MNIST مشاهده کردید. برای دیدن مزایای تأخیر در تلفن همراه ، نمونه های TFLite را در مخزن برنامه TFLite امتحان کنید .

ما شما را تشویق می کنیم که این قابلیت جدید را امتحان کنید ، که به ویژه می تواند برای استقرار در محیط های دارای محدودیت مهم باشد.