InterpreterApi

открытый интерфейс InterpreterApi
Известные косвенные подклассы

Интерфейс интерпретатора модели TensorFlow Lite, за исключением экспериментальных методов.

Экземпляр InterpreterApi инкапсулирует предварительно обученную модель TensorFlow Lite, в которой выполняются операции для вывода модели.

Например, если модель принимает только один вход и возвращает только один результат:

try (InterpreterApi interpreter =
     new InterpreterApi.create(file_of_a_tensorflowlite_model)) {
   interpreter.run(input, output);
 }
 

Если модель принимает несколько входных или выходных данных:

Object[] inputs = {input0, input1, ...};
 Map<Integer, Object> map_of_indices_to_outputs = new HashMap<>();
 FloatBuffer ith_output = FloatBuffer.allocateDirect(3 * 2 * 4);  // Float tensor, shape 3x2x4.
 ith_output.order(ByteOrder.nativeOrder());
 map_of_indices_to_outputs.put(i, ith_output);
 try (InterpreterApi interpreter =
     new InterpreterApi.create(file_of_a_tensorflowlite_model)) {
   interpreter.runForMultipleInputsOutputs(inputs, map_of_indices_to_outputs);
 }
 

Если модель принимает или создает тензоры строк:

String[] input = {"foo", "bar"};  // Input tensor shape is [2].
 String[][] output = new String[3][2];  // Output tensor shape is [3, 2].
 try (InterpreterApi interpreter =
     new InterpreterApi.create(file_of_a_tensorflowlite_model)) {
   interpreter.runForMultipleInputsOutputs(input, output);
 }
 

Обратите внимание, что существует различие между shape [] и shape[1]. Для выходных данных тензора скалярной строки:

String[] input = {"foo"};  // Input tensor shape is [1].
 ByteBuffer outputBuffer = ByteBuffer.allocate(OUTPUT_BYTES_SIZE);  // Output tensor shape is [].
 try (Interpreter interpreter = new Interpreter(file_of_a_tensorflowlite_model)) {
   interpreter.runForMultipleInputsOutputs(input, outputBuffer);
 }
 byte[] outputBytes = new byte[outputBuffer.remaining()];
 outputBuffer.get(outputBytes);
 // Below, the `charset` can be StandardCharsets.UTF_8.
 String output = new String(outputBytes, charset);
 

Порядок входных и выходных данных определяется при преобразовании модели TensorFlow в модель TensorFlowLite с помощью Toco, как и формы входных данных по умолчанию.

Когда входные данные предоставляются в виде (многомерных) массивов, соответствующие входные тензоры будут неявно изменены в соответствии с формой этого массива. Когда входные данные предоставляются как типы Buffer , неявное изменение размера не выполняется; вызывающая сторона должна убедиться, что размер байта Buffer либо соответствует размеру соответствующего тензора, либо сначала изменяет размер тензора с помощью resizeInput(int, int[]) . Информация о форме и типе тензора может быть получена через класс Tensor , доступный через getInputTensor(int) и getOutputTensor(int) .

ПРЕДУПРЕЖДЕНИЕ. Экземпляры InterpreterApi не являются потокобезопасными.

ПРЕДУПРЕЖДЕНИЕ. Экземпляр InterpreterApi владеет ресурсами, которые должны быть явно освобождены путем вызова функции close()

Библиотека TFLite построена для NDK API 19. Она может работать для уровней Android API ниже 19, но это не гарантируется.

Вложенные классы

сорт InterpreterApi.Options Класс параметров для управления поведением интерпретатора времени выполнения.

Публичные методы

