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);
 }
 

請注意,形狀 [] 和形狀 [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 時,系統會決定輸入和輸出的順序 和輸入內容的預設形狀一樣

如果以 (多維度) 陣列提供輸入內容,相應的輸入張量 會根據該陣列的形狀,以隱含方式調整大小。如果以 Buffer 類型的形式提供輸入內容,就不會進行隱式調整大小;呼叫端必須確認 Buffer 位元組大小與對應張量相符,或優先考慮 透過 resizeInput(int, int[]) 調整張量。Tensor 形狀和類型資訊的 透過 Tensor 類別取得,可透過 getInputTensor(int)getOutputTensor(int) 取得。

警告:InterpreterApi 執行個體並非執行緒安全。

警告:InterpreterApi 執行個體擁有的資源必須 已明確釋出 close()

TFLite 程式庫是以 NDK API 19 為基礎建構而成。可能適用於低於 19 的 Android API 級別 但不保證一定如此

巢狀類別

類別 InterpreterApi.Options 用於控制執行階段解譯器行為的選項類別。

公用方法

抽象 void
allocateTensors()
視需要明確更新所有張量的配置。
抽象 void
close()
釋出與 InterpreterApi 執行個體相關聯的資源。
靜態 InterpreterApi
create(「File」 modelFile、「digerApi.Options」InterpreterApi.Options選項)
使用指定的模型和選項建構 InterpreterApi 例項。
靜態 InterpreterApi
create(ByteBuffer byteBuffer、InterpreterApi.Options 選項)
使用指定的模型和選項建構 InterpreterApi 例項。
抽象 攔截
getInputIndex(String opName)
根據輸入的運算名稱取得輸入的索引。
抽象 Tensor
getInputTensor(int inputIndex)
取得與所提供輸入索引相關聯的 Tensor。
抽象 攔截
getInputTensorCount()
取得輸入張量。
抽象
getLastNativeInferenceDurationNanoseconds()
傳回原生推論時間。
抽象 攔截
getOutputIndex(String opName)
根據輸出的運算名稱取得輸出索引。
抽象 Tensor
getOutputTensor(int outputIndex)
取得與提供的輸出索引相關聯的 Tensor。
抽象 攔截
getOutputTensorCount()
取得輸出 Tensor 的數量。
抽象 void
resizeInput(int idx, int[] dims, boolean strict)
將原生模型輸入值的 idx 值調整為指定的亮度。
抽象 void
resizeInput(int idx, int[] 調暗)
將原生模型輸入值的 idx 值調整為指定的亮度。
抽象 void
run(物件輸入內容、物件輸出)
如果模型僅接受一項輸入內容,則執行模型推論,且僅提供一項輸出內容。
抽象 void
runForMultipleInputsOutputs(Object[] 輸入, Map<IntegerObject> 輸出)
如果模型有多項輸入內容,或傳回多項輸出內容,就會執行模型推論。

繼承的方法

公用方法

公開 抽象 void allocateTensors ()

視需要明確更新所有張量的配置。

這會使用輸入值傳播相依張量的形狀和記憶體配置 張量形狀。

注意:這個通話 *完全可以自行選擇是否參加*。Tensor 分配作業會在 (如果任何輸入張量已調整大小,就會執行此動作)。這個呼叫最適合用來判斷 在執行圖形之前任何輸出張量的形狀,例如

 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 無法成功分配圖中的張量

公開 抽象 void 關閉 ()

釋出與 InterpreterApi 執行個體相關聯的資源。

公開 靜態 InterpreterApi 建立 (檔案 modelFile、InterpreterApi.Options 選項)

使用指定的模型和選項建構 InterpreterApi 例項。模型 會從檔案載入。

參數
modelFile 包含預先訓練的 TF Lite 模型的檔案。
選項 一組自訂翻譯行為的選項。
擲回
IllegalArgumentException 如果 modelFile 未將有效的 TensorFlow Lite 編碼 模型

公開 靜態 InterpreterApi 建立 (ByteBuffer byteBuffer、InterpreterApi.Options 選項)

使用指定的模型和選項建構 InterpreterApi 例項。模型 將從 ByteBuffer 中讀取。

參數
byteBuffer 採用二進位序列化格式的預先訓練 TF Lite 模型。ByteBuffer 應該 建構 InterpreterApi 執行個體之後,不得修改。ByteBuffer 可以是記憶體對應模型檔案的 MappedByteBuffer,也可以是 nativeOrder() 的直接 ByteBuffer,其中包含模型的位元組內容。
選項 一組自訂翻譯行為的選項。
擲回
IllegalArgumentException 如果 byteBuffer 不是 MappedByteBuffer,也不是 nativeOrder 的直接 ByteBuffer

公開 抽象 攔截 getInputIndex (字串 opName)

根據輸入的運算名稱取得輸入的索引。

參數
opName
擲回
IllegalArgumentException 表示 opName 不符合所用模型中的任何輸入內容 初始化解譯器。

公開 抽象 Tensor getInputTensor (int inputIndex)

取得與所提供輸入索引相關聯的 Tensor。

參數
inputIndex
擲回
IllegalArgumentException 如果 inputIndex 為負值或小於 模型輸入量

公開 抽象 攔截 getInputTensorCount ()

取得輸入張量。

公開 抽象 getLastNativeInferenceDurationNanoseconds ()

傳回原生推論時間。

擲回
IllegalArgumentException 表示模型未經過解譯器初始化

公開 抽象 攔截 getOutputIndex (字串 opName)

根據輸出的運算名稱取得輸出索引。

參數
opName
擲回
IllegalArgumentException 如果 opName 不符合所用模型中的任何輸出內容 初始化解譯器。

公開 抽象 Tensor getOutputTensor (int outputIndex)

取得與提供的輸出索引相關聯的 Tensor。

注意:推斷後才能完整填入輸出張量詳細資料 (例如形狀) 新的執行個體如果您在執行推論「之前」必須「先」更新詳細資料 (例如,調整 輸入張量可能會使輸出張量失效),請使用 allocateTensors() 來 明確觸發配置和形狀傳播作業請注意,如果是具有輸出形狀的圖表, 才會完全決定輸出型態 執行推論

參數
outputIndex
擲回
IllegalArgumentException 如果 outputIndex 為負值或小於 輸出模型

公開 抽象 攔截 getOutputTensorCount ()

取得輸出 Tensor 的數量。

公開 抽象 void resizeInput (int idx, int[] 港式、布林嚴格)

將原生模型輸入值的 idx 值調整為指定的亮度。

當「strict」為 True 時,只能調整不明尺寸的大小。未知的維度為 在 `Tensor.shapeSignature()` 傳回的陣列中以 `-1` 表示。

參數
IDX
調暗
嚴格篩選
擲回
IllegalArgumentException 如果 idx 為負數或小於數字 模型輸入內容調整 idx-th 輸入大小時發生錯誤。此外, 當 `strict` 為 True 時,嘗試以固定尺寸調整張量時,就會發生這個情況。

公開 抽象 void resizeInput (int idx, int[] 調暗螢幕)

將原生模型輸入值的 idx 值調整為指定的亮度。

參數
IDX
調暗
擲回
IllegalArgumentException 如果 idx 為負數或小於數字 模型輸入內容調整 idx-th 輸入大小時發生錯誤。

公開 抽象 void run (「物件」輸入、物件輸出)

如果模型僅接受一項輸入內容,則執行模型推論,且僅提供一項輸出內容。

警告:如果 Buffer (最好直接,但並非必要),則 API 效率會更高 做為輸入/輸出資料類型請考慮使用「Buffer」動態饋給及擷取 原始資料。以下是具體的 Buffer 類型 支援:

  • ByteBuffer - 與任何基礎基本 Tensor 類型相容。
  • FloatBuffer - 與浮點張量相容。
  • IntBuffer - 與 int32 Tensor 相容。
  • LongBuffer - 與 int64 Tensor 相容。
,瞭解如何調查及移除這項存取權。 請注意,布林類型可以當做陣列,不支援 Buffer 或純量輸入。

參數
輸入 陣列或多維陣列,或原始類型的 Buffer 包括 int、float、long 和 byteBuffer這是傳送大型文件的偏好方法 適用於原始類型的輸入資料,但字串型別需要使用 (多維度) 陣列輸入路徑使用 Buffer 時,其內容會維持不變,直到 整個模型推論完畢,而呼叫端必須確保 Buffer 位於 適當的閱讀位置只有在呼叫端使用 null 的情況下, Delegate,允許緩衝區處理互通性,且這類緩衝區已繫結至 輸入 Tensor
output 輸出資料的多維度陣列,或原始類型的 Buffer 包括 int、float、long 和 byte使用 Buffer 時,呼叫端必須確保 即可設定適當的寫入位置允許空值;適用於 在某些情況下,例如呼叫端使用允許緩衝區控制的 Delegate 時 互通性,且這類緩衝區已繫結至輸出 Tensor (另請參閱 Interpreter.Options#setAllowBufferHandleOutput(boolean)), 或者如果圖形有動態形狀的輸出內容,且呼叫端必須在推論叫用後查詢輸出 Tensor 形狀,以便直接從輸出結果擷取資料 Tensoror (透過 Tensor.asReadOnlyBuffer())。
擲回
IllegalArgumentException 如果 input 為空值或空白,或是在發生錯誤情形發生時 執行推論
IllegalArgumentException (實驗性質,隨時可能變更) 如果推論是 受到「setCancelled(true)」中斷。

公開 抽象 void runForMultipleInputsOutputs (Object[] 輸入、Map<Integer物件> 輸出)

如果模型有多項輸入內容,或傳回多項輸出內容,就會執行模型推論。

警告:如果 Buffer (最好直接,但並非必要),則 API 的效率會更高 做為輸入/輸出資料類型請考慮使用「Buffer」動態饋給及擷取 原始資料。以下是具體的 Buffer 類型 支援:

  • ByteBuffer - 與任何基礎基本 Tensor 類型相容。
  • FloatBuffer - 與浮點張量相容。
  • IntBuffer - 與 int32 Tensor 相容。
  • LongBuffer - 與 int64 Tensor 相容。
,瞭解如何調查及移除這項存取權。 請注意,布林類型可以當做陣列,不支援 Buffer 或純量輸入。

注意:inputsoutputs 個別元素的 null 值是 只有在呼叫端使用允許緩衝區處理互通性的 Delegate 時,才會允許這個情況;且 這類緩衝區已繫結至對應的輸入或輸出 Tensor

參數
輸入來源 輸入資料陣列。輸入內容的順序應與 模型每項輸入可以是陣列或多維陣列,也可以是 Buffer 基本型別,包括 int、float、long 和 byte。建議將路線設為 Buffer 傳遞大型輸入資料,但字串類型需要使用 (多維度) 陣列 輸入路徑使用 Buffer 時,在模型前,其內容應維持不變 且呼叫端必須確保 Buffer 處於適當狀態, 讀取位置。
輸出內容 對應輸出索引與輸出資料的多維陣列,或原始類型的 Buffer,包括 int、浮點值、長型和位元組。這麼一來 項目。使用 Buffer 時,呼叫端必須確保 即可設定適當的寫入位置在下列情況中,地圖可能會空白 緩衝區控制代碼用於輸出張量資料,或將輸出內容動態產生 形狀,而呼叫端必須在推論後查詢 Tensor 形狀 即可直接從輸出張量 (透過 Tensor.asReadOnlyBuffer()) 擷取資料。
擲回
IllegalArgumentException 如果 inputs 為空值或空白,且 outputs 為空值 空值,或是在執行推論時發生錯誤。