TensorFlowLiteモデルメーカーによる画像分類

TensorFlow.orgで表示 GoogleColabで実行 GitHubでソースを表示 ノートブックをダウンロードするTFハブモデルを参照してください

TensorFlowライトモデルメーカーライブラリが適応とオンデバイスMLのアプリケーションのためにこのモデルを展開するときに、特定の入力データにTensorFlowニューラルネットワークモデルを変換するプロセスを単純化します。

このノートブックは、このModel Makerライブラリを利用して、モバイルデバイスで花を分類するために一般的に使用される画像分類モデルの適応と変換を説明するエンドツーエンドの例を示しています。

前提条件

この例を実行するには、我々のGitHubでそのモデルメーカーのパッケージを含むいくつかの必要なパッケージ、インストールしておく必要がありますレポ

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 model_spec
from tflite_model_maker import image_classifier
from tflite_model_maker.config import ExportFormat
from tflite_model_maker.config import QuantizationConfig
from tflite_model_maker.image_classifier import DataLoader

import matplotlib.pyplot as plt
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_addons/utils/ensure_tf_install.py:67: UserWarning: Tensorflow Addons supports using Python ops for all Tensorflow versions above or equal to 2.3.0 and strictly below 2.6.0 (nightly versions are not supported). 
 The versions of TensorFlow you are currently using is 2.6.0 and is not supported. 
Some things might work, some things might not.
If you were to encounter a bug, do not file an issue.
If you want to make sure you're using a tested and supported configuration, either change the TensorFlow version or the TensorFlow Addons's version. 
You can find the compatibility matrix in TensorFlow Addon's readme:
https://github.com/tensorflow/addons
  UserWarning,
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/numba/core/errors.py:154: UserWarning: Insufficiently recent colorama version found. Numba requires colorama >= 0.3.9
  warnings.warn(msg)

単純なエンドツーエンドの例

データパスを取得する

この単純なエンドツーエンドの例で再生するいくつかの画像を取得しましょう。何百もの画像はModelMakerにとって良いスタートですが、より多くのデータがより良い精度を達成する可能性があります。

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

あなたは置き換えることができimage_path独自の画像フォルダに。 colabへのデータのアップロードについては、下の画像に赤い長方形で示されている左側のサイドバーにアップロードボタンがあります。 zipファイルをアップロードして解凍してみてください。ルートファイルのパスは現在のパスです。

ファイルをアップロードする

あなたはクラウドにあなたのイメージをアップロードしたくない場合は、次のローカルライブラリを実行しようとすることができ、ガイドGitHubのインチ

例を実行する

この例は、以下に示すように4行のコードで構成されており、各コードはプロセス全体の1つのステップを表しています。

手順1.デバイス上のMLアプリに固有の入力データを読み込みます。それをトレーニングデータとテストデータに分割します。

data = DataLoader.from_folder(image_path)
train_data, test_data = data.split(0.9)
2021-08-12 11:22:56.386698: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
INFO:tensorflow:Load image with size: 3670, num_label: 5, labels: daisy, dandelion, roses, sunflowers, tulips.
2021-08-12 11:22:56.395523: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:22:56.396549: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:22:56.398220: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 AVX512F FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2021-08-12 11:22:56.398875: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:22:56.400004: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:22:56.400967: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:22:57.007249: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:22:57.008317: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:22:57.009214: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:22:57.010137: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1510] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 14648 MB memory:  -> device: 0, name: Tesla V100-SXM2-16GB, pci bus id: 0000:00:05.0, compute capability: 7.0

手順2.TensorFlowモデルをカスタマイズします。

model = image_classifier.create(train_data)
INFO:tensorflow:Retraining the models...
2021-08-12 11:23:00.961952: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:185] None of the MLIR Optimization Passes are enabled (registered 2)
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
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/keras/optimizer_v2/optimizer_v2.py:356: UserWarning: The `lr` argument is deprecated, use `learning_rate` instead.
  "The `lr` argument is deprecated, use `learning_rate` instead.")
