TensorFlow.org'da görüntüleyin | Google Colab'da çalıştırın | Kaynağı GitHub'da görüntüleyin | Not defterini indir |
TensorFlow Lite (TFLite), geliştiricilerin cihaz üzerinde (mobil, gömülü ve IoT cihazları) ML çıkarımı yapmasına yardımcı olan bir araç setidir. TFLite dönüştürücü , mevcut TF modellerini cihazda verimli bir şekilde çalıştırılabilen optimize edilmiş bir TFLite model formatına dönüştüren böyle bir araçtır.
Bu belgede, TF'den TFLite'ye dönüştürme kodunuzda hangi değişiklikleri yapmanız gerektiğini öğrenecek ve ardından aynı şeyi yapan birkaç örnek öğreneceksiniz.
TF'den TFLite'ye dönüştürme kodunuzdaki değişiklikler
Eski bir TF1 model formatı kullanıyorsanız (Keras dosyası, donmuş GraphDef, kontrol noktaları, tf.Session, vb.), bunu TF1/TF2 SavedModel olarak güncelleyin ve TF2 dönüştürücü API'sini
tf.lite.TFLiteConverter.from_saved_model(...)
bir TFLite modeline dönüştürmek için (Tablo 1'e bakın).Dönüştürücü API işaretlerini güncelleyin (bkz. Tablo 2).
tf.lite.constants
gibi eski API'leri kaldırın. (örneğin:tf.int8
tf.lite.constants.INT8
ile değiştirin)
// Tablo 1 // TFLite Python Dönüştürücü API Güncellemesi
TF1 API'si | TF2 API'si |
---|---|
tf.lite.TFLiteConverter.from_saved_model('saved_model/',..) | desteklenen |
tf.lite.TFLiteConverter.from_keras_model_file('model.h5',..) | kaldırıldı (SavedModel biçimine güncelleme) |
tf.lite.TFLiteConverter.from_frozen_graph('model.pb',..) | kaldırıldı (SavedModel biçimine güncelleme) |
tf.lite.TFLiteConverter.from_session(sess,...) | kaldırıldı (SavedModel biçimine güncelleme) |
// Tablo 2 // TFLite Python Dönüştürücü API Bayrakları Güncellemesi
TF1 API'si | TF2 API'si |
---|---|
allow_custom_ops optimizations representative_dataset target_spec inference_input_type inference_output_type experimental_new_converter experimental_new_quantizer | desteklenen |
input_tensors output_tensors input_arrays_with_shape output_arrays experimental_debug_info_func | kaldırıldı (desteklenmeyen dönüştürücü API bağımsız değişkenleri) |
change_concat_input_ranges default_ranges_stats get_input_arrays() inference_type quantized_input_stats reorder_across_fake_quant | kaldırıldı (desteklenmeyen niceleme iş akışları) |
conversion_summary_dir dump_graphviz_dir dump_graphviz_video | kaldırıldı (bunun yerine modelleri Netron veya visualize.py kullanarak görselleştirin) |
output_format drop_control_dependency | kaldırıldı (TF2'de desteklenmeyen özellikler) |
Örnekler
Şimdi eski TF1 modellerini TF1/TF2 SavedModels'e dönüştürmek ve ardından onu TF2 TFLite modellerine dönüştürmek için bazı örnekleri gözden geçireceksiniz.
Kurmak
Gerekli TensorFlow içe aktarmalarıyla başlayın.
import tensorflow as tf
import tensorflow.compat.v1 as tf1
import numpy as np
import logging
logger = tf.get_logger()
logger.setLevel(logging.ERROR)
import shutil
def remove_dir(path):
try:
shutil.rmtree(path)
except:
pass
Gerekli tüm TF1 model formatlarını oluşturun.
# Create a TF1 SavedModel
SAVED_MODEL_DIR = "tf_saved_model/"
remove_dir(SAVED_MODEL_DIR)
with tf1.Graph().as_default() as g:
with tf1.Session() as sess:
input = tf1.placeholder(tf.float32, shape=(3,), name='input')
output = input + 2
# print("result: ", sess.run(output, {input: [0., 2., 4.]}))
tf1.saved_model.simple_save(
sess, SAVED_MODEL_DIR,
inputs={'input': input},
outputs={'output': output})
print("TF1 SavedModel path: ", SAVED_MODEL_DIR)
# Create a TF1 Keras model
KERAS_MODEL_PATH = 'tf_keras_model.h5'
model = tf1.keras.models.Sequential([
tf1.keras.layers.InputLayer(input_shape=(128, 128, 3,), name='input'),
tf1.keras.layers.Dense(units=16, input_shape=(128, 128, 3,), activation='relu'),
tf1.keras.layers.Dense(units=1, name='output')
])
model.save(KERAS_MODEL_PATH, save_format='h5')
print("TF1 Keras Model path: ", KERAS_MODEL_PATH)
# Create a TF1 frozen GraphDef model
GRAPH_DEF_MODEL_PATH = tf.keras.utils.get_file(
'mobilenet_v1_0.25_128',
origin='https://storage.googleapis.com/download.tensorflow.org/models/mobilenet_v1_0.25_128_frozen.tgz',
untar=True,
) + '/frozen_graph.pb'
print("TF1 frozen GraphDef path: ", GRAPH_DEF_MODEL_PATH)
tutucu2 l10n-yerTF1 SavedModel path: tf_saved_model/ TF1 Keras Model path: tf_keras_model.h5 Downloading data from https://storage.googleapis.com/download.tensorflow.org/models/mobilenet_v1_0.25_128_frozen.tgz 2621440/2617289 [==============================] - 0s 0us/step 2629632/2617289 [==============================] - 0s 0us/step TF1 frozen GraphDef path: /home/kbuilder/.keras/datasets/mobilenet_v1_0.25_128/frozen_graph.pb
1. TF1 SavedModel'i TFLite modeline dönüştürün
Önce: TF1 ile dönüştürme
Bu, TF1 tarzı TFlite dönüştürme için tipik koddur.
converter = tf1.lite.TFLiteConverter.from_saved_model(
saved_model_dir=SAVED_MODEL_DIR,
input_arrays=['input'],
input_shapes={'input' : [3]}
)
converter.optimizations = {tf.lite.Optimize.DEFAULT}
converter.change_concat_input_ranges = True
tflite_model = converter.convert()
# Ignore warning: "Use '@tf.function' or '@defun' to decorate the function."
tutucu4 l10n-yer2021-09-22 20:02:56.143221: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format. 2021-09-22 20:02:56.143267: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency. 2021-09-22 20:02:56.143274: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:360] Ignored change_concat_input_ranges.
Sonra: TF2 ile dönüştürme
TF1 SavedModel'i daha küçük bir v2 dönüştürücü bayrak seti ile doğrudan bir TFLite modeline dönüştürün.
# Convert TF1 SavedModel to a TFLite model.
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir=SAVED_MODEL_DIR)
converter.optimizations = {tf.lite.Optimize.DEFAULT}
tflite_model = converter.convert()
tutucu6 l10n-yer2021-09-22 20:02:56.207882: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format. 2021-09-22 20:02:56.207923: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency. 2021-09-22 20:02:56.207930: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:360] Ignored change_concat_input_ranges.
2. Bir TF1 Keras model dosyasını bir TFLite modeline dönüştürün
Önce: TF1 ile dönüştürme
Bu, TF1 tarzı TFlite dönüştürme için tipik koddur.
converter = tf1.lite.TFLiteConverter.from_keras_model_file(model_file=KERAS_MODEL_PATH)
converter.optimizations = {tf.lite.Optimize.DEFAULT}
converter.change_concat_input_ranges = True
tflite_model = converter.convert()
tutucu8 l10n-yer2021-09-22 20:02:56.608343: 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. 2021-09-22 20:02:57.119836: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format. 2021-09-22 20:02:57.119881: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency. 2021-09-22 20:02:57.119888: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:360] Ignored change_concat_input_ranges.
Sonra: TF2 ile dönüştürme
İlk olarak, TF1 Keras model dosyasını bir TF2 SavedModel'e dönüştürün ve ardından daha küçük bir v2 dönüştürücü bayrakları ayarlanmış bir TFLite modeline dönüştürün.
# Convert TF1 Keras model file to TF2 SavedModel.
model = tf.keras.models.load_model(KERAS_MODEL_PATH)
model.save(filepath='saved_model_2/')
# Convert TF2 SavedModel to a TFLite model.
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir='saved_model_2/')
tflite_model = converter.convert()
tutucu10 l10n-yer2021-09-22 20:02:57.943564: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format. 2021-09-22 20:02:57.943608: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency. 2021-09-22 20:02:57.943614: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:360] Ignored change_concat_input_ranges.
3. TF1 dondurulmuş GraphDef'i TFLite modeline dönüştürün
Önce: TF1 ile dönüştürme
Bu, TF1 tarzı TFlite dönüştürme için tipik koddur.
converter = tf1.lite.TFLiteConverter.from_frozen_graph(
graph_def_file=GRAPH_DEF_MODEL_PATH,
input_arrays=['input'],
input_shapes={'input' : [1, 128, 128, 3]},
output_arrays=['MobilenetV1/Predictions/Softmax'],
)
converter.optimizations = {tf.lite.Optimize.DEFAULT}
converter.change_concat_input_ranges = True
tflite_model = converter.convert()
tutucu12 l10n-yer2021-09-22 20:02:58.139650: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format. 2021-09-22 20:02:58.139707: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency. 2021-09-22 20:02:58.139721: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:360] Ignored change_concat_input_ranges.
Sonra: TF2 ile dönüştürme
Önce, donmuş TF1 GraphDef'i bir TF1 SavedModel'e dönüştürün ve ardından daha küçük bir v2 dönüştürücü bayrakları ayarlanmış bir TFLite modeline dönüştürün.
## Convert TF1 frozen Graph to TF1 SavedModel.
# Load the graph as a v1.GraphDef
import pathlib
gdef = tf.compat.v1.GraphDef()
gdef.ParseFromString(pathlib.Path(GRAPH_DEF_MODEL_PATH).read_bytes())
# Convert the GraphDef to a tf.Graph
with tf.Graph().as_default() as g:
tf.graph_util.import_graph_def(gdef, name="")
# Lookup the input and output tensors.
input_tensor = g.get_tensor_by_name('input:0')
output_tensor = g.get_tensor_by_name('MobilenetV1/Predictions/Softmax:0')
# Save the graph as a TF1 Savedmodel
remove_dir('saved_model_3/')
with tf.compat.v1.Session(graph=g) as s:
tf.compat.v1.saved_model.simple_save(
session=s,
export_dir='saved_model_3/',
inputs={'input':input_tensor},
outputs={'output':output_tensor})
# Convert TF1 SavedModel to a TFLite model.
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir='saved_model_3/')
converter.optimizations = {tf.lite.Optimize.DEFAULT}
tflite_model = converter.convert()
tutucu14 l10n-yer2021-09-22 20:02:58.874490: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format. 2021-09-22 20:02:58.874538: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency. 2021-09-22 20:02:58.874545: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:360] Ignored change_concat_input_ranges.
daha fazla okuma
- İş akışları ve en yeni özellikler hakkında daha fazla bilgi edinmek için TFLite Kılavuzuna bakın.
- TF1 kodunu veya eski TF1 model formatlarını (
.h5
dosyaları, donmuş GraphDef.pb
vb.) kullanıyorsanız, lütfen kodunuzu güncelleyin ve modellerinizi TF2 SavedModel formatına taşıyın .