Visualizza su TensorFlow.org | Esegui in Google Colab | Visualizza la fonte su GitHub | Scarica taccuino |
TensorFlow Lite supporta la conversione delle specifiche di input/output del modello TensorFlow in modelli TensorFlow Lite. Le specifiche di input/output sono chiamate "firme". Le firme possono essere specificate durante la creazione di un SavedModel o la creazione di funzioni concrete.
Le firme in TensorFlow Lite forniscono le seguenti funzionalità:
- Specificano input e output del modello TensorFlow Lite convertito rispettando le firme del modello TensorFlow.
- Consenti a un singolo modello TensorFlow Lite di supportare più punti di ingresso.
La firma è composta da tre pezzi:
- Input: mappa per input dal nome di input nella firma a un tensore di input.
- Output: mappa per la mappatura dell'output dal nome dell'output nella firma a un tensore dell'output.
- Chiave di firma: nome che identifica un punto di ingresso del grafico.
Impostare
import tensorflow as tf
Modello di esempio
Supponiamo di avere due attività, ad esempio codifica e decodifica, come modello TensorFlow:
class Model(tf.Module):
@tf.function(input_signature=[tf.TensorSpec(shape=[None], dtype=tf.float32)])
def encode(self, x):
result = tf.strings.as_string(x)
return {
"encoded_result": result
}
@tf.function(input_signature=[tf.TensorSpec(shape=[None], dtype=tf.string)])
def decode(self, x):
result = tf.strings.to_number(x)
return {
"decoded_result": result
}
Dal punto di vista della firma, il modello TensorFlow di cui sopra può essere riassunto come segue:
Firma
- Chiave: codifica
- Ingressi: {"x"}
- Risultato: {"encoded_result"}
Firma
- Chiave: decodifica
- Ingressi: {"x"}
- Risultato: {"decoded_result"}
Converti un modello con le firme
Le API del convertitore TensorFlow Lite porteranno le informazioni sulla firma di cui sopra nel modello TensorFlow Lite convertito.
Questa funzionalità di conversione è disponibile su tutte le API del convertitore a partire dalla versione 2.7.0 di TensorFlow. Vedi esempi di utilizzo.
Dal modello salvato
model = Model()
# Save the model
SAVED_MODEL_PATH = 'content/saved_models/coding'
tf.saved_model.save(
model, SAVED_MODEL_PATH,
signatures={
'encode': model.encode.get_concrete_function(),
'decode': model.decode.get_concrete_function()
})
# Convert the saved model using TFLiteConverter
converter = tf.lite.TFLiteConverter.from_saved_model(SAVED_MODEL_PATH)
converter.target_spec.supported_ops = [
tf.lite.OpsSet.TFLITE_BUILTINS, # enable TensorFlow Lite ops.
tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops.
]
tflite_model = converter.convert()
# Print the signatures from the converted model
interpreter = tf.lite.Interpreter(model_content=tflite_model)
signatures = interpreter.get_signature_list()
print(signatures)
2021-11-15 12:17:48.388332: W tensorflow/python/util/util.cc:368] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them. INFO:tensorflow:Assets written to: content/saved_models/coding/assets 2021-11-15 12:17:48.727484: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:363] Ignored output_format. 2021-11-15 12:17:48.727522: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:366] Ignored drop_control_dependency. WARNING:absl:Buffer deduplication procedure will be skipped when flatbuffer library is not properly loaded 2021-11-15 12:17:48.727529: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:372] Ignored change_concat_input_ranges. 2021-11-15 12:17:48.767576: W tensorflow/compiler/mlir/lite/flatbuffer_export.cc:1891] TFLite interpreter needs to link Flex delegate in order to run the model since it contains the following Select TFop(s): Flex ops: FlexAsString, FlexStringToNumber Details: tf.AsString(tensor<?xf32>) -> (tensor<?x!tf_type.string>) : {device = "", fill = "", precision = -1 : i64, scientific = false, shortest = false, width = -1 : i64} tf.StringToNumber(tensor<?x!tf_type.string>) -> (tensor<?xf32>) : {device = "", out_type = f32} See instructions: https://www.tensorflow.org/lite/guide/ops_select {'decode': {'inputs': ['x'], 'outputs': ['decoded_result']}, 'encode': {'inputs': ['x'], 'outputs': ['encoded_result']} } INFO: Created TensorFlow Lite delegate for select TF ops. INFO: TfLiteFlexDelegate delegate: 1 nodes delegated out of 1 nodes with 1 partitions.
Dal modello Keras
# Generate a Keras model.
keras_model = tf.keras.Sequential(
[
tf.keras.layers.Dense(2, input_dim=4, activation='relu', name='x'),
tf.keras.layers.Dense(1, activation='relu', name='output'),
]
)
# Convert the keras model using TFLiteConverter.
# Keras model converter API uses the default signature automatically.
converter = tf.lite.TFLiteConverter.from_keras_model(keras_model)
tflite_model = converter.convert()
# Print the signatures from the converted model
interpreter = tf.lite.Interpreter(model_content=tflite_model)
signatures = interpreter.get_signature_list()
print(signatures)
INFO:tensorflow:Assets written to: /tmp/tmplhr7j714/assets INFO:tensorflow:Assets written to: /tmp/tmplhr7j714/assets 2021-11-15 12:17:49.368226: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:363] Ignored output_format. 2021-11-15 12:17:49.368264: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:366] Ignored drop_control_dependency. WARNING:absl:Buffer deduplication procedure will be skipped when flatbuffer library is not properly loaded {'serving_default': {'inputs': ['x_input'], 'outputs': ['output']} }
Dalle funzioni concrete
model = Model()
# Convert the concrete functions using TFLiteConverter
converter = tf.lite.TFLiteConverter.from_concrete_functions(
[model.encode.get_concrete_function(),
model.decode.get_concrete_function()], model)
converter.target_spec.supported_ops = [
tf.lite.OpsSet.TFLITE_BUILTINS, # enable TensorFlow Lite ops.
tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops.
]
tflite_model = converter.convert()
# Print the signatures from the converted model
interpreter = tf.lite.Interpreter(model_content=tflite_model)
signatures = interpreter.get_signature_list()
print(signatures)
INFO:tensorflow:Assets written to: /tmp/tmpc14_l70o/assets INFO:tensorflow:Assets written to: /tmp/tmpc14_l70o/assets 2021-11-15 12:17:49.538814: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:363] Ignored output_format. 2021-11-15 12:17:49.538850: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:366] Ignored drop_control_dependency. WARNING:absl:Buffer deduplication procedure will be skipped when flatbuffer library is not properly loaded {'decode': {'inputs': ['x'], 'outputs': ['decoded_result']}, 'encode': {'inputs': ['x'], 'outputs': ['encoded_result']} } 2021-11-15 12:17:49.572773: W tensorflow/compiler/mlir/lite/flatbuffer_export.cc:1891] TFLite interpreter needs to link Flex delegate in order to run the model since it contains the following Select TFop(s): Flex ops: FlexAsString, FlexStringToNumber Details: tf.AsString(tensor<?xf32>) -> (tensor<?x!tf_type.string>) : {device = "", fill = "", precision = -1 : i64, scientific = false, shortest = false, width = -1 : i64} tf.StringToNumber(tensor<?x!tf_type.string>) -> (tensor<?xf32>) : {device = "", out_type = f32} See instructions: https://www.tensorflow.org/lite/guide/ops_select
Esegui firme
Le API di inferenza TensorFlow supportano le esecuzioni basate sulla firma:
- Accedere ai tensori di input/output attraverso i nomi degli input e degli output, specificati dalla firma.
- Eseguendo separatamente ogni punto di ingresso del grafico, identificato dalla chiave di firma.
- Supporto per la procedura di inizializzazione del SavedModel.
Sono attualmente disponibili le associazioni dei linguaggi Java, C++ e Python. Vedi esempio le sezioni seguenti.
Giava
try (Interpreter interpreter = new Interpreter(file_of_tensorflowlite_model)) {
// Run encoding signature.
Map<String, Object> inputs = new HashMap<>();
inputs.put("x", input);
Map<String, Object> outputs = new HashMap<>();
outputs.put("encoded_result", encoded_result);
interpreter.runSignature(inputs, outputs, "encode");
// Run decoding signature.
Map<String, Object> inputs = new HashMap<>();
inputs.put("x", encoded_result);
Map<String, Object> outputs = new HashMap<>();
outputs.put("decoded_result", decoded_result);
interpreter.runSignature(inputs, outputs, "decode");
}
C++
SignatureRunner* encode_runner =
interpreter->GetSignatureRunner("encode");
encode_runner->ResizeInputTensor("x", {100});
encode_runner->AllocateTensors();
TfLiteTensor* input_tensor = encode_runner->input_tensor("x");
float* input = input_tensor->data.f;
// Fill `input`.
encode_runner->Invoke();
const TfLiteTensor* output_tensor = encode_runner->output_tensor(
"encoded_result");
float* output = output_tensor->data.f;
// Access `output`.
Pitone
# Load the TFLite model in TFLite Interpreter
interpreter = tf.lite.Interpreter(model_content=tflite_model)
# Print the signatures from the converted model
signatures = interpreter.get_signature_list()
print('Signature:', signatures)
# encode and decode are callable with input as arguments.
encode = interpreter.get_signature_runner('encode')
decode = interpreter.get_signature_runner('decode')
# 'encoded' and 'decoded' are dictionaries with all outputs from the inference.
input = tf.constant([1, 2, 3], dtype=tf.float32)
print('Input:', input)
encoded = encode(x=input)
print('Encoded result:', encoded)
decoded = decode(x=encoded['encoded_result'])
print('Decoded result:', decoded)
Signature: {'decode': {'inputs': ['x'], 'outputs': ['decoded_result']}, 'encode': {'inputs': ['x'], 'outputs': ['encoded_result']} } Input: tf.Tensor([1. 2. 3.], shape=(3,), dtype=float32) Encoded result: {'encoded_result': array([b'1.000000', b'2.000000', b'3.000000'], dtype=object)} Decoded result: {'decoded_result': array([1., 2., 3.], dtype=float32)}
Limitazioni note
- Poiché l'interprete TFLite non garantisce la sicurezza del thread, i corridori di firma dello stesso interprete non verranno eseguiti contemporaneamente.
- Il supporto per C/iOS/Swift non è ancora disponibile.
Aggiornamenti
- Versione 2.7
- La funzione di firma multipla è implementata.
- Tutte le API del convertitore dalla versione due generano modelli TensorFlow Lite abilitati per la firma.
- Versione 2.5
- Funzione di firma è disponibile attraverso la
from_saved_model
API convertitore.
- Funzione di firma è disponibile attraverso la
Visualizza su TensorFlow.org | Esegui in Google Colab | Visualizza la fonte su GitHub | Scarica taccuino |
TensorFlow Lite supporta la conversione delle specifiche di input/output del modello TensorFlow in modelli TensorFlow Lite. Le specifiche di input/output sono chiamate "firme". Le firme possono essere specificate durante la creazione di un SavedModel o la creazione di funzioni concrete.
Le firme in TensorFlow Lite forniscono le seguenti funzionalità:
- Specificano input e output del modello TensorFlow Lite convertito rispettando le firme del modello TensorFlow.
- Consenti a un singolo modello TensorFlow Lite di supportare più punti di ingresso.
La firma è composta da tre pezzi:
- Input: mappa per input dal nome di input nella firma a un tensore di input.
- Output: mappa per la mappatura dell'output dal nome dell'output nella firma a un tensore dell'output.
- Chiave di firma: nome che identifica un punto di ingresso del grafico.
Impostare
import tensorflow as tf
Modello di esempio
Supponiamo di avere due attività, ad esempio codifica e decodifica, come modello TensorFlow:
class Model(tf.Module):
@tf.function(input_signature=[tf.TensorSpec(shape=[None], dtype=tf.float32)])
def encode(self, x):
result = tf.strings.as_string(x)
return {
"encoded_result": result
}
@tf.function(input_signature=[tf.TensorSpec(shape=[None], dtype=tf.string)])
def decode(self, x):
result = tf.strings.to_number(x)
return {
"decoded_result": result
}
Dal punto di vista della firma, il modello TensorFlow di cui sopra può essere riassunto come segue:
Firma
- Chiave: codifica
- Ingressi: {"x"}
- Risultato: {"encoded_result"}
Firma
- Chiave: decodifica
- Ingressi: {"x"}
- Risultato: {"decoded_result"}
Converti un modello con le firme
Le API del convertitore TensorFlow Lite porteranno le informazioni sulla firma di cui sopra nel modello TensorFlow Lite convertito.
Questa funzionalità di conversione è disponibile su tutte le API del convertitore a partire dalla versione 2.7.0 di TensorFlow. Vedi esempi di utilizzo.
Dal modello salvato
model = Model()
# Save the model
SAVED_MODEL_PATH = 'content/saved_models/coding'
tf.saved_model.save(
model, SAVED_MODEL_PATH,
signatures={
'encode': model.encode.get_concrete_function(),
'decode': model.decode.get_concrete_function()
})
# Convert the saved model using TFLiteConverter
converter = tf.lite.TFLiteConverter.from_saved_model(SAVED_MODEL_PATH)
converter.target_spec.supported_ops = [
tf.lite.OpsSet.TFLITE_BUILTINS, # enable TensorFlow Lite ops.
tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops.
]
tflite_model = converter.convert()
# Print the signatures from the converted model
interpreter = tf.lite.Interpreter(model_content=tflite_model)
signatures = interpreter.get_signature_list()
print(signatures)
2021-11-15 12:17:48.388332: W tensorflow/python/util/util.cc:368] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them. INFO:tensorflow:Assets written to: content/saved_models/coding/assets 2021-11-15 12:17:48.727484: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:363] Ignored output_format. 2021-11-15 12:17:48.727522: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:366] Ignored drop_control_dependency. WARNING:absl:Buffer deduplication procedure will be skipped when flatbuffer library is not properly loaded 2021-11-15 12:17:48.727529: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:372] Ignored change_concat_input_ranges. 2021-11-15 12:17:48.767576: W tensorflow/compiler/mlir/lite/flatbuffer_export.cc:1891] TFLite interpreter needs to link Flex delegate in order to run the model since it contains the following Select TFop(s): Flex ops: FlexAsString, FlexStringToNumber Details: tf.AsString(tensor<?xf32>) -> (tensor<?x!tf_type.string>) : {device = "", fill = "", precision = -1 : i64, scientific = false, shortest = false, width = -1 : i64} tf.StringToNumber(tensor<?x!tf_type.string>) -> (tensor<?xf32>) : {device = "", out_type = f32} See instructions: https://www.tensorflow.org/lite/guide/ops_select {'decode': {'inputs': ['x'], 'outputs': ['decoded_result']}, 'encode': {'inputs': ['x'], 'outputs': ['encoded_result']} } INFO: Created TensorFlow Lite delegate for select TF ops. INFO: TfLiteFlexDelegate delegate: 1 nodes delegated out of 1 nodes with 1 partitions.
Dal modello Keras
# Generate a Keras model.
keras_model = tf.keras.Sequential(
[
tf.keras.layers.Dense(2, input_dim=4, activation='relu', name='x'),
tf.keras.layers.Dense(1, activation='relu', name='output'),
]
)
# Convert the keras model using TFLiteConverter.
# Keras model converter API uses the default signature automatically.
converter = tf.lite.TFLiteConverter.from_keras_model(keras_model)
tflite_model = converter.convert()
# Print the signatures from the converted model
interpreter = tf.lite.Interpreter(model_content=tflite_model)
signatures = interpreter.get_signature_list()
print(signatures)
INFO:tensorflow:Assets written to: /tmp/tmplhr7j714/assets INFO:tensorflow:Assets written to: /tmp/tmplhr7j714/assets 2021-11-15 12:17:49.368226: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:363] Ignored output_format. 2021-11-15 12:17:49.368264: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:366] Ignored drop_control_dependency. WARNING:absl:Buffer deduplication procedure will be skipped when flatbuffer library is not properly loaded {'serving_default': {'inputs': ['x_input'], 'outputs': ['output']} }
Dalle funzioni concrete
model = Model()
# Convert the concrete functions using TFLiteConverter
converter = tf.lite.TFLiteConverter.from_concrete_functions(
[model.encode.get_concrete_function(),
model.decode.get_concrete_function()], model)
converter.target_spec.supported_ops = [
tf.lite.OpsSet.TFLITE_BUILTINS, # enable TensorFlow Lite ops.
tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops.
]
tflite_model = converter.convert()
# Print the signatures from the converted model
interpreter = tf.lite.Interpreter(model_content=tflite_model)
signatures = interpreter.get_signature_list()
print(signatures)
INFO:tensorflow:Assets written to: /tmp/tmpc14_l70o/assets INFO:tensorflow:Assets written to: /tmp/tmpc14_l70o/assets 2021-11-15 12:17:49.538814: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:363] Ignored output_format. 2021-11-15 12:17:49.538850: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:366] Ignored drop_control_dependency. WARNING:absl:Buffer deduplication procedure will be skipped when flatbuffer library is not properly loaded {'decode': {'inputs': ['x'], 'outputs': ['decoded_result']}, 'encode': {'inputs': ['x'], 'outputs': ['encoded_result']} } 2021-11-15 12:17:49.572773: W tensorflow/compiler/mlir/lite/flatbuffer_export.cc:1891] TFLite interpreter needs to link Flex delegate in order to run the model since it contains the following Select TFop(s): Flex ops: FlexAsString, FlexStringToNumber Details: tf.AsString(tensor<?xf32>) -> (tensor<?x!tf_type.string>) : {device = "", fill = "", precision = -1 : i64, scientific = false, shortest = false, width = -1 : i64} tf.StringToNumber(tensor<?x!tf_type.string>) -> (tensor<?xf32>) : {device = "", out_type = f32} See instructions: https://www.tensorflow.org/lite/guide/ops_select
Esegui firme
Le API di inferenza TensorFlow supportano le esecuzioni basate sulla firma:
- Accedere ai tensori di input/output attraverso i nomi degli input e degli output, specificati dalla firma.
- Eseguendo separatamente ogni punto di ingresso del grafico, identificato dalla chiave di firma.
- Supporto per la procedura di inizializzazione del SavedModel.
Sono attualmente disponibili le associazioni dei linguaggi Java, C++ e Python. Vedi esempio le sezioni seguenti.
Giava
try (Interpreter interpreter = new Interpreter(file_of_tensorflowlite_model)) {
// Run encoding signature.
Map<String, Object> inputs = new HashMap<>();
inputs.put("x", input);
Map<String, Object> outputs = new HashMap<>();
outputs.put("encoded_result", encoded_result);
interpreter.runSignature(inputs, outputs, "encode");
// Run decoding signature.
Map<String, Object> inputs = new HashMap<>();
inputs.put("x", encoded_result);
Map<String, Object> outputs = new HashMap<>();
outputs.put("decoded_result", decoded_result);
interpreter.runSignature(inputs, outputs, "decode");
}
C++
SignatureRunner* encode_runner =
interpreter->GetSignatureRunner("encode");
encode_runner->ResizeInputTensor("x", {100});
encode_runner->AllocateTensors();
TfLiteTensor* input_tensor = encode_runner->input_tensor("x");
float* input = input_tensor->data.f;
// Fill `input`.
encode_runner->Invoke();
const TfLiteTensor* output_tensor = encode_runner->output_tensor(
"encoded_result");
float* output = output_tensor->data.f;
// Access `output`.
Pitone
# Load the TFLite model in TFLite Interpreter
interpreter = tf.lite.Interpreter(model_content=tflite_model)
# Print the signatures from the converted model
signatures = interpreter.get_signature_list()
print('Signature:', signatures)
# encode and decode are callable with input as arguments.
encode = interpreter.get_signature_runner('encode')
decode = interpreter.get_signature_runner('decode')
# 'encoded' and 'decoded' are dictionaries with all outputs from the inference.
input = tf.constant([1, 2, 3], dtype=tf.float32)
print('Input:', input)
encoded = encode(x=input)
print('Encoded result:', encoded)
decoded = decode(x=encoded['encoded_result'])
print('Decoded result:', decoded)
Signature: {'decode': {'inputs': ['x'], 'outputs': ['decoded_result']}, 'encode': {'inputs': ['x'], 'outputs': ['encoded_result']} } Input: tf.Tensor([1. 2. 3.], shape=(3,), dtype=float32) Encoded result: {'encoded_result': array([b'1.000000', b'2.000000', b'3.000000'], dtype=object)} Decoded result: {'decoded_result': array([1., 2., 3.], dtype=float32)}
Limitazioni note
- Poiché l'interprete TFLite non garantisce la sicurezza del thread, i corridori di firma dello stesso interprete non verranno eseguiti contemporaneamente.
- Il supporto per C/iOS/Swift non è ancora disponibile.
Aggiornamenti
- Versione 2.7
- La funzione di firma multipla è implementata.
- Tutte le API del convertitore dalla versione due generano modelli TensorFlow Lite abilitati per la firma.
- Versione 2.5
- Funzione di firma è disponibile attraverso la
from_saved_model
API convertitore.
- Funzione di firma è disponibile attraverso la