2021-08-12 11:23:04.815901: I tensorflow/stream_executor/cuda/cuda_dnn.cc:369] Loaded cuDNN version 8100
2021-08-12 11:23:05.396630: I tensorflow/core/platform/default/subprocess.cc:304] Start cannot spawn child process: No such file or directory
103/103 [==============================] - 7s 38ms/step - loss: 0.8676 - accuracy: 0.7618
Epoch 2/5
103/103 [==============================] - 4s 41ms/step - loss: 0.6568 - accuracy: 0.8880
Epoch 3/5
103/103 [==============================] - 4s 37ms/step - loss: 0.6238 - accuracy: 0.9111
Epoch 4/5
103/103 [==============================] - 4s 37ms/step - loss: 0.6009 - accuracy: 0.9245
Epoch 5/5
103/103 [==============================] - 4s 37ms/step - loss: 0.5872 - accuracy: 0.9287

ステップ3.モデルを評価します。

loss, accuracy = model.evaluate(test_data)
12/12 [==============================] - 2s 45ms/step - loss: 0.5993 - accuracy: 0.9292

ステップ4.TensorFlowLiteモデルにエクスポートします。

ここでは、とのTensorFlow Liteのモデルエクスポートするメタデータモデルの記述のための標準を提供します。ラベルファイルはメタデータに埋め込まれています。デフォルトのトレーニング後の量子化手法は、画像分類タスクの完全な整数量子化です。

アップロード部分と同じ左側のサイドバーからダウンロードして、自分で使用することができます。

model.export(export_dir='.')
2021-08-12 11:23:29.239205: 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/tmpg7d7peiv/assets
INFO:tensorflow:Assets written to: /tmp/tmpg7d7peiv/assets
2021-08-12 11:23:32.415310: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:23:32.415723: I tensorflow/core/grappler/devices.cc:66] Number of eligible GPUs (core count >= 8, compute capability >= 0.0): 1
2021-08-12 11:23:32.415840: I tensorflow/core/grappler/clusters/single_machine.cc:357] Starting new session
2021-08-12 11:23:32.416303: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:23:32.416699: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:23:32.417007: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:23:32.417414: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:23:32.417738: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:23:32.418047: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1510] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 14648 MB memory:  -> device: 0, name: Tesla V100-SXM2-16GB, pci bus id: 0000:00:05.0, compute capability: 7.0
2021-08-12 11:23:32.451651: I tensorflow/core/grappler/optimizers/meta_optimizer.cc:1137] Optimization results for grappler item: graph_to_optimize
  function_optimizer: Graph size after: 913 nodes (656), 923 edges (664), time = 17.945ms.
  function_optimizer: function_optimizer did nothing. time = 0.391ms.

2021-08-12 11:23:33.380451: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-08-12 11:23:33.380503: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency.
2021-08-12 11:23:33.426653: I tensorflow/compiler/mlir/tensorflow/utils/dump_mlir_util.cc:210] disabling MLIR crash reproducer, set env var `MLIR_CRASH_REPRODUCER_DIRECTORY` to enable.
fully_quantize: 0, inference_type: 6, input_inference_type: 3, output_inference_type: 3
WARNING:absl:For model inputs containing unsupported operations which cannot be quantized, the `inference_input_type` attribute will default to the original type.
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/tmpny214hzn/labels.txt
INFO:tensorflow:Saving labels in /tmp/tmpny214hzn/labels.txt
INFO:tensorflow:TensorFlow Lite model exported successfully: ./model.tflite
INFO:tensorflow:TensorFlow Lite model exported successfully: ./model.tflite

これらの簡単な4つのステップの後、我々はさらに中のようなオンデバイスアプリケーションでTensorFlow Liteのモデルファイルを使用することができ、画像の分類参照アプリ。

詳細なプロセス

現在、画像分類用の事前トレーニング済みモデルとして、EfficientNet-Lite *モデル、MobileNetV2、ResNet50などのいくつかのモデルをサポートしています。ただし、数行のコードでこのライブラリに新しい事前トレーニング済みモデルを追加することは非常に柔軟です。

以下では、このエンドツーエンドの例を段階的に説明して、詳細を示します。

ステップ1:デバイス上のMLアプリに固有の入力データを読み込む

花のデータセットには、5つのクラスに属する3670枚の画像が含まれています。データセットのアーカイブバージョンをダウンロードして、解凍します。

データセットのディレクトリ構造は次のとおりです。

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

