Yardım Kaggle üzerinde TensorFlow ile Büyük Bariyer Resifi korumak Meydan Üyelik

TFLite kodunuzu TF2'ye taşıma

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 üzerinde cihazı (mobil, gömülü ve IOT cihazlar) ML çıkarımlar çalıştırmak yardımcı olan araçlar kümesidir. TFLite dönüştürücü dönüştürür etkili bir cihaz üzerinde çalıştırılabilir, optimize edilmiş bir TFLite modeli biçime TF modelleri Var olan bu tür 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 modeli biçimini (Keras dosyası, dondurulmuş GraphDef, kontrol noktaları, tf.Session, vs) kullanıyorsanız, TF1 / TF2 SavedModel olarak güncellemeye ve TF2 çevirici API'sini kullanmak tf.lite.TFLiteConverter.from_saved_model(...) bir TFLite modeline dönüştürülmesi için () bakınız Tablo 1.

  • Dönüştürücü API işaretlerini güncelleyin (bkz. Tablo 2).

  • Gibi eski API'leri çıkarın tf.lite.constants . (örn: Değiştir tf.lite.constants.INT8 ile tf.int8 )

// 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
çıkarıldı (yerine kullanarak görselleştirmek modelleri netron veya visualize.py )


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)
TF1 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."
2021-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()
2021-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()
2021-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 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()
2021-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()
2021-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

İlk olarak, 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()
2021-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

  • Bakınız TFLite Kılavuz iş akışları ve en son özellikler hakkında daha fazla bilgi edinmek için.
  • Eğer TF1 kodunu veya eski TF1 modeli biçimlerini (keras kullanıyorsanız .h5 dosyaları, dondurulmuş GraphDef .pb , vb), kodunuzu güncellemek ve diğer işlemler için modeller göç lütfen TF2 SavedModel formatında .