TensorFlow Lite でモデル推論を駆動するドライバー クラス。
注: 以下の「実験的な」API 機能にアクセスする必要がない場合は、Interpreter を直接使用するのではなく、InterpreterApi と InterpreterFactory を使用することを好みます。
Interpreter
事前トレーニングされた TensorFlow Lite モデルをカプセル化し、モデル推論のために操作が実行されます。
たとえば、モデルが入力を 1 つだけ受け取り、出力を 1 つだけ返す場合:
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);
入力と出力の順序は、入力のデフォルトの形状と同様に、Toco を使用して TensorFlow モデルを TensorFlowLite モデルに変換するときに決定されます。
入力が (多次元) 配列として提供される場合、対応する入力テンソルはその配列の形状に従って暗黙的にサイズ変更されます。入力がBuffer
タイプとして提供される場合、暗黙的なサイズ変更は行われません。呼び出し元は、 Buffer
バイト サイズが対応するテンソルのバイト サイズと一致すること、または最初にresizeInput(int, int[])
によってテンソルのサイズを変更することを確認する必要があります。 Tensor の形状と型の情報はTensor
クラスを介して取得でき、 getInputTensor(int)
およびgetOutputTensor(int)
を介して利用できます。
警告: Interpreter
インスタンスはスレッドセーフではありません。 Interpreter
close()
を呼び出して明示的に解放する必要があるリソースを所有しています。
TFLite ライブラリは NDK API 19 に対して構築されています。19 未満の Android API レベルでも動作する可能性がありますが、保証されていません。
ネストされたクラス
クラス | インタプリタのオプション | ランタイムインタープリターの動作を制御するためのオプションクラス。 |
パブリックコンストラクター
パブリックメソッド
空所 | 割り当てTensor () 必要に応じて、すべてのテンソルの割り当てを明示的に更新します。 |
空所 | 近い() InterpreterApi インスタンスに関連付けられたリソースを解放します。 |
整数 | |
テンソル | getInputTensor (int inputIndex) 指定された入力インデックスに関連付けられた Tensor を取得します。 |
整数 | getInputTensorCount () 入力テンソルの数を取得します。 |
テンソル | getInputTensorFromSignature ( String inputName, String signalKey) 指定された入力名と署名メソッド名に関連付けられた Tensor を取得します。 |
長さ | getLastNativeInferenceDurationNano秒() ネイティブ推論タイミングを返します。 |
整数 | |
テンソル | getOutputTensor (int OutputIndex) 指定された出力インデックスに関連付けられた Tensor を取得します。 |
整数 | getOutputTensorCount () 出力テンソルの数を取得します。 |
テンソル | |
弦[] | |
弦[] | getSignatureKeys () モデルで使用可能な SignatureDef エクスポートされたメソッド名のリストを取得します。 |
弦[] | |
空所 | リセット変数テンソル() 詳細: すべての可変テンソルをデフォルト値にリセットします。 |
空所 | sizeInput (int idx、int[] dims、boolean strict) ネイティブ モデルの idx 番目の入力のサイズを指定された寸法に変更します。 |
空所 | sizeInput (int idx, int[] dims) ネイティブ モデルの idx 番目の入力のサイズを指定された寸法に変更します。 |
空所 | |
空所 | runForMultipleInputsOutputs ( Object[]入力、 Map < Integer 、 Object > 出力) モデルが複数の入力を受け取る場合、または複数の出力を返す場合、モデル推論を実行します。 |
空所 | runSignature ( Map < String , Object > 入力、 Map < String , Object > 出力) runSignature(Map, Map, String) と同じですが、モデルに 1 つの SignatureDef があると仮定すると、signatureKey を渡す必要はありません。 |
空所 | |
空所 | setCancelled (ブール値がキャンセルされました) 詳細: run(Object, Object) の呼び出しの途中で推論を中断します。 |
継承されたメソッド
パブリックコンストラクター
パブリックインタプリタ(ファイルモデルFile)
Interpreter
を初期化します。
パラメーター
モデルファイル | 事前トレーニングされた TF Lite モデルのファイル。 |
---|
投げる
IllegalArgumentException | modelFile 有効な TensorFlow Lite モデルをエンコードしていない場合。 |
---|
パブリックインタプリタ(ファイルモデルファイル、インタプリタ.オプションオプション)
Interpreter
を初期化し、インタプリタの動作をカスタマイズするためのオプションを指定します。
パラメーター
モデルファイル | 事前トレーニングされた TF Lite モデルのファイル |
---|---|
オプション | インタプリタの動作をカスタマイズするための一連のオプション |
投げる
IllegalArgumentException | modelFile 有効な TensorFlow Lite モデルをエンコードしていない場合。 |
---|
パブリックインタプリタ( ByteBuffer byteBuffer)
モデル ファイルのByteBuffer
を使用してInterpreter
を初期化します。
ByteBuffer は、 Interpreter
の構築後に変更しないでください。 ByteBuffer
、モデル ファイルをメモリ マップするMappedByteBuffer
、またはモデルのバイト コンテンツを含むnativeOrder() の直接ByteBuffer
のいずれかになります。
パラメーター
バイトバッファ |
---|
投げる
IllegalArgumentException | byteBuffer がMappedByteBuffer でも、nativeOrder の直接のByteBuffer でもない場合。 |
---|
パブリックインタプリタ( ByteBuffer byteBuffer、 Interpreter.Optionsオプション)
モデル ファイルのByteBuffer
とカスタムInterpreter.Options
のセットを使用してInterpreter
を初期化します。
ByteBuffer
Interpreter
の構築後に変更しないでください。 ByteBuffer
、モデル ファイルをメモリ マップするMappedByteBuffer
、またはモデルのバイト コンテンツを含むnativeOrder() の直接ByteBuffer
のいずれかになります。
パラメーター
バイトバッファ | |
---|---|
オプション |
投げる
IllegalArgumentException | byteBuffer がMappedByteBuffer でも、nativeOrder の直接のByteBuffer でもない場合。 |
---|
パブリックメソッド
public void assignTensors ()
必要に応じて、すべてのテンソルの割り当てを明示的に更新します。
これにより、指定された入力テンソル形状を使用して、依存テンソルの形状とメモリ割り当てが伝播されます。
注: この呼び出しは *純粋にオプション* です。入力テンソルのサイズが変更されている場合、テンソルの割り当ては実行中に自動的に行われます。この呼び出しは、グラフを実行する前に出力テンソルの形状を決定する場合に最も役立ちます (
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...
など)。注: 一部のグラフには動的に整形された出力があり、その場合、出力の整形は推論が実行されるまで完全に伝播しない可能性があります。
public void close ()
InterpreterApi
インスタンスに関連付けられたリソースを解放します。
public int getInputTensorCount ()
入力テンソルの数を取得します。
public Tensor getInputTensorFromSignature ( String inputName, String signalKey)
指定された入力名と署名メソッド名に関連付けられた Tensor を取得します。
警告: これは実験的な API であり、変更される可能性があります。
パラメーター
入力名 | 署名に名前を入力します。 |
---|---|
署名キー | SignatureDef を識別する署名キーは、モデルに署名が 1 つある場合は null にすることができます。 |
投げる
IllegalArgumentException | inputName またはsignatureKey null または空の場合、または無効な名前が指定された場合。 |
---|
public Tensor getOutputTensor (int OutputIndex)
指定された出力インデックスに関連付けられた Tensor を取得します。
注: 出力テンソルの詳細 (形状など) は、推論が実行されるまで完全に設定されない場合があります。推論を実行する「前」に更新された詳細が必要な場合 (出力テンソル形状が無効になる可能性がある入力テンソルのサイズ変更後など)、割り当てと形状伝播を明示的にトリガーするためにallocateTensors()
を使用します。入力 *値* に依存する出力形状を持つグラフの場合、出力形状は推論を実行するまで完全には決定されない可能性があることに注意してください。
パラメーター
出力インデックス |
---|
public int getOutputTensorCount ()
出力テンソルの数を取得します。
public Tensor getOutputTensorFromSignature ( String OutputName, String SignatureKey)
特定の署名メソッドで指定された出力名に関連付けられた Tensor を取得します。
注: 出力テンソルの詳細 (形状など) は、推論が実行されるまで完全に設定されない場合があります。推論を実行する「前」に更新された詳細が必要な場合 (出力テンソル形状が無効になる可能性がある入力テンソルのサイズ変更後など)、割り当てと形状伝播を明示的にトリガーするためにallocateTensors()
を使用します。入力 *値* に依存する出力形状を持つグラフの場合、出力形状は推論を実行するまで完全には決定されない可能性があることに注意してください。
警告: これは実験的な API であり、変更される可能性があります。
パラメーター
出力名 | 署名に名前を出力します。 |
---|---|
署名キー | SignatureDef を識別する署名キーは、モデルに署名が 1 つある場合は null にすることができます。 |
投げる
IllegalArgumentException | outputName またはsignatureKey が null または空の場合、または無効な名前が指定された場合。 |
---|
public String[] getSignatureInputs ( String signedKey)
メソッドsignatureKey
の SignatureDefs 入力のリストを取得します。
警告: これは実験的な API であり、変更される可能性があります。
パラメーター
署名キー |
---|
public String[] getSignatureKeys ()
モデルで使用可能な SignatureDef エクスポートされたメソッド名のリストを取得します。
警告: これは実験的な API であり、変更される可能性があります。
public String[] getSignatureOutputs ( String signedKey)
メソッドsignatureKey
の SignatureDefs 出力のリストを取得します。
警告: これは実験的な API であり、変更される可能性があります。
パラメーター
署名キー |
---|
public void replaceVariableTensors ()
詳細: すべての可変テンソルをデフォルト値にリセットします。
可変テンソルに関連付けられたバッファがない場合は、ゼロにリセットされます。
警告: これは実験的な API であり、変更される可能性があります。
public void SimplyInput (int idx, int[] dims, boolean strict)
ネイティブ モデルの idx 番目の入力のサイズを指定された寸法に変更します。
「strict」が True の場合、不明な次元のみサイズ変更できます。未知の次元は、`Tensor.shapeSignature()` によって返される配列内で `-1` として示されます。
パラメーター
いど | |
---|---|
薄暗くなります | |
厳しい |
public void SimplyInput (int idx, int[] dims)
ネイティブ モデルの idx 番目の入力のサイズを指定された寸法に変更します。
パラメーター
いど | |
---|---|
薄暗くなります |
public void run (オブジェクト入力、オブジェクト出力)
モデルが入力を 1 つだけ受け取り、出力を 1 つだけ提供する場合、モデル推論を実行します。
警告: 入力/出力データ型としてBuffer
(直接が望ましいが必須ではありません) を使用すると、API がより効率的になります。パフォーマンスを向上させるために、 Buffer
を使用してプリミティブ データをフィードおよびフェッチすることを検討してください。次の具体的なBuffer
タイプがサポートされています。
-
ByteBuffer
- 基礎となるプリミティブ Tensor 型と互換性があります。 -
FloatBuffer
- float Tensor と互換性があります。 -
IntBuffer
- int32 Tensor と互換性があります。 -
LongBuffer
- int64 Tensor と互換性があります。
Buffer
またはスカラー入力としてはサポートされないことに注意してください。 パラメーター
入力 | 配列または多次元配列、または int、float、long、byte などのプリミティブ型のBuffer 。プリミティブ型では大きな入力データを渡すにはBuffer 推奨される方法ですが、文字列型では (多次元) 配列入力パスを使用する必要があります。 Buffer が使用される場合、モデル推論が完了するまでその内容は変更されない必要があり、呼び出し元はBuffer 適切な読み取り位置にあることを確認する必要があります。 null 値は、呼び出し元がバッファ ハンドルの相互運用を許可するDelegate 使用しており、そのようなバッファが入力Tensor にバインドされている場合にのみ許可されます。 |
---|---|
出力 | 出力データの多次元配列、または int、float、long、byte などのプリミティブ型のBuffer 。 Buffer を使用する場合、呼び出し元はバッファが適切な書き込み位置に設定されていることを確認する必要があります。 null 値は許可されており、特定の場合に役立ちます。たとえば、呼び出し元がバッファ ハンドルの相互運用を許可するDelegate を使用しており、そのようなバッファが出力Tensor にバインドされている場合です ( Interpreter.Options#setAllowBufferHandleOutput(boolean) も参照) )、またはグラフに動的に整形された出力があり、呼び出し元が推論が呼び出された後に出力Tensor 形状をクエリする必要がある場合は、( Tensor.asReadOnlyBuffer() 経由で) 出力テンソルから直接データをフェッチします。 |
public void runForMultipleInputsOutputs ( Object[]入力、 Map < Integer 、 Object > 出力)
モデルが複数の入力を受け取る場合、または複数の出力を返す場合、モデル推論を実行します。
警告: API は、入出力データ型としてBuffer
(直接が望ましいが必須ではありません) を使用すると、より効率的になります。パフォーマンスを向上させるために、 Buffer
を使用してプリミティブ データをフィードおよびフェッチすることを検討してください。次の具体的なBuffer
タイプがサポートされています。
-
ByteBuffer
- 基礎となるプリミティブ Tensor 型と互換性があります。 -
FloatBuffer
- float Tensor と互換性があります。 -
IntBuffer
- int32 Tensor と互換性があります。 -
LongBuffer
- int64 Tensor と互換性があります。
Buffer
またはスカラー入力としてはサポートされないことに注意してください。注: inputs
およびoutputs
の個々の要素のnull
値は、呼び出し元がバッファ ハンドルの相互運用を許可するDelegate
使用しており、そのようなバッファが対応する入力または出力Tensor
にバインドされている場合にのみ許可されます。
パラメーター
入力 | 入力データの配列。入力はモデルの入力と同じ順序である必要があります。各入力は、配列または多次元配列、あるいは int、float、long、byte などのプリミティブ型のBuffer にすることができます。 Buffer 大きな入力データを渡すための推奨される方法ですが、文字列型では (多次元) 配列入力パスを使用する必要があります。 Buffer が使用される場合、モデル推論が完了するまでその内容は変更されない必要があり、呼び出し元はBuffer 適切な読み取り位置にあることを確認する必要があります。 |
---|---|
出力 | 出力インデックスを出力データの多次元配列、または int、float、long、byte などのプリミティブ型のBuffer にマッピングするマップ。使用する出力のエントリを保持するだけで済みます。 Buffer を使用する場合、呼び出し元はバッファが適切な書き込み位置に設定されていることを確認する必要があります。バッファ ハンドルが出力テンソル データに使用される場合、または出力が動的に整形され、呼び出し元が推論が呼び出された後に出力Tensor 形状をクエリし、出力テンソルから直接データを取得する必要がある場合、マップは空になる可能性があります ( Tensor.asReadOnlyBuffer() 経由)。 |
public void runSignature ( Map < String , Object > 入力、 Map < String , Object > 出力)
runSignature(Map, Map, String)
と同じですが、モデルに 1 つの SignatureDef があると仮定すると、signatureKey を渡す必要はありません。モデルに複数の SignatureDef がある場合、例外がスローされます。
警告: これは実験的な API であり、変更される可能性があります。
パラメーター
入力 | |
---|---|
出力 |
public void runSignature ( Map < String , Object > 入力、 Map < String , Object > 出力、 String SignatureKey)
signatureKey
を通じて提供される SignatureDef に基づいてモデル推論を実行します。
許可される入力および出力データ型の詳細については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 。 |
---|
投げる
IllegalStateException | インタプリタがキャンセル可能オプション (デフォルトではオフ) を使用して初期化されていない場合。 |
---|