使用DataLoader負荷データのクラス。

from_folder()メソッドは、フォルダからデータを読み込むことができます。同じクラスの画像データが同じサブディレクトリにあり、サブフォルダ名がクラス名であると想定しています。現在、JPEGエンコード画像とPNGエンコード画像がサポートされています。

data = DataLoader.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モデルをカスタマイズする

ロードされたデータに基づいてカスタム画像分類モデルを作成します。デフォルトのモデルは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
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/keras/optimizer_v2/optimizer_v2.py:356: UserWarning: The `lr` argument is deprecated, use `learning_rate` instead.
  "The `lr` argument is deprecated, use `learning_rate` instead.")
91/91 [==============================] - 7s 59ms/step - loss: 0.8929 - accuracy: 0.7572 - val_loss: 0.6367 - val_accuracy: 0.9091
Epoch 2/5
91/91 [==============================] - 5s 55ms/step - loss: 0.6598 - accuracy: 0.8905 - val_loss: 0.6097 - val_accuracy: 0.9119
Epoch 3/5
91/91 [==============================] - 5s 54ms/step - loss: 0.6221 - accuracy: 0.9141 - val_loss: 0.6016 - val_accuracy: 0.9347
Epoch 4/5
91/91 [==============================] - 5s 59ms/step - loss: 0.6032 - accuracy: 0.9241 - val_loss: 0.5978 - val_accuracy: 0.9318
Epoch 5/5
91/91 [==============================] - 6s 63ms/step - loss: 0.5890 - accuracy: 0.9344 - val_loss: 0.5954 - val_accuracy: 0.9347

詳細なモデル構造をご覧ください。

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 [==============================] - 2s 37ms/step - loss: 0.6337 - accuracy: 0.9019

予測結果を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

精度はアプリの要件を満たしていない場合、1はを参照してください可能性が高度な使用方法などの再訓練パラメータを調整することは、そのような大規模モデルへの変更などの代替案を検討します

ステップ4:TensorFlowLiteモデルにエクスポートする

訓練されたモデルが持つTensorFlow Liteのモデル形式に変換するメタデータ後でオンデバイスMLアプリケーションで使用できるようにします。ラベルファイルと語彙ファイルはメタデータに埋め込まれています。デフォルトTFLiteのファイル名ですmodel.tflite

多くのオンデバイスMLアプリケーションでは、モデルサイズが重要な要素です。したがって、モデルを小さくし、実行速度を上げる可能性があるように、クオンタイズを適用することをお勧めします。デフォルトのトレーニング後の量子化手法は、画像分類タスクの完全な整数量子化です。

model.export(export_dir='.')
INFO:tensorflow:Assets written to: /tmp/tmpefawktva/assets
INFO:tensorflow:Assets written to: /tmp/tmpefawktva/assets
2021-08-12 11:25:07.871201: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:25:07.871638: I tensorflow/core/grappler/devices.cc:66] Number of eligible GPUs (core count >= 8, compute capability >= 0.0): 1
2021-08-12 11:25:07.871768: I tensorflow/core/grappler/clusters/single_machine.cc:357] Starting new session
2021-08-12 11:25:07.872277: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:25:07.872639: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:25:07.872945: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:25:07.873316: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:25:07.873619: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:25:07.873884: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1510] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 14648 MB memory:  -> device: 0, name: Tesla V100-SXM2-16GB, pci bus id: 0000:00:05.0, compute capability: 7.0
2021-08-12 11:25:07.906980: I tensorflow/core/grappler/optimizers/meta_optimizer.cc:1137] Optimization results for grappler item: graph_to_optimize
  function_optimizer: Graph size after: 913 nodes (656), 923 edges (664), time = 17.977ms.
  function_optimizer: function_optimizer did nothing. time = 0.434ms.

2021-08-12 11:25:08.746578: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-08-12 11:25:08.746627: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency.
fully_quantize: 0, inference_type: 6, input_inference_type: 3, output_inference_type: 3
WARNING:absl:For model inputs containing unsupported operations which cannot be quantized, the `inference_input_type` attribute will default to the original type.
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/tmp9dnrtkd6/labels.txt
INFO:tensorflow:Saving labels in /tmp/tmp9dnrtkd6/labels.txt
INFO:tensorflow:TensorFlow Lite model exported successfully: ./model.tflite
INFO:tensorflow:TensorFlow Lite model exported successfully: ./model.tflite

