Класс драйвера для вывода модели с помощью TensorFlow Lite.
Примечание. Если вам не нужен доступ ни к одной из «экспериментальных» функций API, указанных ниже, лучше использовать InterpreterApi и InterpreterFactory, а не использовать Interpreter напрямую.
Interpreter
инкапсулирует предварительно обученную модель TensorFlow Lite, в которой выполняются операции для вывода модели.
Например, если модель принимает только один вход и возвращает только один результат:
try (Interpreter interpreter = new Interpreter(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 (Interpreter interpreter = new Interpreter(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 (Interpreter interpreter = new Interpreter(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)
.
ПРЕДУПРЕЖДЕНИЕ. Экземпляры Interpreter
не являются потокобезопасными. Interpreter
владеет ресурсами, которые должны быть явно освобождены вызовом функции close()
Библиотека TFLite построена для NDK API 19. Она может работать для уровней Android API ниже 19, но это не гарантируется.
Вложенные классы
сорт | Интерпретатор.Опции | Класс параметров для управления поведением интерпретатора времени выполнения. |
Публичные конструкторы
Интерпретатор ( File modelFile, параметры Interpreter.Options ) Инициализирует Interpreter и задает параметры для настройки поведения интерпретатора. | |
Интерпретатор ( ByteBuffer byteBuffer) Инициализирует Interpreter с помощью ByteBuffer файла модели. | |
Интерпретатор (параметры ByteBuffer byteBuffer, Interpreter.Options ) Инициализирует Interpreter с помощью ByteBuffer файла модели и набора пользовательских Interpreter.Options . |
Публичные методы
пустота | выделитьтензоры () При необходимости явно обновляет распределения для всех тензоров. |
пустота | закрыть () Освободите ресурсы, связанные с экземпляром InterpreterApi . |
инт | |
Тензор | getInputTensor (int inputIndex) Получает тензор, связанный с предоставленным входным индексом. |
инт | получитьInputTensorCount () Получает количество входных тензоров. |
Тензор | getInputTensorFromSignature ( String inputName, String signalKey) Получает Tensor, связанный с предоставленным входным именем и именем метода подписи. |
Длинный | getLastNativeInferenceDurationNanoseconds () Возвращает собственное время вывода. |
инт | |
Тензор | getOutputTensor (int outputIndex) Получает тензор, связанный с предоставленным выходным индексом. |
инт | получитьOutputTensorCount () Получает количество выходных тензоров. |
Тензор | getOutputTensorFromSignature ( String outputName, String signalKey) Получает тензор, связанный с предоставленным выходным именем в конкретном методе подписи. |
Нить[] | getSignatureInputs ( String signalKey) Получает список входных данных SignatureDefs для метода signatureKey . |
Нить[] | получить ключи подписи () Получает список имен экспортированных методов SignatureDef, доступных в модели. |
Нить[] | getSignatureOutputs ( String signalKey) Получает список выходных данных SignatureDefs для метода signatureKey . |
пустота | resetVariableTensors () Дополнительно: сбрасывает все переменные тензоры к значениям по умолчанию. |
пустота | resizeInput (int idx, int[] dims, логический строгий) Изменяет размер ввода idx-го нативной модели до заданных размеров. |
пустота | resizeInput (int idx, int[] dims) Изменяет размер ввода idx-го нативной модели до заданных размеров. |
пустота | |
пустота | runForMultipleInputsOutputs (входы Object[] , Map < Integer , Object >выходы) Запускает вывод модели, если модель принимает несколько входных данных или возвращает несколько выходных данных. |
пустота | runSignature ( Map < String , Object > входы, Map < String , Object > выходы) То же, что и runSignature(Map, Map, String) , но не требует передачи signalKey, при условии, что модель имеет один SignatureDef. |
пустота | |
пустота | setCancelled (логическое значение отменено) Дополнительно: Прерывает вывод в середине вызова run(Object, Object) . |
Унаследованные методы
Публичные конструкторы
публичный интерпретатор ( File modelFile )
Инициализирует Interpreter
.
Параметры
файл модели | Файл предварительно обученной модели TF Lite. |
---|
Броски
IllegalArgumentException | если modelFile не кодирует допустимую модель TensorFlow Lite. |
---|
общедоступный интерпретатор ( File modelFile, параметры Interpreter.Options )
Инициализирует Interpreter
и задает параметры для настройки поведения интерпретатора.
Параметры
файл модели | файл предварительно обученной модели TF Lite |
---|---|
параметры | набор опций для настройки поведения интерпретатора |
Броски
IllegalArgumentException | если modelFile не кодирует допустимую модель TensorFlow Lite. |
---|
публичный интерпретатор ( ByteBuffer byteBuffer)
Инициализирует Interpreter
с помощью ByteBuffer
файла модели.
ByteBuffer не должен изменяться после построения Interpreter
. ByteBuffer
может быть либо MappedByteBuffer
, отображающим в памяти файл модели, либо прямым ByteBuffer
функции nativeOrder(), который содержит байтовое содержимое модели.
Параметры
байтбуфер |
---|
Броски
IllegalArgumentException | если byteBuffer не является ни MappedByteBuffer , ни прямым ByteBuffer для nativeOrder. |
---|
общедоступный интерпретатор (параметры ByteBuffer byteBuffer, Interpreter.Options )
Инициализирует Interpreter
с помощью ByteBuffer
файла модели и набора пользовательских Interpreter.Options
.
ByteBuffer
не должен изменяться после построения Interpreter
. ByteBuffer
может быть либо MappedByteBuffer
, отображающим в памяти файл модели, либо прямым ByteBuffer
функции nativeOrder(), который содержит байтовое содержимое модели.
Параметры
байтбуфер | |
---|---|
параметры |
Броски
IllegalArgumentException | если byteBuffer не является ни MappedByteBuffer , ни прямым ByteBuffer для nativeOrder. |
---|
Публичные методы
public 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 int getInputIndex ( String opName)
Получает индекс ввода с учетом имени операции ввода.
Параметры
opName |
---|
открытый тензор getInputTensor (int inputIndex)
Получает тензор, связанный с предоставленным входным индексом.
Параметры
входИндекс |
---|
публичный интервал getInputTensorCount ()
Получает количество входных тензоров.
публичный тензор getInputTensorFromSignature ( String inputName, String signalKey)
Получает Tensor, связанный с предоставленным входным именем и именем метода подписи.
ПРЕДУПРЕЖДЕНИЕ. Это экспериментальный API, который может быть изменен.
Параметры
inputName | Введите имя в подпись. |
---|---|
подписьКлюч | Ключ подписи, идентифицирующий SignatureDef, может быть нулевым, если модель имеет одну подпись. |
Броски
IllegalArgumentException | если inputName или signatureKey имеет значение null или пусто, или указано недопустимое имя. |
---|
public int getOutputIndex ( String opName)
Получает индекс вывода по заданному имени операции вывода.
Параметры
opName |
---|
открытый тензор getOutputTensor (int outputIndex)
Получает тензор, связанный с предоставленным выходным индексом.
Примечание. Детали выходного тензора (например, форма) не могут быть полностью заполнены до тех пор, пока не будет выполнен вывод. Если вам нужны обновленные данные *перед* выполнением вывода (например, после изменения размера входного тензора, что может сделать недействительными формы выходного тензора), используйте allocateTensors()
для явного запуска распределения и распространения формы. Обратите внимание, что для графиков с выходными формами, которые зависят от входных *значений*, выходная форма может быть не полностью определена до выполнения логического вывода.
Параметры
выходной индекс |
---|
публичный интервал getOutputTensorCount ()
Получает количество выходных тензоров.
публичный тензор getOutputTensorFromSignature ( String outputName, String signalKey)
Получает тензор, связанный с предоставленным выходным именем в конкретном методе подписи.
Примечание. Детали выходного тензора (например, форма) не могут быть полностью заполнены до тех пор, пока не будет выполнен вывод. Если вам нужны обновленные данные *перед* выполнением вывода (например, после изменения размера входного тензора, что может сделать недействительными формы выходного тензора), используйте allocateTensors()
для явного запуска распределения и распространения формы. Обратите внимание, что для графиков с выходными формами, которые зависят от входных *значений*, выходная форма может быть не полностью определена до выполнения логического вывода.
ПРЕДУПРЕЖДЕНИЕ. Это экспериментальный API, который может быть изменен.
Параметры
выходное имя | Вывести имя в подпись. |
---|---|
подписьКлюч | Ключ подписи, идентифицирующий SignatureDef, может быть нулевым, если модель имеет одну подпись. |
Броски
IllegalArgumentException | если outputName или signatureKey равно null или пусто, либо указано недопустимое имя. |
---|
public String[] getSignatureInputs ( String signalKey)
Получает список входных данных SignatureDefs для метода signatureKey
.
ПРЕДУПРЕЖДЕНИЕ. Это экспериментальный API, который может быть изменен.
Параметры
подписьКлюч |
---|
общедоступная строка [] getSignatureKeys ()
Получает список имен экспортированных методов SignatureDef, доступных в модели.
ПРЕДУПРЕЖДЕНИЕ. Это экспериментальный API, который может быть изменен.
public String[] getSignatureOutputs ( String signalKey)
Получает список выходных данных SignatureDefs для метода signatureKey
.
ПРЕДУПРЕЖДЕНИЕ. Это экспериментальный API, который может быть изменен.
Параметры
подписьКлюч |
---|
public void resetVariableTensors ()
Дополнительно: сбрасывает все переменные тензоры к значениям по умолчанию.
Если переменный тензор не имеет связанного буфера, он будет сброшен до нуля.
ПРЕДУПРЕЖДЕНИЕ. Это экспериментальный API, который может быть изменен.
public void resizeInput (int idx, int[] dims, boolean strict)
Изменяет размер ввода idx-го нативной модели до заданных размеров.
Когда `strict` равно True, можно изменять только неизвестные размеры. Неизвестные размеры обозначаются как `-1` в массиве, возвращаемом `Tensor.shapeSignature()`.
Параметры
IDX | |
---|---|
тускнеет | |
строгий |
public void resizeInput (int idx, int[] dims)
Изменяет размер ввода idx-го нативной модели до заданных размеров.
Параметры
IDX | |
---|---|
тускнеет |
public 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() ). |
public 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() ). |
public void runSignature ( Map < String , Object > входы, Map < String , Object > выходы)
То же, что и runSignature(Map, Map, String)
, но не требует передачи signalKey, при условии, что модель имеет один SignatureDef. Если модель имеет более одного SignatureDef, она вызовет исключение.
ПРЕДУПРЕЖДЕНИЕ. Это экспериментальный API, который может быть изменен.
Параметры
входы | |
---|---|
выходы |
public void runSignature ( Map < String , Object > inputs, Map < String , Object > outputs, String signalKey)
Запускает вывод модели на основе SignatureDef, предоставленного через signatureKey
.
См. run(Object, Object)
для получения дополнительной информации о разрешенных типах входных и выходных данных.
ПРЕДУПРЕЖДЕНИЕ. Это экспериментальный API, который может быть изменен.
Параметры
входы | Сопоставление входного имени в SignatureDef с входным объектом. |
---|---|
выходы | Сопоставление выходного имени в SignatureDef с выходными данными. Это может быть пустым, если вызывающий хочет запросить данные Tensor непосредственно после вывода (например, если выходная форма является динамической или используются дескрипторы выходного буфера). |
подписьКлюч | Ключ подписи, идентифицирующий SignatureDef. |
Броски
IllegalArgumentException | если inputs имеют значение null или пусты, если outputs или signatureKey имеют значение null или если при выполнении логического вывода возникает ошибка. |
---|
public void setCancelled (логическое значение отменено)
Дополнительно: Прерывает вывод в середине вызова run(Object, Object)
.
Флаг отмены будет установлен в значение true при вызове этой функции. Интерпретатор будет проверять флаг между вызовами Op и, если он равен true
, интерпретатор остановит выполнение. Интерпретатор останется в отмененном состоянии до тех пор, пока явно не будет «отменен» с помощью setCancelled(false)
.
ПРЕДУПРЕЖДЕНИЕ. Это экспериментальный API, который может быть изменен.
Параметры
отменен | true для отмены логического вывода наилучшим образом; false , чтобы возобновить. |
---|
Броски
Илегалстатеексцептион | если интерпретатор не инициализирован с возможностью отмены, которая по умолчанию отключена. |
---|