احفظ التاريخ! يعود مؤتمر Google I / O من 18 إلى 20 مايو. سجل الآن
ترجمت واجهة Cloud Translation API‏ هذه الصفحة.
Switch to English

تصنيف الصور باستخدام TensorFlow Lite Model Maker

عرض على TensorFlow.org تشغيل في Google Colab عرض المصدر على جيثب تحميل دفتر انظر نموذج TF Hub

تبسط مكتبة Model Maker عملية تكييف وتحويل نموذج الشبكة العصبية TensorFlow إلى بيانات إدخال معينة عند نشر هذا النموذج لتطبيقات ML على الجهاز.

يعرض هذا الكمبيوتر الدفتري مثالاً شاملاً يستخدم مكتبة Model Maker هذه لتوضيح تكييف وتحويل نموذج تصنيف صور شائع الاستخدام لتصنيف الزهور على جهاز محمول.

المتطلبات الأساسية

لتشغيل هذا المثال ، نحتاج أولاً إلى تثبيت العديد من الحزم المطلوبة ، بما في ذلك حزمة Model Maker الموجودة في GitHub repo .

pip install -q tflite-model-maker

استيراد الحزم المطلوبة.

import os

import numpy as np

import tensorflow as tf
assert tf.__version__.startswith('2')

from tflite_model_maker import configs
from tflite_model_maker import ExportFormat
from tflite_model_maker import image_classifier
from tflite_model_maker import ImageClassifierDataLoader
from tflite_model_maker import model_spec

import matplotlib.pyplot as plt

مثال بسيط شامل

احصل على مسار البيانات

دعنا نلعب بعض الصور مع هذا المثال البسيط الشامل. تعد مئات الصور بداية جيدة لـ Model Maker بينما يمكن أن تحقق المزيد من البيانات دقة أفضل.

Downloading data from https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz
228818944/228813984 [==============================] - 4s 0us/step

يمكنك استبدال image_path الصور الخاصة بك. بالنسبة لتحميل البيانات إلى colab ، يمكنك العثور على زر التحميل في الشريط الجانبي الأيسر الموضح في الصورة أدناه مع المستطيل الأحمر. فقط حاول تحميل ملف مضغوط وفك ضغطه. مسار الملف الجذر هو المسار الحالي.

رفع ملف

إذا كنت تفضل عدم تحميل صورك على السحابة ، فيمكنك محاولة تشغيل المكتبة محليًا باتباع الدليل في GitHub.

قم بتشغيل المثال

يتكون المثال فقط من 4 أسطر من التعليمات البرمجية كما هو موضح أدناه ، كل منها يمثل خطوة واحدة من العملية الشاملة.

الخطوة 1. تحميل بيانات الإدخال الخاصة بتطبيق ML على الجهاز. قم بتقسيمها إلى بيانات التدريب وبيانات الاختبار.

data = ImageClassifierDataLoader.from_folder(image_path)
train_data, test_data = data.split(0.9)
INFO:tensorflow:Load image with size: 3670, num_label: 5, labels: daisy, dandelion, roses, sunflowers, tulips.

الخطوة 2. تخصيص نموذج TensorFlow.