参照サンプルアプリケーションおよび画像分類のガイドモバイルアプリケーションにTensorFlow Liteのモデルを統合する方法の詳細については。

このモデルは、使用してAndroidやiOSアプリに統合することができImageClassifierのAPITensorFlow Liteのタスク・ライブラリーを

許可されるエクスポート形式は、次の1つまたはリストのいずれかです。

デフォルトでは、メタデータを使用してTensorFlowLiteモデルをエクスポートするだけです。異なるファイルを選択的にエクスポートすることもできます。たとえば、次のようにラベルファイルのみをエクスポートします。

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)
{'accuracy': 0.9019073569482289}

高度な使用法

create機能は、このライブラリの重要な部分です。それは次のようにpretrainedモデルと転移学習を使用していますチュートリアル

create機能には、以下の手順が含まれています。

  1. パラメータに応じてデータをテスト、トレーニング、検証にデータを分割validation_ratiotest_ratio 。デフォルトの値validation_ratiotest_ratioある0.10.1
  2. ダウンロード画像特徴ベクトルをTensorFlowハブからのベースモデルとして。デフォルトの事前トレーニング済みモデルはEfficientNet-Lite0です。
  3. ドロップアウト層を有する分類器ヘッドを追加dropout_rateヘッド層との事前訓練を受けたモデルの間。デフォルトのdropout_rateデフォルトですdropout_rateから値make_image_classifier_lib TensorFlowハブによって。
  4. 生の入力データを前処理します。現在、各画像ピクセルの値をモデル入力スケールに正規化し、モデル入力サイズにサイズ変更するなどの前処理ステップ。 EfficientNet-Lite0は、入力スケール有する[0, 1]と入力画像サイズ[224, 224, 3]
  5. データを分類器モデルにフィードします。デフォルトでは、そのようなトレーニングエポック、バッチサイズなどの訓練パラメータは、速度の学習、勢いはからの既定値ですmake_image_classifier_lib TensorFlowハブによって。分類器のヘッドのみがトレーニングされます。

このセクションでは、別の画像分類モデルへの切り替え、トレーニングハイパーパラメータの変更など、いくつかの高度なトピックについて説明します。

TensorFLowLiteモデルでトレーニング後の量子化をカスタマイズする

訓練後の量子化はまた、CPUとハードウェアアクセラレータ推論速度を向上させながら、モデル精度の劣化の少ない、モデルサイズと推論待ち時間を低減することができる変換技術です。したがって、モデルを最適化するために広く使用されています。

モデルメーカーライブラリは、モデルをエクスポートするときに、デフォルトのトレーニング後の量子化手法を適用します。あなたは訓練後の量子化をカスタマイズしたい場合は、モデルのメーカーが使用して複数の訓練後の量子化オプションをサポートQuantizationConfigをうまくように。たとえば、float16量子化を取り上げましょう。まず、量子化構成を定義します。

config = QuantizationConfig.for_float16()

次に、そのような構成でTensorFlowLiteモデルをエクスポートします。

model.export(export_dir='.', tflite_filename='model_fp16.tflite', quantization_config=config)
INFO:tensorflow:Assets written to: /tmp/tmp3tagi8ov/assets
INFO:tensorflow:Assets written to: /tmp/tmp3tagi8ov/assets
2021-08-12 11:33:18.486299: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:33:18.486660: I tensorflow/core/grappler/devices.cc:66] Number of eligible GPUs (core count >= 8, compute capability >= 0.0): 1
2021-08-12 11:33:18.486769: I tensorflow/core/grappler/clusters/single_machine.cc:357] Starting new session
2021-08-12 11:33:18.487314: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:33:18.487754: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:33:18.488070: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:33:18.488480: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:33:18.488804: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-08-12 11:33:18.489094: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1510] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 14648 MB memory:  -> device: 0, name: Tesla V100-SXM2-16GB, pci bus id: 0000:00:05.0, compute capability: 7.0
2021-08-12 11:33:18.525503: I tensorflow/core/grappler/optimizers/meta_optimizer.cc:1137] Optimization results for grappler item: graph_to_optimize
  function_optimizer: Graph size after: 913 nodes (656), 923 edges (664), time = 19.663ms.
  function_optimizer: function_optimizer did nothing. time = 0.423ms.
