已知的間接子類別 |
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 | |
靜態 InterpreterApi | |
抽象 攔截 | |
抽象 Tensor |
getInputTensor(int inputIndex)
取得與所提供輸入索引相關聯的 Tensor。
|
抽象 攔截 |
getInputTensorCount()
取得輸入張量。
|
抽象 長 |
getLastNativeInferenceDurationNanoseconds()
傳回原生推論時間。
|
抽象 攔截 | |
抽象 Tensor |
getOutputTensor(int outputIndex)
取得與提供的輸出索引相關聯的 Tensor。
|
抽象 攔截 |
getOutputTensorCount()
取得輸出 Tensor 的數量。
|
抽象 void |
resizeInput(int idx, int[] dims, boolean strict)
將原生模型輸入值的 idx 值調整為指定的亮度。
|
抽象 void |
resizeInput(int idx, int[] 調暗)
將原生模型輸入值的 idx 值調整為指定的亮度。
|
抽象 void | |
抽象 void |
繼承的方法
公用方法
公開 抽象 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)
公開 抽象 Tensor getInputTensor (int inputIndex)
公開 抽象 攔截 getInputTensorCount ()
取得輸入張量。
公開 抽象 長 getLastNativeInferenceDurationNanoseconds ()
傳回原生推論時間。
擲回
IllegalArgumentException | 表示模型未經過解譯器初始化 |
---|
公開 抽象 攔截 getOutputIndex (字串 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
或純量輸入。
注意:inputs
和 outputs
個別元素的 null
值是
只有在呼叫端使用允許緩衝區處理互通性的 Delegate
時,才會允許這個情況;且
這類緩衝區已繫結至對應的輸入或輸出 Tensor
。
參數
輸入來源 | 輸入資料陣列。輸入內容的順序應與
模型每項輸入可以是陣列或多維陣列,也可以是 Buffer
基本型別,包括 int、float、long 和 byte。建議將路線設為 Buffer
傳遞大型輸入資料,但字串類型需要使用 (多維度) 陣列
輸入路徑使用 Buffer 時,在模型前,其內容應維持不變
且呼叫端必須確保 Buffer 處於適當狀態,
讀取位置。 |
---|---|
輸出內容 | 對應輸出索引與輸出資料的多維陣列,或原始類型的 Buffer ,包括 int、浮點值、長型和位元組。這麼一來
項目。使用 Buffer 時,呼叫端必須確保
即可設定適當的寫入位置在下列情況中,地圖可能會空白
緩衝區控制代碼用於輸出張量資料,或將輸出內容動態產生
形狀,而呼叫端必須在推論後查詢 Tensor 形狀
即可直接從輸出張量 (透過 Tensor.asReadOnlyBuffer() ) 擷取資料。 |
擲回
IllegalArgumentException | 如果 inputs 為空值或空白,且 outputs 為空值
空值,或是在執行推論時發生錯誤。
|
---|