абстрактная пустота
выделитьтензоры ()
При необходимости явно обновляет распределения для всех тензоров.
абстрактная пустота
закрыть ()
Освободите ресурсы, связанные с экземпляром InterpreterApi .
статический InterpreterApi
создать ( File modelFile, параметры InterpreterApi.Options )
Создает экземпляр InterpreterApi , используя указанную модель и параметры.
статический InterpreterApi
создать (параметры ByteBuffer byteBuffer, InterpreterApi.Options )
Создает экземпляр InterpreterApi , используя указанную модель и параметры.
абстракция
getInputIndex ( строка opName)
Получает индекс ввода с учетом имени операции ввода.
абстрактный тензор
getInputTensor (int inputIndex)
Получает тензор, связанный с предоставленным входным индексом.
абстракция
получитьInputTensorCount ()
Получает количество входных тензоров.
абстрактный длинный
getLastNativeInferenceDurationNanoseconds ()
Возвращает собственное время вывода.
абстракция
getOutputIndex ( строка opName)
Получает индекс вывода по заданному имени операции вывода.
абстрактный тензор
getOutputTensor (int outputIndex)
Получает тензор, связанный с предоставленным выходным индексом.
абстракция
получитьOutputTensorCount ()
Получает количество выходных тензоров.
абстрактная пустота
resizeInput (int idx, int[] dims, логический строгий)
Изменяет размер ввода idx-го нативной модели до заданных размеров.
абстрактная пустота
resizeInput (int idx, int[] dims)
Изменяет размер ввода idx-го нативной модели до заданных размеров.
абстрактная пустота
запустить (ввод объекта , вывод объекта )
Запускает вывод модели, если модель принимает только один вход и предоставляет только один выход.
абстрактная пустота
runForMultipleInputsOutputs (входы Object[] , Map < Integer , Object >выходы)
Запускает вывод модели, если модель принимает несколько входных данных или возвращает несколько выходных данных.

Унаследованные методы

Публичные методы

public abstract void allocateTensors ()

При необходимости явно обновляет распределения для всех тензоров.

Это будет распространять формы и выделения памяти для зависимых тензоров, используя входные формы тензора как заданные.

Примечание. Этот вызов является *чисто необязательным*. Распределение тензора будет происходить автоматически во время выполнения, если размер каких-либо входных тензоров был изменен. Этот вызов наиболее полезен при определении формы любых выходных тензоров перед выполнением графа, например,

 interpreter.resizeInput(0, new int[]{1, 4, 4, 3}));
 interpreter.allocateTensors();
 FloatBuffer input = FloatBuffer.allocate(interpreter.getInputTensor(0).numElements());
 // Populate inputs...
 FloatBuffer output = FloatBuffer.allocate(interpreter.getOutputTensor(0).numElements());
 interpreter.run(input, output)
 // Process outputs...

Примечание. Некоторые графики имеют динамически формируемые выходные данные, и в этом случае выходная форма может не распространяться полностью до тех пор, пока не будет выполнен вывод.

Броски
Илегалстатеексцептион если тензоры графа не могут быть успешно выделены.

публичная абстрактная пустота закрыть ()

Освободите ресурсы, связанные с экземпляром InterpreterApi .

public static InterpreterApi create ( File modelFile, параметры InterpreterApi.Options )

Создает экземпляр InterpreterApi , используя указанную модель и параметры. Модель будет загружена из файла.

Параметры
файл модели Файл, содержащий предварительно обученную модель TF Lite.
параметры Набор опций для настройки поведения интерпретатора.
Броски
IllegalArgumentException если modelFile не кодирует допустимую модель TensorFlow Lite.

public static InterpreterApi create ( ByteBuffer byteBuffer, параметры InterpreterApi.Options )

Создает экземпляр InterpreterApi , используя указанную модель и параметры. Модель будет считана из ByteBuffer .

Параметры
байтбуфер Предварительно обученная модель TF Lite в двоичной сериализованной форме. ByteBuffer не следует изменять после создания экземпляра InterpreterApi . ByteBuffer может быть либо MappedByteBuffer , отображающим в памяти файл модели, либо прямым ByteBuffer функции nativeOrder(), который содержит байтовое содержимое модели.
параметры Набор опций для настройки поведения интерпретатора.
Броски
IllegalArgumentException если byteBuffer не является ни MappedByteBuffer , ни прямым ByteBuffer для nativeOrder.

