使用 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 初始化 選項,此選項預設為關閉。 | 
|---|