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, но это не гарантируется.

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

сорт ИнтерпретаторApi.Параметры Класс опций для управления поведением интерпретатора во время выполнения.

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

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

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

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

публичный абстрактный 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...

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

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

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

Освободите ресурсы, связанные с экземпляром 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 метода ownOrder(), который содержит байтовое содержимое модели.
параметры Набор опций для настройки поведения интерпретатора.
Броски
IllegalArgumentException если byteBuffer не является MappedByteBuffer и не является прямым ByteBuffer для ownOrder.

public Abstract int getInputIndex ( String opName)

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

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

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

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

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

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

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

общедоступный абстрактный Long getLastNativeInferenceDurationNano Seconds ()

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

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

public Abstract int getOutputIndex ( String opName)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

публичный абстрактный недействительный запуск (ввод объекта , вывод объекта )

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

Предупреждение. 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 > выходы)

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

Предупреждение. 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 имеют значение NULL или пусты, если outputs имеют значение NULL или если при выполнении вывода возникает ошибка.