使用 TensorFlow Lite 提升模型推論能力的驅動程式類別。
注意:如果您不需要任何「實驗功能」的存取權API 功能,建議使用 TranslateerApi 和 TranslateerFactory,不要直接使用 Translateer
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);
}
請注意,形狀 [] 和形狀 [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)
取得。
警告:Interpreter
執行個體並非執行緒安全。Interpreter
擁有透過叫用 close()
時「必須」明確釋出的資源
TFLite 程式庫是以 NDK API 19 為基礎建構而成。可能適用於低於 19 的 Android API 級別 但不保證一定如此
巢狀類別
類別 | Interpreter.Options | 用於控制執行階段解譯器行為的選項類別。 |
公用建構函式
公用方法
void |
allocateTensors()
視需要明確更新所有張量的配置。
|
void |
close()
釋出與
InterpreterApi 執行個體相關聯的資源。 |
攔截 | |
Tensor |
getInputTensor(int inputIndex)
取得與所提供輸入索引相關聯的 Tensor。
|
攔截 |
getInputTensorCount()
取得輸入張量。
|
Tensor | |
長 |
getLastNativeInferenceDurationNanoseconds()
傳回原生推論時間。
|
攔截 | |
Tensor |
getOutputTensor(int outputIndex)
取得與提供的輸出索引相關聯的 Tensor。
|
攔截 |
getOutputTensorCount()
取得輸出 Tensor 的數量。
|
Tensor | |
String[] | |
String[] |
getSignatureKeys()
取得模型中可用的 SignatureDef 匯出方法名稱清單。
|
String[] | |
void |
resetVariableTensors()
進階:將所有變數張量重設為預設值。
|
void |
resizeInput(int idx, int[] dims, boolean strict)
將原生模型輸入值的 idx 值調整為指定的亮度。
|
void |
resizeInput(int idx, int[] 調暗)
將原生模型輸入值的 idx 值調整為指定的亮度。
|
void | |
void | |
void |
runSignature(Map<String, Object> input, Map<String, Object> 輸出)
與
runSignature(Map, Map, String) 相同,但不必傳遞 SignatureKey。
我們會假設模型有一個 SignatureDef |
void | |
void |
setCancelled(取消布林值)
進階:在呼叫
run(Object, Object) 時中斷推論。 |
繼承的方法
公用建構函式
公開 翻譯工具 (檔案 modelFile)
初始化 Interpreter
。
參數
modelFile | 為預先訓練的 TF Lite 模型檔案。 |
---|
擲回
IllegalArgumentException | 如果 modelFile 未將有效的 TensorFlow Lite 編碼
模型
|
---|
公開 翻譯工具 (「File」modelFile、Interpreter.Options 選項)
初始化 Interpreter
並指定自訂解譯器行為的選項。
參數
modelFile | 為預先訓練的 TF Lite 模型檔案 |
---|---|
選項 | 一組自訂翻譯行為的選項 |
擲回
IllegalArgumentException | 如果 modelFile 未將有效的 TensorFlow Lite 編碼
模型
|
---|
公開 翻譯工具 (ByteBuffer byteBuffer)
使用模型檔案的 ByteBuffer
初始化 Interpreter
。
建構 Interpreter
後,請勿修改 ByteBuffer。
ByteBuffer
可以是記憶體對應模型檔案的 MappedByteBuffer
,也可以是
nativeOrder() 的直接 ByteBuffer
,其中包含模型的位元組內容。
參數
byteBuffer |
---|
擲回
IllegalArgumentException | 如果 byteBuffer 不是 MappedByteBuffer ,也不是
nativeOrder 的直接 ByteBuffer 。
|
---|
公開 翻譯工具 (ByteBuffer byteBuffer、Interpreter.Options 選項)
使用模型檔案的 ByteBuffer
和一組模型檔案,初始化 Interpreter
自訂 Interpreter.Options
。
建構 Interpreter
後,請不要修改 ByteBuffer
。ByteBuffer
可以是記憶體對映的 MappedByteBuffer
模型檔案,或包含位元組內容的 nativeOrder() 直接 ByteBuffer
模型
參數
byteBuffer | |
---|---|
選項 |
擲回
IllegalArgumentException | 如果 byteBuffer 不是 MappedByteBuffer ,也不是
nativeOrder 的直接 ByteBuffer 。
|
---|
公用方法
公開 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...
注意:部分圖形的輸出內容會動態形狀,在這種情況下,輸出內容形狀 直到推論執行完畢為止
公開 void 關閉 ()
釋出與 InterpreterApi
執行個體相關聯的資源。
公開 攔截 getInputTensorCount ()
取得輸入張量。
公開 Tensor getInputTensorFromSignature (字串 inputName、StringSignatureKey)
取得與所提供輸入名稱和簽章方法名稱相關聯的 Tensor。
警告:這是實驗性的 API,因此可能會有變動。
參數
inputName | 輸入簽名的名稱。 |
---|---|
signatureKey | 用於識別 SignatureDef 的簽名金鑰,如果模型有 就能建立同一筆簽名 |
擲回
IllegalArgumentException | 如果 inputName 或 signatureKey 為空值或空白,
或提供的名稱無效。
|
---|
公開 Tensor getOutputTensor (int outputIndex)
取得與提供的輸出索引相關聯的 Tensor。
注意:推斷後才能完整填入輸出張量詳細資料 (例如形狀)
新的執行個體如果您在執行推論「之前」必須「先」更新詳細資料 (例如,調整
輸入張量可能會使輸出張量失效),請使用 allocateTensors()
來
明確觸發配置和形狀傳播作業請注意,如果是具有輸出形狀的圖表,
才會完全決定輸出型態
執行推論
參數
outputIndex |
---|
公開 攔截 getOutputTensorCount ()
取得輸出 Tensor 的數量。
公開 Tensor getOutputTensorFromSignature (字串 outputName、StringsignKey)
取得與特定簽署方法中所提供輸出名稱相關聯的 Tensor。
注意:推斷後才能完整填入輸出張量詳細資料 (例如形狀)
新的執行個體如果您在執行推論「之前」必須「先」更新詳細資料 (例如,調整
輸入張量可能會使輸出張量失效),請使用 allocateTensors()
來
明確觸發配置和形狀傳播作業請注意,如果是具有輸出形狀的圖表,
才會完全決定輸出型態
執行推論
警告:這是實驗性的 API,因此可能會有變動。
參數
outputName | 簽名中的輸出名稱。 |
---|---|
signatureKey | 用於識別 SignatureDef 的簽名金鑰,如果模型有 就能建立同一筆簽名 |
擲回
IllegalArgumentException | 如果 outputName 或 signatureKey 為空值,或者
空白或提供的名稱無效。
|
---|
公開 String[] getSignatureInputs (字串SignatureKey)
取得方法 signatureKey
的 SignatureDefs 輸入內容清單。
警告:這是實驗性的 API,因此可能會有變動。
參數
signatureKey |
---|
公開 String[] getSignatureOutputs (字串SignatureKey)
取得方法 signatureKey
的 SignatureDefs 輸出內容清單。
警告:這是實驗性的 API,因此可能會有變動。
參數
signatureKey |
---|
公開 void resetVariableTensors ()
進階:將所有變數張量重設為預設值。
如果變數張量沒有相關聯的緩衝區,將重設為零。
警告:這是實驗性的 API,因此可能會有變動。
公開 void resizeInput (int idx, int[] 港式、布林嚴格)
將原生模型輸入值的 idx 值調整為指定的亮度。
當「strict」為 True 時,只能調整不明尺寸的大小。未知的維度為 在 `Tensor.shapeSignature()` 傳回的陣列中以 `-1` 表示。
參數
IDX | |
---|---|
調暗 | |
嚴格篩選 |
公開 void resizeInput (int idx, int[] 調暗螢幕)
將原生模型輸入值的 idx 值調整為指定的亮度。
參數
IDX | |
---|---|
調暗 |
公開 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() )。 |
公開 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() ) 擷取資料。 |
公開 void runSignature (地圖<字串, 物件> 輸入、地圖<字串、物件> 輸出)
與 runSignature(Map, Map, String)
相同,但不必傳遞 SignatureKey。
我們會假設模型有一個 SignatureDef如果模型有多個 SignatureDef 模型,
擲回例外狀況
警告:這是實驗性的 API,因此可能會有變動。
參數
輸入來源 | |
---|---|
輸出內容 |
公開 void runSignature (地圖<字串, 物件>輸入內容、對應<字串、物件> 輸出、字串signKey)
根據透過 signatureKey
提供的 SignatureDef 執行模型推論。
如要進一步瞭解允許的輸入和輸出,請參閱 run(Object, Object)
以及資料類型
警告:這是實驗性的 API,因此可能會有變動。
參數
輸入來源 | 將 SignatureDef 中的輸入名稱對應至輸入物件的對應。 |
---|---|
輸出內容 | 來自 SignatureDef 輸出名稱的對應,用於輸出資料。如果
呼叫端希望在推論後直接查詢 Tensor 資料 (例如
輸出形狀為動態,或使用輸出緩衝區控制代碼。 |
signatureKey | 可識別 SignatureDef 的簽名金鑰。 |
擲回
IllegalArgumentException | 如果 inputs 為空值或空白,如果 outputs 或
signatureKey 為空值,或是在執行推論時發生錯誤。
|
---|
公開 void setCancelled (已取消布林值)
進階:在呼叫 run(Object, Object)
時中斷推論。
呼叫這個函式時,取消旗標會設為 true。翻譯人員
檢查運算叫用之間的旗標,如果是 true
,翻譯器就會停止
解譯器會維持取消狀態,直到明確「未取消」為止依
setCancelled(false)
。
警告:這是實驗性的 API,因此可能會有變動。
參數
已取消 | true 會盡可能取消推論;false 至
繼續播放。 |
---|
擲回
IllegalStateException | 如果解譯器未使用 cancellable 初始化 選項,此選項預設為關閉。 |
---|