Spec-Zone.ru › TensorFlow 2.9

tf.lite.Interpreter

Просмотреть исходный код на GitHub

Интерфейс интерпретатора для выполнения моделей TensorFlow Lite.

Просмотр псевдонимов

Псевдонимы совместимости для миграции

См. Руководство по миграции для получения дополнительной информации.

tf.compat.v1.lite.Interpreter

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

Получение деталей входного тензора модели.

Возвращаемое значение
Список, в котором каждый элемент — словарь с деталями о входном тензоре. Каждый словарь содержит следующие поля, описывающие тензор:
  • name: Имя тензора.
  • index: Индекс тензора в интерпретаторе.
  • shape: Форма тензора.
  • shape_signature: Аналогично shape для моделей с известными/фиксированными формами. Если размеры любых измерений неизвестны, они указываются с помощью -1.

  • dtype: Тип данных NumPy (например, np.int32 или np.uint8).

  • quantization: Устаревшее, используйте quantization_parameters. Это поле работает только для квантования по тензору, тогда как quantization_parameters работает во всех случаях.

  • quantization_parameters: Словарь параметров, используемых для квантования тензора: ~ scales: Список масштабирующих коэффициентов (один, если квантование по тензору). ~ zero_points: Список нулевых точек (одна, если квантование по тензору). ~ quantized_dimension: Указывает размерность квантования по осям в случае нескольких масштабирующих коэффициентов/нулевых точек.

  • sparsity_parameters: Словарь параметров, используемых для кодирования разреженного тензора. Он пуст, если тензор плотный.

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API