INFO:tensorflow:Label file is inside the TFLite model with metadata.
2021-08-12 11:33:19.358426: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-08-12 11:33:19.358474: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency.
INFO:tensorflow:Label file is inside the TFLite model with metadata.
INFO:tensorflow:Saving labels in /tmp/tmpyiyio9gh/labels.txt
INFO:tensorflow:Saving labels in /tmp/tmpyiyio9gh/labels.txt
INFO:tensorflow:TensorFlow Lite model exported successfully: ./model_fp16.tflite
INFO:tensorflow:TensorFlow Lite model exported successfully: ./model_fp16.tflite

コラボでは、名前付きモデルダウンロードすることができmodel_fp16.tflite上記のアップロード部分と同じ左のサイドバーからは、。

モデルを変更する

このライブラリでサポートされているモデルに変更します。

このライブラリは、現在、EfficientNet-Liteモデル、MobileNetV2、ResNet50をサポートしています。 EfficientNet-Liteの最先端の精度とエッジデバイスに適しを達成できる画像分類モデルのファミリーです。デフォルトのモデルはEfficientNet-Lite0です。

私達はちょうど、パラメータ設定によりMobileNetV2にモデルを切り替えることができmodel_spec中MobileNetV2モデル仕様にcreate方法。

model = image_classifier.create(train_data, model_spec=model_spec.get('mobilenet_v2'), 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
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/keras/optimizer_v2/optimizer_v2.py:356: UserWarning: The `lr` argument is deprecated, use `learning_rate` instead.
  "The `lr` argument is deprecated, use `learning_rate` instead.")
91/91 [==============================] - 8s 57ms/step - loss: 0.9474 - accuracy: 0.7486 - val_loss: 0.6713 - val_accuracy: 0.8807
Epoch 2/5
91/91 [==============================] - 5s 54ms/step - loss: 0.7013 - accuracy: 0.8764 - val_loss: 0.6342 - val_accuracy: 0.9119
Epoch 3/5
91/91 [==============================] - 5s 54ms/step - loss: 0.6577 - accuracy: 0.8963 - val_loss: 0.6328 - val_accuracy: 0.9119
Epoch 4/5
91/91 [==============================] - 5s 54ms/step - loss: 0.6245 - accuracy: 0.9176 - val_loss: 0.6445 - val_accuracy: 0.9006
Epoch 5/5
91/91 [==============================] - 5s 55ms/step - loss: 0.6034 - accuracy: 0.9303 - val_loss: 0.6290 - val_accuracy: 0.9091

新しく再トレーニングされたMobileNetV2モデルを評価して、テストデータの精度と損失を確認します。

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

TensorFlowハブのモデルに変更します

さらに、画像を入力し、TensorFlowHub形式で特徴ベクトルを出力する他の新しいモデルに切り替えることもできます。

インセプションV3の一例としてのモデル、我々は定義することができinception_v3_specの目的であるimage_classifier.ModelSpecとインセプションV3モデルの仕様を含んでいます。

私たちは、モデル名を指定する必要がname 、TensorFlowハブモデルのURL uri 。一方、デフォルト値input_image_shapeある[224, 224]我々はそれを変更する必要がある[299, 299]インセプションV3モデルのために。

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

そして、設定によってパラメータmodel_specinception_v3_speccreate方法を、私たちは、インセプションV3モデルを再トレーニングができます。

残りの手順はまったく同じで、最終的にカスタマイズされたInceptionV3 TensorFlowLiteモデルを取得できます。

独自のカスタムモデルを変更する

我々はTensorFlowハブにないカスタムモデルを使用したい場合は、我々は作成してエクスポートする必要がありModelSpecをTensorFlowハブに。

次に定義する開始ModelSpec上記のプロセスと同様の目的を。

トレーニングハイパーパラメータを変更する

