tf.lite.Interpreter
| Просмотреть исходный код на GitHub |
Интерфейс интерпретатора для выполнения моделей TensorFlow Lite.
tf.lite.Interpreter(
model_path=None,
model_content=None,
experimental_delegates=None,
num_threads=None,
experimental_op_resolver_type=tf.lite.experimental.OpResolverType.AUTO,
experimental_preserve_all_tensors=False
)
Модели, полученные из TfLiteConverter, могут быть выполнены в Python с помощью Interpreter.
В качестве примера давайте сгенерируем простую модель Keras и преобразуем её в TFLite (TfLiteConverter также поддерживает другие форматы входных данных с from_saved_model и from_concrete_function)
x = np.array([[1.], [2.]])
y = np.array([[2.], [4.]])
model = tf.keras.models.Sequential([
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(units=1, input_shape=[1])
])
model.compile(optimizer='sgd', loss='mean_squared_error')
model.fit(x, y, epochs=1)
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()
tflite_model можно сохранить в файл и загрузить позже или напрямую в Interpreter. Поскольку TensorFlow Lite заранее планирует выделение памяти для тензоров, чтобы оптимизировать вывод, пользователь должен вызвать allocate_tensors() перед любым выводом.
interpreter = tf.lite.Interpreter(model_content=tflite_model) interpreter.allocate_tensors() # Needed before execution!
Пример выполнения:
output = interpreter.get_output_details()[0] # Model has single output. input = interpreter.get_input_details()[0] # Model has single input. input_data = tf.constant(1., shape=[1, 1]) interpreter.set_tensor(input['index'], input_data) interpreter.invoke() interpreter.get_tensor(output['index']).shape (1, 1)
Используйте get_signature_runner() для более удобного API вывода.
| Аргументы | |
|---|---|
model_path | Путь к файлу TF-Lite Flatbuffer. |
model_content | Содержимое модели. |
experimental_delegates | Экспериментально. Может быть изменено. Список объектов TfLiteDelegate, возвращаемых lite.load_delegate(). |
num_threads | Устанавливает количество потоков, используемых интерпретатором и доступных для ядер CPU. Если не указано, интерпретатор будет использовать зависящее от реализации значение по умолчанию. В настоящее время только подмножество ядер, таких как conv, поддерживает многопоточность. num_threads должно быть >= -1. Установка num_threads в 0 приводит к отключению многопоточности, что эквивалентно установке num_threads в 1. Если установлено в значение -1, количество используемых потоков будет определяться реализацией и зависеть от платформы. |
experimental_op_resolver_type | Решатель операций, используемый интерпретатором. Он должен быть экземпляром типа OpResolverType. По умолчанию мы используем встроенный решатель операций, который соответствует tflite::ops::builtin::BuiltinOpResolver в C++. |
experimental_preserve_all_tensors | Если True, то промежуточные тензоры, используемые во время вычислений, сохраняются для проверки, а если переданный тип решателя операций AUTO или BUILTIN, тип будет изменён на BUILTIN_WITHOUT_DEFAULT_DELEGATES, чтобы не применялись дефолтные делегаты Tensorflow Lite. Если False, получение промежуточных тензоров может привести к неопределённым значениям или None, особенно когда граф успешно модифицирован дефолтным делегатом Tensorflow Lite. |
| Возможные исключения | |
|---|---|
ValueError | Если интерпретатор не смог создаться. |
Методы
allocate_tensors
allocate_tensors()
get_input_details
get_input_details()
Получение деталей входного тензора модели.
| Возвращаемое значение | |
|---|---|
Список, в котором каждый элемент — словарь с деталями о входном тензоре. Каждый словарь содержит следующие поля, описывающие тензор:
|
get_output_details
get_output_details()
Получение деталей выходного тензора модели.
| Возвращаемое значение | |
|---|---|
Список, в котором каждый элемент — словарь с деталями о выходном тензоре. Словарь содержит те же поля, что и описанные для get_input_details(). |
get_signature_list
get_signature_list()
Получение списка SignatureDefs в модели.
Пример,
signatures = interpreter.get_signature_list()
print(signatures)
# {
# 'add': {'inputs': ['x', 'y'], 'outputs': ['output_0']}
# }
Then using the names in the signature list you can get a callable from
get_signature_runner().
| Возвращаемое значение | |
|---|---|
| Список деталей SignatureDef в структуре словаря. Он индексируется по имени метода SignatureDef, а значение — это словарь входов и выходов. |
get_signature_runner
get_signature_runner(
signature_key=None
)
Получение вызываемого объекта для вывода определённого SignatureDef.
Пример использования,
interpreter = tf.lite.Interpreter(model_content=tflite_model)
interpreter.allocate_tensors()
fn = interpreter.get_signature_runner('div_with_remainder')
output = fn(x=np.array([3]), y=np.array([2]))
print(output)
# {
# 'quotient': array([1.], dtype=float32)
# 'remainder': array([1.], dtype=float32)
# }
None можно передать для signature_key, если модель содержит только одну подпись.
Все используемые имена — это имена конкретного SignatureDef.
| Аргументы | |
|---|---|
signature_key | Ключ подписи для SignatureDef, он может быть None, только если модель содержит единственный SignatureDef. Значение по умолчанию — None. |
| Возвращаемое значение | |
|---|---|
| Возвращает вызываемый объект, который может выполнять вывод для SignatureDef, определённой аргументом 'signature_key'. Вызываемый объект будет принимать ключевые аргументы, соответствующие аргументам SignatureDef, которые должны иметь значения NumPy. Вызываемый объект вернёт словарь, который сопоставляет имена выходов со значениями NumPy вычисленных результатов. |
| Возможные исключения | |
|---|---|
ValueError | Если переданный signature_key неверный. |
get_tensor
get_tensor(
tensor_index
)
Получение значения выходного тензора (получение копии).
Если вы хотите избежать копирования, используйте tensor(). Эта функция не может использоваться для чтения промежуточных результатов.
| Аргументы | |
|---|---|
tensor_index | Индекс тензора для получения. Это значение можно получить из поля 'index' в get_output_details. |
| Возвращаемое значение | |
|---|---|
| Массив NumPy. |
get_tensor_details
get_tensor_details()
Получение деталей тензора для каждого тензора с действительными деталями тензора.
Тензоры, для которых не найдена необходимая информация о тензоре, не добавляются в список. Это включает временные тензоры без имени.
| Возвращаемое значение | |
|---|---|
| Список словарей, содержащих информацию о тензорах. |
invoke
invoke()
Вызов интерпретатора.
Убедитесь, что вы установили размеры входов, выделили тензоры и заполнили значения перед вызовом этого метода. Также обратите внимание, что эта функция освобождает GIL, поэтому сложные вычисления могут выполняться в фоновом режиме, в то время как интерпретатор Python продолжает работу. Никакие другие функции этого объекта не должны вызываться, пока вызов invoke() не завершится.
| Возможные исключения | |
|---|---|
ValueError | При сбое в работе основного интерпретатора возникает исключение ValueError. |
reset_all_variables
reset_all_variables()
resize_tensor_input
resize_tensor_input(
input_index, tensor_size, strict=False
)
Изменяет размер входного тензора.
| Аргументы | |
|---|---|
input_index | Индекс тензора входных данных для изменения. Это значение можно получить из поля 'index' в get_input_details. |
tensor_size | Размер тензора, на который нужно изменить входные данные. |
strict | Можно изменить только неизвестные размерности, когда strict равно True. Неизвестные размерности указаны как -1 в атрибуте shape_signature данного тензора. (по умолчанию False) |
| Исключения | |
|---|---|
ValueError | Если интерпретатор не смог изменить размер входного тензора. |
Использование:
interpreter = Interpreter(model_content=tflite_model) interpreter.resize_tensor_input(0, [num_test_images, 224, 224, 3]) interpreter.allocate_tensors() interpreter.set_tensor(0, test_images) interpreter.invoke()
set_tensor
set_tensor(
tensor_index, value
)
Устанавливает значение входного тензора.
Обратите внимание, что данные копируются в value.
Если вы хотите избежать копирования, вы можете использовать функцию tensor() для получения буфера numpy, указывающего на буфер входных данных в интерпретаторе tflite.
| Аргументы | |
|---|---|
tensor_index | Индекс тензора для установки. Это значение можно получить из поля 'index' в get_input_details. |
value | Значение тензора для установки. |
| Исключения | |
|---|---|
ValueError | Если интерпретатор не смог установить тензор. |
tensor
tensor(
tensor_index
)
Возвращает функцию, которая предоставляет представление numpy текущего буфера тензора.
Это позволяет читать и записывать в эти тензоры без копирования. Это более точно отражает интерфейс члена tensor() класса C++ Interpreter, отсюда и название. Будьте осторожны, чтобы не удерживать эти ссылки на выходные данные после вызовов allocate_tensors() и invoke(). Эта функция не может использоваться для чтения промежуточных результатов.
Использование:
interpreter.allocate_tensors()
input = interpreter.tensor(interpreter.get_input_details()[0]["index"])
output = interpreter.tensor(interpreter.get_output_details()[0]["index"])
for i in range(10):
input().fill(3.)
interpreter.invoke()
print("inference %s" % output())
Обратите внимание, как эта функция избегает создания массива numpy напрямую. Это важно, чтобы не удерживать фактические представления numpy на данных дольше, чем необходимо. Если вы это сделаете, интерпретатор больше не сможет быть вызван, так как существует возможность, что интерпретатор изменит размер и сделает ссылки на тензоры недействительными. NumPy API не допускает каких-либо изменений в базовых буферах.
НЕПРАВИЛЬНО:
input = interpreter.tensor(interpreter.get_input_details()[0]["index"])() output = interpreter.tensor(interpreter.get_output_details()[0]["index"])() interpreter.allocate_tensors() # This will throw RuntimeError for i in range(10): input.fill(3.) interpreter.invoke() # this will throw RuntimeError since input,output
| Аргументы | |
|---|---|
tensor_index | Индекс тензора для получения. Это значение можно получить из поля 'index' в get_output_details. |
| Возвращает | |
|---|---|
| Функция, которая может возвращать новый массив numpy, указывающий на внутреннее состояние тензора TFLite в любой момент. Безопасно хранить функцию навсегда, но небезопасно хранить массив numpy навсегда. |
© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.9/api_docs/python/tf/lite/Interpreter