публичный абстрактный int getInputIndex ( String opName)

Получает индекс ввода с учетом имени операции ввода.

Параметры
opName
Броски
IllegalArgumentException если opName не соответствует ни одному входу в модели, используемой для инициализации интерпретатора.

общедоступный абстрактный тензор getInputTensor (int inputIndex)

Получает тензор, связанный с предоставленным входным индексом.

Параметры
входИндекс
Броски
IllegalArgumentException если inputIndex отрицателен или не меньше, чем количество входных параметров модели.

общедоступная абстракция int getInputTensorCount ()

Получает количество входных тензоров.

public abstract Long getLastNativeInferenceDurationNanoseconds ()

Возвращает собственное время вывода.

Броски
IllegalArgumentException если модель не инициализирована интерпретатором.

public abstract int getOutputIndex ( String opName)

Получает индекс вывода по заданному имени операции вывода.

Параметры
opName
Броски
IllegalArgumentException если opName не соответствует ни одному выводу в модели, используемой для инициализации интерпретатора.

общедоступный абстрактный тензор getOutputTensor (int outputIndex)

Получает тензор, связанный с предоставленным выходным индексом.

Примечание. Детали выходного тензора (например, форма) не могут быть полностью заполнены до тех пор, пока не будет выполнен вывод. Если вам нужны обновленные данные *перед* выполнением вывода (например, после изменения размера входного тензора, что может сделать недействительными формы выходного тензора), используйте allocateTensors() для явного запуска распределения и распространения формы. Обратите внимание, что для графиков с выходными формами, которые зависят от входных *значений*, выходная форма может быть не полностью определена до выполнения логического вывода.

Параметры
выходной индекс
Броски
IllegalArgumentException если outputIndex отрицателен или не меньше, чем количество выходов модели.

общедоступная абстракция int getOutputTensorCount ()

Получает количество выходных тензоров.

public abstract void resizeInput (int idx, int[] dims, boolean strict)

Изменяет размер ввода idx-го нативной модели до заданных размеров.

Когда `strict` равно True, можно изменять только неизвестные размеры. Неизвестные размеры обозначаются как `-1` в массиве, возвращаемом `Tensor.shapeSignature()`.

Параметры
IDX
тускнеет
строгий
Броски
IllegalArgumentException если idx отрицательно или не меньше количества входных параметров модели; или если возникает ошибка при изменении размера ввода idx-го. Кроме того, ошибка возникает при попытке изменить размер тензора с фиксированными размерами, когда `strict` имеет значение True.

public abstract void resizeInput (int idx, int[] dims)

Изменяет размер ввода idx-го нативной модели до заданных размеров.

Параметры
IDX
тускнеет
Броски
IllegalArgumentException если idx отрицательно или не меньше количества входных параметров модели; или если возникает ошибка при изменении размера ввода idx-го.

public abstract void run (ввод объекта , вывод объекта )

Запускает вывод модели, если модель принимает только один вход и предоставляет только один выход.

Предупреждение: API более эффективен, если в качестве типа данных ввода/вывода используется Buffer (желательно прямой, но не обязательный). Пожалуйста, рассмотрите возможность использования Buffer для загрузки и извлечения примитивных данных для повышения производительности. Поддерживаются следующие конкретные типы Buffer :

  • ByteBuffer — совместим с любым базовым примитивным типом Tensor.
  • FloatBuffer — совместим с плавающими тензорами.
  • IntBuffer — совместим с тензорами int32.
  • LongBuffer — совместим с тензорами int64.
Обратите внимание, что логические типы поддерживаются только как массивы, а не Buffer или как скалярные входные данные.