我々はまた、のようなトレーニングハイパー変更される可能性がありepochsdropout_ratebatch_sizeモデルの精度に影響を与える可能性があります。調整できるモデルパラメータは次のとおりです。

  • epochs :それは収束するが、あまりにも多くのエポックのための訓練は、過剰適合につながる可能性まで、より多くのエポックは、より高い精度を達成することができました。
  • dropout_rate :ドロップアウト率、回避の過剰適合。デフォルトではなし。
  • batch_size :1つのトレーニング段階で使用するサンプルの数。デフォルトではなし。
  • validation_data :検証データ。 Noneの場合、検証プロセスをスキップします。デフォルトではなし。
  • train_whole_model :trueの場合、ハブモジュールは、トップ上の分類層と一緒に訓練を受けています。それ以外の場合は、最上位の分類レイヤーのみをトレーニングします。デフォルトではなし。
  • learning_rate :基本学習率。デフォルトではなし。
  • momentum :オプティマイザに転送Pythonのフロート。場合にのみ使用use_hub_library真です。デフォルトではなし。
  • shuffle :ブールを、データをシャッフルする必要があるかどうか。デフォルトではFalse。
  • use_augmentation :ブール、前処理のためのデータの増強を使用しています。デフォルトではFalse。
  • use_hub_library :ブール、使用make_image_classifier_lib tensorflowハブからは、モデルを再教育します。このトレーニングパイプラインは、多くのカテゴリを持つ複雑なデータセットのパフォーマンスを向上させる可能性があります。デフォルトではTrue。
  • warmup_steps :率を学習上のウォームアップスケジュールのためのウォームアップステップ数。 Noneの場合、デフォルトのwarmup_stepsが使用されます。これは、2つのエポックでのトレーニングステップの合計です。場合にのみ使用use_hub_library Falseです。デフォルトではなし。
  • model_dir :オプション、モデルのチェックポイントファイルの場所。場合にのみ使用use_hub_library Falseです。デフォルトではなし。

以下のように、デフォルトではNoneですパラメータepochsでの具体的なデフォルトパラメータを取得しますmake_image_classifier_lib TensorFlowハブライブラリやから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 [==============================] - 7s 57ms/step - loss: 0.8869 - accuracy: 0.7644 - val_loss: 0.6398 - val_accuracy: 0.9006
Epoch 2/10
91/91 [==============================] - 5s 53ms/step - loss: 0.6601 - accuracy: 0.8929 - val_loss: 0.6134 - val_accuracy: 0.9176
Epoch 3/10
91/91 [==============================] - 5s 53ms/step - loss: 0.6273 - accuracy: 0.9121 - val_loss: 0.6068 - val_accuracy: 0.9148
Epoch 4/10
91/91 [==============================] - 5s 53ms/step - loss: 0.6104 - accuracy: 0.9214 - val_loss: 0.6007 - val_accuracy: 0.9205
Epoch 5/10
91/91 [==============================] - 5s 55ms/step - loss: 0.5921 - accuracy: 0.9286 - val_loss: 0.5976 - val_accuracy: 0.9176
Epoch 6/10
91/91 [==============================] - 5s 51ms/step - loss: 0.5745 - accuracy: 0.9409 - val_loss: 0.5940 - val_accuracy: 0.9148
Epoch 7/10
91/91 [==============================] - 4s 49ms/step - loss: 0.5686 - accuracy: 0.9454 - val_loss: 0.5923 - val_accuracy: 0.9148
Epoch 8/10
91/91 [==============================] - 4s 48ms/step - loss: 0.5629 - accuracy: 0.9492 - val_loss: 0.5914 - val_accuracy: 0.9062
Epoch 9/10
91/91 [==============================] - 4s 48ms/step - loss: 0.5592 - accuracy: 0.9485 - val_loss: 0.5892 - val_accuracy: 0.9091
Epoch 10/10
91/91 [==============================] - 4s 48ms/step - loss: 0.5503 - accuracy: 0.9584 - val_loss: 0.5890 - val_accuracy: 0.9176

10のトレーニングエポックで新しく再トレーニングされたモデルを評価します。

loss, accuracy = model.evaluate(test_data)
12/12 [==============================] - 1s 32ms/step - loss: 0.6294 - accuracy: 0.9019

続きを読む

あなたは私たちの読むことができる画像分類技術的な詳細を学ぶために例を。詳細については、以下を参照してください。