บันทึกวันที่! Google I / O ส่งคืนวันที่ 18-20 พฤษภาคม ลงทะเบียนตอนนี้
หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

การจัดประเภทภาพด้วย TensorFlow Lite Model Maker

ดูใน TensorFlow.org เรียกใช้ใน Google Colab ดูแหล่งที่มาบน GitHub ดาวน์โหลดสมุดบันทึก ดูโมเดล TF Hub

ไลบรารี Model Maker ช่วยลดความยุ่งยากในกระบวนการปรับและแปลงโมเดลเครือข่ายประสาทเทียม TensorFlow เป็นข้อมูลอินพุตเฉพาะเมื่อปรับใช้โมเดลนี้สำหรับแอปพลิเคชัน ML บนอุปกรณ์

สมุดบันทึกนี้แสดงตัวอย่างแบบ end-to-end ที่ใช้ไลบรารี 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

ตัวอย่างง่ายๆจาก End-to-End

รับเส้นทางข้อมูล

มาดูภาพเพื่อเล่นกับตัวอย่างง่ายๆจาก end-to-end นี้ ภาพหลายร้อยภาพเป็นการเริ่มต้นที่ดีสำหรับ 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 คุณจะพบปุ่มอัปโหลดในแถบด้านข้างทางซ้ายที่แสดงในภาพด้านล่างพร้อมกับสี่เหลี่ยมผืนผ้าสีแดง เพียงแค่ลองอัปโหลดไฟล์ zip และเปิดเครื่องรูด พา ธ ไฟล์รูทคือพา ธ ปัจจุบัน

อัปโหลดไฟล์

หากคุณไม่ต้องการอัปโหลดภาพของคุณไปยังระบบคลาวด์คุณสามารถลองเรียกใช้ไลบรารีในเครื่องโดยทำตาม คำแนะนำ ใน 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.

หลังจาก 4 ขั้นตอนง่ายๆเหล่านี้เราสามารถใช้ไฟล์โมเดล 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()

png

ขั้นตอนที่ 2: ปรับแต่ง TensorFlow Model

สร้างแบบจำลองลักษณนามรูปภาพที่กำหนดเองตามข้อมูลที่โหลด โมเดลเริ่มต้นคือ 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
_________________________________________________________________

ขั้นตอนที่ 3: ประเมินรูปแบบที่กำหนดเอง

ประเมินผลลัพธ์ของแบบจำลองรับการสูญเสียและความถูกต้องของแบบจำลอง

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()

png

หากความแม่นยำไม่เป็นไปตามข้อกำหนดของแอพเราสามารถอ้างถึง การใช้งานขั้นสูง เพื่อสำรวจทางเลือกต่างๆเช่นการเปลี่ยนเป็นโมเดลที่ใหญ่ขึ้นการปรับพารามิเตอร์การฝึกซ้ำเป็นต้น

ขั้นตอนที่ 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. แยกข้อมูลออกเป็นการฝึกอบรมการตรวจสอบข้อมูลการทดสอบตามพารามิเตอร์ validation_ratio และ test_ratio ค่าเริ่มต้นของ validation_ratio และ test_ratio คือ 0.1 และ 0.1
  2. ดาวน์โหลด Image Feature Vector เป็นโมเดลพื้นฐานจาก TensorFlow Hub โมเดลที่ฝึกไว้ล่วงหน้าเริ่มต้นคือ EfficientNet-Lite0
  3. เพิ่มส่วนหัวลักษณนามด้วย Dropout Layer ที่มี dropout_rate ระหว่าง head layer และ pre- dropout_rate model ค่าเริ่มต้น 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

การหาปริมาณหลังการฝึกอบรม เป็นเทคนิคการแปลงที่สามารถลดขนาดโมเดลและเวลาแฝงในการอนุมานขณะเดียวกันก็ปรับปรุงเวลาแฝงของตัวเร่งความเร็วของ CPU และฮาร์ดแวร์ด้วยความแม่นยำของโมเดลลดลงเล็กน้อย ดังนั้นจึงใช้กันอย่างแพร่หลายในการปรับโมเดลให้เหมาะสม