Параметры
вход массив или многомерный массив или Buffer примитивных типов, включая int, float, long и byte. Buffer является предпочтительным способом передачи больших входных данных для примитивных типов, тогда как строковые типы требуют использования (многомерного) пути ввода массива. Когда используется Buffer , его содержимое должно оставаться неизменным до тех пор, пока не будет выполнен вывод модели, и вызывающая сторона должна убедиться, что Buffer находится в соответствующей позиции чтения. null значение допускается только в том случае, если вызывающий объект использует Delegate , который разрешает взаимодействие с дескриптором буфера, и такой буфер был привязан к входному Tensor .
выход многомерный массив выходных данных или Buffer примитивных типов, включая int, float, long и byte. Когда используется Buffer , вызывающая сторона должна убедиться, что для него установлена ​​соответствующая позиция записи. Нулевое значение разрешено и полезно в определенных случаях, например, если вызывающая сторона использует Delegate , который разрешает взаимодействие с дескриптором буфера, и такой буфер был привязан к выходному Tensor (см. также Interpreter.Options#setAllowBufferHandleOutput(boolean) ), или если граф имеет динамически сформированные выходные данные, и вызывающий объект должен запросить выходную форму Tensor после вызова вывода, извлекая данные непосредственно из выходного тензора (через Tensor.asReadOnlyBuffer() ).
Броски
IllegalArgumentException если input имеют значение null или пусты, или если при выполнении логического вывода возникает ошибка.
IllegalArgumentException (ЭКСПЕРИМЕНТАЛЬНО, возможны изменения), если вывод прерывается setCancelled(true) .

public abstract void runForMultipleInputsOutputs (входы Object[] , Map < Integer , Object > outputs)

Запускает вывод модели, если модель принимает несколько входных данных или возвращает несколько выходных данных.

Предупреждение: API более эффективен, если в качестве типов входных/выходных данных используются Buffer (предпочтительно прямые, но не обязательные). Пожалуйста, рассмотрите возможность использования Buffer для загрузки и извлечения примитивных данных для повышения производительности. Поддерживаются следующие конкретные типы Buffer :

  • ByteBuffer — совместим с любым базовым примитивным типом Tensor.
  • FloatBuffer — совместим с плавающими тензорами.
  • IntBuffer — совместим с тензорами int32.
  • LongBuffer — совместим с тензорами int64.
Обратите внимание, что логические типы поддерживаются только как массивы, а не Buffer или как скалярные входные данные.

Примечание. null значения для отдельных элементов inputs и outputs допускаются только в том случае, если вызывающая сторона использует Delegate , который разрешает взаимодействие с дескриптором буфера, и такой буфер был привязан к соответствующему входному или выходному Tensor (ам).

Параметры
входы массив входных данных. Входные данные должны быть в том же порядке, что и входные данные модели. Каждый вход может быть массивом или многомерным массивом или Buffer примитивных типов, включая int, float, long и byte. Buffer — предпочтительный способ передачи больших входных данных, тогда как строковые типы требуют использования входного пути (многомерного) массива. Когда используется Buffer , его содержимое должно оставаться неизменным до тех пор, пока не будет выполнен вывод модели, и вызывающая сторона должна убедиться, что Buffer находится в соответствующей позиции чтения.
выходы карта, отображающая выходные индексы в многомерные массивы выходных данных или Buffer примитивных типов, включая int, float, long и byte. Нужно только сохранить записи для используемых выходов. Когда используется Buffer , вызывающая сторона должна убедиться, что для него установлена ​​соответствующая позиция записи. Карта может быть пустой в случаях, когда либо дескрипторы буфера используются для выходных тензорных данных, либо в случаях, когда выходные данные имеют динамическую форму, и вызывающая сторона должна запрашивать выходную форму Tensor после вызова логического вывода, извлекая данные непосредственно из выходного тензора ( через Tensor.asReadOnlyBuffer() ).
Броски
IllegalArgumentException если inputs равны нулю или пусты, если outputs равны нулю или если при выполнении логического вывода возникает ошибка.