model = image_classifier.create(train_data)
INFO:tensorflow:Retraining the models...
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
hub_keras_layer_v1v2 (HubKer (None, 1280)              3413024   
_________________________________________________________________
dropout (Dropout)            (None, 1280)              0         
_________________________________________________________________
dense (Dense)                (None, 5)                 6405      
=================================================================
Total params: 3,419,429
Trainable params: 6,405
Non-trainable params: 3,413,024
_________________________________________________________________
None
Epoch 1/5
103/103 [==============================] - 15s 32ms/step - loss: 1.0672 - accuracy: 0.6416
Epoch 2/5
103/103 [==============================] - 3s 33ms/step - loss: 0.6787 - accuracy: 0.8805
Epoch 3/5
103/103 [==============================] - 3s 32ms/step - loss: 0.6351 - accuracy: 0.9090
Epoch 4/5
103/103 [==============================] - 3s 34ms/step - loss: 0.6131 - accuracy: 0.9240
Epoch 5/5
103/103 [==============================] - 3s 33ms/step - loss: 0.5960 - accuracy: 0.9361

الخطوة 3. تقييم النموذج.

loss, accuracy = model.evaluate(test_data)
12/12 [==============================] - 2s 40ms/step - loss: 0.6094 - accuracy: 0.9074

الخطوة 4. تصدير إلى نموذج TensorFlow Lite.

هنا ، نقوم بتصدير نموذج TensorFlow Lite مع البيانات الوصفية التي توفر معيارًا لأوصاف النموذج. يتم تضمين ملف التسمية في البيانات الوصفية.

يمكنك تنزيله في الشريط الجانبي الأيسر مثل جزء التحميل لاستخدامك الخاص.

model.export(export_dir='.')
INFO:tensorflow:Assets written to: /tmp/tmppwh7ok4n/assets
INFO:tensorflow:Assets written to: /tmp/tmppwh7ok4n/assets
INFO:tensorflow:Label file is inside the TFLite model with metadata.
INFO:tensorflow:Label file is inside the TFLite model with metadata.
INFO:tensorflow:Saving labels in /tmp/tmpw5ekmf9v/labels.txt.
INFO:tensorflow:Saving labels in /tmp/tmpw5ekmf9v/labels.txt.

بعد هذه الخطوات الأربع البسيطة ، يمكننا استخدام ملف نموذج TensorFlow Lite في التطبيقات الموجودة على الجهاز مثل التطبيق المرجعي لتصنيف الصور .

عملية مفصلة

حاليًا ، ندعم العديد من الطرز مثل نماذج EfficientNet-Lite * و MobileNetV2 و ResNet50 كنماذج مدربة مسبقًا لتصنيف الصور. لكن من المرن جدًا إضافة نماذج جديدة مدربة مسبقًا إلى هذه المكتبة ببضعة سطور من التعليمات البرمجية.

يسير التالي خلال هذا المثال الشامل خطوة بخطوة لإظهار المزيد من التفاصيل.

الخطوة 1: تحميل بيانات الإدخال الخاصة بتطبيق ML على الجهاز

تحتوي مجموعة بيانات الزهور على 3670 صورة تنتمي إلى 5 فئات. قم بتنزيل نسخة الأرشيف من مجموعة البيانات وفكها.

تحتوي مجموعة البيانات على بنية الدليل التالية:

flower_photos
|__ daisy
    |______ 100080576_f52e8ee070_n.jpg
    |______ 14167534527_781ceb1b7a_n.jpg
    |______ ...
|__ dandelion
    |______ 10043234166_e6dd915111_n.jpg
    |______ 1426682852_e62169221f_m.jpg
    |______ ...
|__ roses
    |______ 102501987_3cdb8e5394_n.jpg
    |______ 14982802401_a3dfb22afb.jpg
    |______ ...
|__ sunflowers
    |______ 12471791574_bb1be83df4.jpg
    |______ 15122112402_cafa41934f.jpg
    |______ ...
|__ tulips
    |______ 13976522214_ccec508fe7.jpg
    |______ 14487943607_651e8062a1_m.jpg
    |______ ...
image_path = tf.keras.utils.get_file(
      'flower_photos.tgz',
      'https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz',
      extract=True)
image_path = os.path.join(os.path.dirname(image_path), 'flower_photos')

استخدم فئة ImageClassifierDataLoader لتحميل البيانات.

أما بالنسبة from_folder() ، فيمكنها تحميل البيانات من المجلد. يفترض أن بيانات الصورة من نفس الفئة موجودة في نفس الدليل الفرعي وأن اسم المجلد الفرعي هو اسم الفئة. حاليًا ، يتم دعم الصور المشفرة بتنسيق JPEG والصور المشفرة بتنسيق PNG.

data = ImageClassifierDataLoader.from_folder(image_path)
INFO:tensorflow:Load image with size: 3670, num_label: 5, labels: daisy, dandelion, roses, sunflowers, tulips.
INFO:tensorflow:Load image with size: 3670, num_label: 5, labels: daisy, dandelion, roses, sunflowers, tulips.

قم بتقسيمها إلى بيانات التدريب (80٪) ، وبيانات التحقق (10٪ ، اختياري) وبيانات الاختبار (10٪).

train_data, rest_data = data.split(0.8)
validation_data, test_data = rest_data.split(0.5)

اعرض 25 صورة من أمثلة الصور مع التسميات.

plt.figure(figsize=(10,10))
for i, (image, label) in enumerate(data.gen_dataset().unbatch().take(25)):
  plt.subplot(5,5,i+1)
  plt.xticks([])
  plt.yticks([])
  plt.grid(False)
  plt.imshow(image.numpy(), cmap=plt.cm.gray)
  plt.xlabel(data.index_to_label[label.numpy()])
plt.show()

بي إن جي

الخطوة 2: تخصيص نموذج TensorFlow

قم بإنشاء نموذج مصنف مخصص للصور بناءً على البيانات المحملة. النموذج الافتراضي هو EfficientNet-Lite0.

model = image_classifier.create(train_data, validation_data=validation_data)
INFO:tensorflow:Retraining the models...
INFO:tensorflow:Retraining the models...
Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
hub_keras_layer_v1v2_1 (HubK (None, 1280)              3413024   
_________________________________________________________________
dropout_1 (Dropout)          (None, 1280)              0         
_________________________________________________________________
dense_1 (Dense)              (None, 5)                 6405      
=================================================================
Total params: 3,419,429
Trainable params: 6,405
Non-trainable params: 3,413,024
_________________________________________________________________
None
Epoch 1/5
91/91 [==============================] - 6s 55ms/step - loss: 1.1280 - accuracy: 0.5996 - val_loss: 0.6487 - val_accuracy: 0.8920
Epoch 2/5
91/91 [==============================] - 4s 48ms/step - loss: 0.6715 - accuracy: 0.8973 - val_loss: 0.6143 - val_accuracy: 0.9205
Epoch 3/5
91/91 [==============================] - 5s 50ms/step - loss: 0.6233 - accuracy: 0.9185 - val_loss: 0.6027 - val_accuracy: 0.9176
Epoch 4/5
91/91 [==============================] - 4s 48ms/step - loss: 0.6005 - accuracy: 0.9313 - val_loss: 0.5918 - val_accuracy: 0.9205
Epoch 5/5
91/91 [==============================] - 4s 49ms/step - loss: 0.5893 - accuracy: 0.9308 - val_loss: 0.5904 - val_accuracy: 0.9233

ألق نظرة على هيكل النموذج المفصل.

model.summary()
Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
hub_keras_layer_v1v2_1 (HubK (None, 1280)              3413024   
_________________________________________________________________
dropout_1 (Dropout)          (None, 1280)              0         
_________________________________________________________________
dense_1 (Dense)              (None, 5)                 6405      
=================================================================
Total params: 3,419,429
Trainable params: 6,405
Non-trainable params: 3,413,024
_________________________________________________________________

الخطوة الثالثة: تقييم النموذج المخصص

قم بتقييم نتيجة النموذج ، واحصل على فقد النموذج ودقته.

loss, accuracy = model.evaluate(test_data)
12/12 [==============================] - 1s 30ms/step - loss: 0.6395 - accuracy: 0.8992

يمكننا رسم النتائج المتوقعة في 100 صورة اختبار. الملصقات المتنبأ بها باللون الأحمر هي نتائج خاطئة متوقعة بينما يكون البعض الآخر صحيحًا.

# A helper function that returns 'red'/'black' depending on if its two input
# parameter matches or not.
def get_label_color(val1, val2):
  if val1 == val2:
    return 'black'
  else:
    return 'red'

# Then plot 100 test images and their predicted labels.
# If a prediction result is different from the label provided label in "test"
# dataset, we will highlight it in red color.
plt.figure(figsize=(20, 20))
predicts = model.predict_top_k(test_data)
for i, (image, label) in enumerate(test_data.gen_dataset().unbatch().take(100)):
  ax = plt.subplot(10, 10, i+1)
  plt.xticks([])
  plt.yticks([])
  plt.grid(False)
  plt.imshow(image.numpy(), cmap=plt.cm.gray)

  predict_label = predicts[i][0][0]
  color = get_label_color(predict_label,
                          test_data.index_to_label[label.numpy()])
  ax.xaxis.label.set_color(color)
  plt.xlabel('Predicted: %s' % predict_label)
plt.show()

بي إن جي

إذا كانت الدقة لا تفي بمتطلبات التطبيق ، فيمكن للمرء الرجوع إلى الاستخدام المتقدم لاستكشاف البدائل مثل التغيير إلى نموذج أكبر ، وضبط معلمات إعادة التدريب ، إلخ

الخطوة 4: تصدير إلى TensorFlow Lite Model

قم بتحويل النموذج الحالي إلى تنسيق نموذج TensorFlow Lite باستخدام البيانات الوصفية . اسم ملف TFLite الافتراضي هو model.tflite .

model.export(export_dir='.')
INFO:tensorflow:Assets written to: /tmp/tmp3t_6llys/assets
INFO:tensorflow:Assets written to: /tmp/tmp3t_6llys/assets
INFO:tensorflow:Label file is inside the TFLite model with metadata.
INFO:tensorflow:Label file is inside the TFLite model with metadata.
INFO:tensorflow:Saving labels in /tmp/tmp1sjzsixa/labels.txt.
INFO:tensorflow:Saving labels in /tmp/tmp1sjzsixa/labels.txt.

راجع أمثلة على التطبيقات وأدلة تصنيف الصور للحصول على مزيد من التفاصيل حول كيفية دمج نموذج TensorFlow Lite في تطبيقات الأجهزة المحمولة.

يمكن أن تكون تنسيقات التصدير المسموح بها واحدًا أو قائمة مما يلي:

  • ExportFormat.TFLITE
  • ExportFormat.LABEL
  • ExportFormat.SAVED_MODEL

بشكل افتراضي ، يقوم فقط بتصدير نموذج TensorFlow Lite ببيانات وصفية. يمكنك أيضًا تصدير ملفات مختلفة بشكل انتقائي. على سبيل المثال ، تصدير ملف التسمية فقط على النحو التالي:

model.export(export_dir='.', export_format=ExportFormat.LABEL)
INFO:tensorflow:Saving labels in ./labels.txt.
INFO:tensorflow:Saving labels in ./labels.txt.

يمكنك أيضا تقييم نموذج tflite مع evaluate_tflite الأسلوب.

model.evaluate_tflite('model.tflite', test_data)
INFO:tensorflow:Processing example: #0
[[[[0.22745098 0.23529412 0.15294118]
   [0.22577031 0.23361345 0.15126051]
   [0.22352941 0.23137255 0.14901961]
   ...
   [0.19887958 0.00112041 0.        ]
   [0.1927172  0.         0.        ]
   [0.16134429 0.00224095 0.        ]]

  [[0.223722   0.23156513 0.1492122 ]
   [0.22363946 0.2314826  0.14912966]
   [0.22352941 0.23137255 0.14901961]
   ...
   [0.2015432  0.00378401 0.        ]
   [0.1927172  0.         0.        ]
   [0.16134429 0.00224095 0.        ]]

  [[0.22352941 0.23137255 0.14901961]
   [0.22352941 0.23137255 0.14901961]
   [0.22656062 0.23440376 0.15205082]
   ...
   [0.20875359 0.00139553 0.        ]
   [0.19625361 0.00050519 0.        ]
   [0.16285984 0.00375651 0.        ]]

  ...

  [[0.25490198 0.2627451  0.20784314]
   [0.25490198 0.2627451  0.20784314]
   [0.25490198 0.2627451  0.20784314]
   ...
   [0.         0.         0.        ]
   [0.         0.         0.        ]
   [0.         0.         0.        ]]

  [[0.25490198 0.2627451  0.20784314]
   [0.25490198 0.2627451  0.20784314]
   [0.25490198 0.2627451  0.20784314]
   ...
   [0.         0.         0.        ]
   [0.         0.         0.        ]
   [0.         0.         0.        ]]

  [[0.25490198 0.2627451  0.20784314]
   [0.25490198 0.2627451  0.20784314]
   [0.25490198 0.2627451  0.20784314]
   ...
   [0.         0.         0.        ]
   [0.         0.         0.        ]
   [0.         0.         0.        ]]]]
INFO:tensorflow:Processing example: #0
[[[[0.22745098 0.23529412 0.15294118]
   [0.22577031 0.23361345 0.15126051]
   [0.22352941 0.23137255 0.14901961]
   ...
   [0.19887958 0.00112041 0.        ]
   [0.1927172  0.         0.        ]
   [0.16134429 0.00224095 0.        ]]

  [[0.223722   0.23156513 0.1492122 ]
   [0.22363946 0.2314826  0.14912966]
   [0.22352941 0.23137255 0.14901961]
   ...
   [0.2015432  0.00378401 0.        ]
   [0.1927172  0.         0.        ]
   [0.16134429 0.00224095 0.        ]]

  [[0.22352941 0.23137255 0.14901961]
   [0.22352941 0.23137255 0.14901961]
   [0.22656062 0.23440376 0.15205082]
   ...
   [0.20875359 0.00139553 0.        ]
   [0.19625361 0.00050519 0.        ]
   [0.16285984 0.00375651 0.        ]]

  ...

  [[0.25490198 0.2627451  0.20784314]
   [0.25490198 0.2627451  0.20784314]
   [0.25490198 0.2627451  0.20784314]
   ...
   [0.         0.         0.        ]
   [0.         0.         0.        ]
   [0.         0.         0.        ]]

  [[0.25490198 0.2627451  0.20784314]
   [0.25490198 0.2627451  0.20784314]
   [0.25490198 0.2627451  0.20784314]
   ...
   [0.         0.         0.        ]
   [0.         0.         0.        ]
   [0.         0.         0.        ]]

  [[0.25490198 0.2627451  0.20784314]
   [0.25490198 0.2627451  0.20784314]
   [0.25490198 0.2627451  0.20784314]
   ...
   [0.         0.         0.        ]
   [0.         0.         0.        ]
   [0.         0.         0.        ]]]]
{'accuracy': 0.8991825613079019}

الاستخدام المتقدم

وظيفة create هي الجزء المهم من هذه المكتبة. يستخدم نقل التعلم مع نموذج تم اختباره مسبقًا مشابه للبرنامج التعليمي .

تحتوي وظيفة create على الخطوات التالية:

  1. قسّم البيانات إلى تدريب ، والتحقق من الصحة ، واختبار البيانات وفقًا test_ratio validation_ratio المعلمة ونسبة test_ratio . القيمة الافتراضية test_ratio validation_ratio من validation_ratio ونسبة test_ratio هي 0.1 و 0.1 .
  2. قم بتنزيل Image Feature Vector كنموذج أساسي من TensorFlow Hub. النموذج الافتراضي الذي تم تدريبه مسبقًا هو EfficientNet-Lite0.
  3. أضف رأس مصنف dropout_rate Dropout مع معدل التسرب بين طبقة الرأس dropout_rate المدرب مسبقًا. dropout_rate الافتراضي هو قيمة dropout_rate الافتراضية من make_image_classifier_lib بواسطة TensorFlow Hub.
  4. المعالجة المسبقة لبيانات الإدخال الأولية. حاليًا ، خطوات المعالجة المسبقة بما في ذلك تسوية قيمة كل بكسل صورة لنموذج مقياس الإدخال وتغيير حجمه إلى حجم إدخال النموذج. EfficientNet-Lite0 لها مقياس الإدخال [0, 1] وحجم صورة الإدخال [224, 224, 3] .
  5. تغذية البيانات في نموذج المصنف. بشكل افتراضي ، تعد معلمات التدريب مثل فترات التدريب ، وحجم الدفعة ، ومعدل التعلم ، والزخم هي القيم الافتراضية من make_image_classifier_lib بواسطة TensorFlow Hub. يتم تدريب رأس المصنف فقط.

في هذا القسم ، نصف العديد من الموضوعات المتقدمة ، بما في ذلك التبديل إلى نموذج تصنيف مختلف للصور ، وتغيير معلمات التدريب الفائقة وما إلى ذلك.

تكميم ما بعد التدريب على نموذج TensorFLow Lite

التكميم بعد التدريب هو تقنية تحويل يمكن أن تقلل من حجم النموذج واستنتاج الكمون ، مع تحسين زمن انتقال وحدة المعالجة المركزية ومسرع الأجهزة ، مع انخفاض ضئيل في دقة النموذج. وبالتالي ، يتم استخدامه على نطاق واسع لتحسين النموذج.

يدعم Model Maker العديد من خيارات التكميم بعد التدريب. لنأخذ تكميم الأعداد الصحيحة كمثال. أولاً ، حدد تكوين التكميم لفرض تكميم عدد صحيح كامل لجميع العمليات بما في ذلك المدخلات والمخرجات. نوع الإدخال ونوع الإخراج هما uint8 افتراضيًا. يمكنك أيضًا تغييرها إلى أنواع أخرى مثل int8 عن طريق تعيين inference_input_type و inference_output_type في config.

config = configs.QuantizationConfig.create_full_integer_quantization(representative_data=test_data, is_integer_only=True)

ثم نقوم بتصدير نموذج TensorFlow Lite بهذا التكوين.

model.export(export_dir='.', tflite_filename='model_quant.tflite', quantization_config=config)
INFO:tensorflow:Assets written to: /tmp/tmp70czhqy4/assets
INFO:tensorflow:Assets written to: /tmp/tmp70czhqy4/assets
INFO:tensorflow:Label file is inside the TFLite model with metadata.
INFO:tensorflow:Label file is inside the TFLite model with metadata.
INFO:tensorflow:Saving labels in /tmp/tmpefl35ntl/labels.txt.
INFO:tensorflow:Saving labels in /tmp/tmpefl35ntl/labels.txt.

في Colab ، يمكنك تنزيل النموذج المسمى model_quant.tflite من الشريط الجانبي الأيسر ، مثل جزء التحميل المذكور أعلاه.

تغيير النموذج

غيّر إلى النموذج المدعوم في هذه المكتبة.

تدعم هذه المكتبة نماذج EfficientNet-Lite و MobileNetV2 و ResNet50 حتى الآن. تعد EfficientNet-Lite مجموعة من نماذج تصنيف الصور التي يمكن أن تحقق دقة متطورة ومناسبة لأجهزة Edge. النموذج الافتراضي هو EfficientNet-Lite0.

يمكننا تبديل النموذج إلى MobileNetV2 بمجرد تعيين المعلمة model_spec إلى mobilenet_v2_spec في طريقة create .

model = image_classifier.create(train_data, model_spec=model_spec.mobilenet_v2_spec, validation_data=validation_data)
INFO:tensorflow:Retraining the models...
INFO:tensorflow:Retraining the models...
Model: "sequential_2"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
hub_keras_layer_v1v2_2 (HubK (None, 1280)              2257984   
_________________________________________________________________
dropout_2 (Dropout)          (None, 1280)              0         
_________________________________________________________________
dense_2 (Dense)              (None, 5)                 6405      
=================================================================
Total params: 2,264,389
Trainable params: 6,405
Non-trainable params: 2,257,984
_________________________________________________________________
None
Epoch 1/5
91/91 [==============================] - 8s 57ms/step - loss: 1.1140 - accuracy: 0.6539 - val_loss: 0.7140 - val_accuracy: 0.8778
Epoch 2/5
91/91 [==============================] - 5s 50ms/step - loss: 0.7009 - accuracy: 0.8800 - val_loss: 0.6768 - val_accuracy: 0.8778
Epoch 3/5
91/91 [==============================] - 5s 52ms/step - loss: 0.6552 - accuracy: 0.9027 - val_loss: 0.6753 - val_accuracy: 0.8835
Epoch 4/5
91/91 [==============================] - 4s 49ms/step - loss: 0.6338 - accuracy: 0.9156 - val_loss: 0.6656 - val_accuracy: 0.8920
Epoch 5/5
91/91 [==============================] - 5s 51ms/step - loss: 0.6207 - accuracy: 0.9187 - val_loss: 0.6529 - val_accuracy: 0.8977

قم بتقييم نموذج MobileNetV2 المعاد تدريبه حديثًا لمعرفة الدقة والخسارة في بيانات الاختبار.

loss, accuracy = model.evaluate(test_data)
12/12 [==============================] - 1s 36ms/step - loss: 0.6648 - accuracy: 0.8883

التغيير إلى النموذج في TensorFlow Hub

علاوة على ذلك ، يمكننا أيضًا التبديل إلى نماذج جديدة أخرى تقوم بإدخال صورة وإخراج متجه ميزة بتنسيق TensorFlow Hub.

كنموذج Inception V3 كمثال ، يمكننا تعريف inception_v3_spec وهو كائن من ImageModelSpec ويحتوي على مواصفات نموذج Inception V3.

نحتاج إلى تحديد اسم name النموذج ، عنوان url الخاص بـ uri لنموذج TensorFlow Hub. وفي الوقت نفسه ، فإن القيمة الافتراضية لـ input_image_shape هي [224, 224] . نحتاج إلى تغييره إلى [299, 299] لطراز Inception V3.

inception_v3_spec = model_spec.ImageModelSpec(
    uri='https://tfhub.dev/google/imagenet/inception_v3/feature_vector/1')
inception_v3_spec.input_image_shape = [299, 299]

بعد ذلك ، من خلال تعيين المعلمة model_spec على inception_v3_spec في طريقة create ، يمكننا إعادة تدريب نموذج Inception V3.

الخطوات المتبقية هي نفسها تمامًا ويمكننا الحصول على نموذج InceptionV3 TensorFlow Lite المخصص في النهاية.

تغيير النموذج المخصص الخاص بك

إذا كنا نرغب في استخدام النموذج المخصص غير الموجود في TensorFlow Hub ، فيجب علينا إنشاء ModelSpec وتصديره في TensorFlow Hub.

ثم ابدأ في تحديد كائن ImageModelSpec مثل العملية أعلاه.

قم بتغيير معلمات التدريب الفائقة

يمكننا أيضًا تغيير dropout_rate التدريب dropout_rate مثل epochs dropout_rate وحجم batch_size التي قد تؤثر على دقة النموذج. معلمات النموذج التي يمكنك ضبطها هي:

  • epochs : يمكن أن تحقق المزيد من العهود دقة أفضل حتى تتقارب ، لكن التدريب على فترات كثيرة جدًا قد يؤدي إلى زيادة التجهيز.
  • dropout_rate : معدل التسرب ، تجنب الإفراط في التجهيز. لا شيء بشكل افتراضي.
  • batch_size : عدد العينات التي سيتم استخدامها في خطوة تدريب واحدة. لا شيء بشكل افتراضي.
  • validation_data بيانات التحقق: إذا لم يكن هناك شيء ، يتخطى عملية التحقق. لا شيء بشكل افتراضي.
  • train_whole_model : إذا كان هذا صحيحًا ، يتم تدريب وحدة Hub جنبًا إلى جنب مع طبقة التصنيف في الأعلى. خلاف ذلك ، قم فقط بتدريب طبقة التصنيف العليا. لا شيء بشكل افتراضي.
  • learning_rate : معدل التعلم الأساسي. لا شيء بشكل افتراضي.
  • momentum : تعويم بايثون مُعاد توجيهه إلى المُحسِّن. تستخدم فقط عندما تكون use_hub_library صحيحة. لا شيء بشكل افتراضي.
  • shuffle : منطقي ، سواء كان يجب خلط البيانات أم لا. خطأ بشكل افتراضي.
  • use_augmentation : منطقي ، استخدم زيادة البيانات للمعالجة المسبقة. خطأ بشكل افتراضي.
  • use_hub_library : منطقي ، استخدم make_image_classifier_lib من محور tensorflow لإعادة تدريب النموذج. يمكن لخط أنابيب التدريب هذا أن يحقق أداءً أفضل لمجموعة البيانات المعقدة مع العديد من الفئات. صحيح بشكل افتراضي.
  • warmup_steps : عدد خطوات warmup_steps على معدل التعلم. إذا لم يكن هناك أي شيء ، فسيتم استخدام Warmup_steps الافتراضي وهو إجمالي خطوات التدريب في فترتين. تستخدم فقط عندما تكون use_hub_library خطأ. لا شيء بشكل افتراضي.
  • model_dir : اختياري ، موقع ملفات نقطة model_dir النموذج. تستخدم فقط عندما تكون use_hub_library خطأ. لا شيء بشكل افتراضي.

ستحصل المعلمات التي تكون لا شيء افتراضيًا مثل epochs على المعلمات الافتراضية المحددة في make_image_classifier_lib من مكتبة TensorFlow Hub أو train_image_classifier_lib .

على سبيل المثال ، يمكننا التدرب على المزيد من العصور.

model = image_classifier.create(train_data, validation_data=validation_data, epochs=10)
INFO:tensorflow:Retraining the models...
INFO:tensorflow:Retraining the models...
Model: "sequential_3"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
hub_keras_layer_v1v2_3 (HubK (None, 1280)              3413024   
_________________________________________________________________
dropout_3 (Dropout)          (None, 1280)              0         
_________________________________________________________________
dense_3 (Dense)              (None, 5)                 6405      
=================================================================
Total params: 3,419,429
Trainable params: 6,405
Non-trainable params: 3,413,024
_________________________________________________________________
None
Epoch 1/10
91/91 [==============================] - 6s 53ms/step - loss: 1.1106 - accuracy: 0.6262 - val_loss: 0.6414 - val_accuracy: 0.9091
Epoch 2/10
91/91 [==============================] - 4s 49ms/step - loss: 0.6646 - accuracy: 0.8989 - val_loss: 0.6097 - val_accuracy: 0.9233
Epoch 3/10
91/91 [==============================] - 5s 50ms/step - loss: 0.6303 - accuracy: 0.9148 - val_loss: 0.5952 - val_accuracy: 0.9290
Epoch 4/10
91/91 [==============================] - 5s 50ms/step - loss: 0.5998 - accuracy: 0.9284 - val_loss: 0.5866 - val_accuracy: 0.9375
Epoch 5/10
91/91 [==============================] - 5s 51ms/step - loss: 0.5851 - accuracy: 0.9401 - val_loss: 0.5831 - val_accuracy: 0.9290
Epoch 6/10
91/91 [==============================] - 4s 45ms/step - loss: 0.5892 - accuracy: 0.9430 - val_loss: 0.5791 - val_accuracy: 0.9375
Epoch 7/10
91/91 [==============================] - 4s 45ms/step - loss: 0.5629 - accuracy: 0.9550 - val_loss: 0.5787 - val_accuracy: 0.9318
Epoch 8/10
91/91 [==============================] - 4s 46ms/step - loss: 0.5574 - accuracy: 0.9580 - val_loss: 0.5729 - val_accuracy: 0.9375
Epoch 9/10
91/91 [==============================] - 4s 45ms/step - loss: 0.5581 - accuracy: 0.9582 - val_loss: 0.5746 - val_accuracy: 0.9347
Epoch 10/10
91/91 [==============================] - 4s 46ms/step - loss: 0.5484 - accuracy: 0.9553 - val_loss: 0.5753 - val_accuracy: 0.9375

قم بتقييم النموذج الذي أعيد تدريبه حديثًا باستخدام 10 فترات تدريب.

loss, accuracy = model.evaluate(test_data)
12/12 [==============================] - 1s 29ms/step - loss: 0.6252 - accuracy: 0.9101