Model Maker รองรับตัวเลือกการหาปริมาณหลังการฝึกอบรมหลายแบบ ลองใช้การหาจำนวนเต็มจำนวนเต็มเป็นอินสแตนซ์ ขั้นแรกกำหนดการกำหนดค่า quantization เพื่อบังคับใช้การหาจำนวนเต็มจำนวนเต็มสำหรับ ops ทั้งหมดรวมทั้งอินพุตและเอาต์พุต ประเภทอินพุตและประเภทเอาต์พุตคือ 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 ของ TensorFlow Hub รูปแบบ uri ในขณะเดียวกันค่าเริ่มต้นของ 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 การฝึกอบรมเช่น epochs , dropout_rate และ batch_size ที่อาจส่งผลต่อความแม่นยำของโมเดล พารามิเตอร์ของโมเดลที่คุณสามารถปรับได้ ได้แก่ :

  • epochs : epochs อื่น ๆ สามารถบรรลุความแม่นยำได้ดีขึ้นจนกว่าจะบรรจบกัน แต่การฝึกฝนสำหรับยุคต่างๆมากเกินไปอาจนำไปสู่การสวมใส่มากเกินไป
  • dropout_rate : อัตราการออกกลางคันหลีกเลี่ยงการใส่อุปกรณ์มากเกินไป ไม่มีโดยค่าเริ่มต้น
  • batch_size : จำนวนตัวอย่างที่จะใช้ในขั้นตอนการฝึกอบรมเดียว ไม่มีโดยค่าเริ่มต้น
  • validation_data : ข้อมูลการตรวจสอบ หากไม่มีให้ข้ามขั้นตอนการตรวจสอบความถูกต้อง ไม่มีโดยค่าเริ่มต้น
  • train_whole_model : หากเป็นจริงโมดูล Hub จะได้รับการฝึกฝนร่วมกับเลเยอร์การจำแนกที่อยู่ด้านบน มิฉะนั้นให้ฝึกเฉพาะเลเยอร์การจัดประเภทด้านบนเท่านั้น ไม่มีโดยค่าเริ่มต้น
  • learning_rate : อัตราการเรียนรู้พื้นฐาน ไม่มีโดยค่าเริ่มต้น
  • momentum : Python ลอยส่งต่อไปยังเครื่องมือเพิ่มประสิทธิภาพ ใช้เฉพาะเมื่อ use_hub_library เป็น True ไม่มีโดยค่าเริ่มต้น
  • shuffle : บูลีนไม่ว่าควรจะสับข้อมูลหรือไม่ เป็นเท็จโดยปริยาย
  • use_augmentation : บูลีนใช้การเพิ่มข้อมูลสำหรับการประมวลผลล่วงหน้า เป็นเท็จโดยปริยาย
  • use_hub_library : บูลีนใช้ make_image_classifier_lib จากฮับเทนเซอร์โฟลว์เพื่อฝึกโมเดลใหม่ ไปป์ไลน์การฝึกอบรมนี้สามารถบรรลุประสิทธิภาพที่ดีขึ้นสำหรับชุดข้อมูลที่ซับซ้อนซึ่งมีหลายหมวดหมู่ True ตามค่าเริ่มต้น
  • warmup_steps : จำนวนขั้นตอนการวอร์มอัพสำหรับกำหนดการวอร์มอัพในอัตราการเรียนรู้ ถ้าไม่มีระบบจะใช้ warmup_steps เริ่มต้นซึ่งเป็นขั้นตอนการฝึกอบรมทั้งหมดในสองยุค ใช้เฉพาะเมื่อ use_hub_library เป็น False ไม่มีโดยค่าเริ่มต้น
  • model_dir : เป็นทางเลือกตำแหน่งของไฟล์จุดตรวจโมเดล ใช้เฉพาะเมื่อ use_hub_library เป็น False ไม่มีโดยค่าเริ่มต้น

พารามิเตอร์ที่ไม่มีโดยค่าเริ่มต้นเช่น 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