Nënklasa indirekte të njohura |
Ndërfaqja me interpretuesin e modelit TensorFlow Lite, duke përjashtuar metodat eksperimentale.
Një shembull InterpreterApi
përmbledh një model TensorFlow Lite të trajnuar paraprakisht, në të cilin operacionet ekzekutohen për përfundimin e modelit.
Për shembull, nëse një model merr vetëm një hyrje dhe kthen vetëm një dalje:
try (InterpreterApi interpreter =
new InterpreterApi.create(file_of_a_tensorflowlite_model)) {
interpreter.run(input, output);
}
Nëse një model merr shumë hyrje ose dalje:
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);
}
Nëse një model merr ose prodhon tensorë vargu:
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);
}
Vini re se ka një dallim midis formës [] dhe formës[1]. Për daljet skalare të tenzorit të vargut:
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);
Rendit e hyrjeve dhe daljeve përcaktohen kur konvertohet modeli TensorFlow në model TensorFlowLite me Toco, siç janë format e paracaktuara të hyrjeve.
Kur hyrjet ofrohen si vargje (shumë-dimensionale), tensori(t) përkatëse hyrëse do të ndryshohet në mënyrë implicite sipas formës së atij grupi. Kur inputet ofrohen si lloje Buffer
, nuk bëhet asnjë ndryshim i nënkuptuar i madhësisë; thirrësi duhet të sigurojë që madhësia e bajtit Buffer
ose të përputhet me atë të tensorit përkatës, ose që së pari të ndryshojë madhësinë e tensorit nëpërmjet resizeInput(int, int[])
. Informacioni për formën dhe llojin e tensorit mund të merret nëpërmjet klasës Tensor
, e disponueshme nëpërmjet getInputTensor(int)
dhe getOutputTensor(int)
.
PARALAJMËRIM: Instancat InterpreterApi
nuk janë të sigurta për temat.
PARALAJMËRIM: Një shembull InterpreterApi
zotëron burime që duhet të lirohen në mënyrë eksplicite duke thirrur close()
Biblioteka TFLite është ndërtuar kundër NDK API 19. Mund të funksionojë për nivelet e API të Android nën 19, por nuk është e garantuar.
Klasat e mbivendosura
klasës | InterpreterApi.Opsionet | Një klasë opsionesh për kontrollin e sjelljes së interpretuesit në kohën e ekzekutimit. |
Metodat publike
zbrazëti abstrakte | allocateTensors () Përditëson në mënyrë të qartë alokimet për të gjithë tensorët, nëse është e nevojshme. |
zbrazëti abstrakte | mbyll () Lëshoni burime të lidhura me shembullin InterpreterApi . |
InterpreterApi statike | krijo ( File modelFile, InterpreterApi.Options opsionet) Ndërton një shembull InterpreterApi , duke përdorur modelin dhe opsionet e specifikuara. |
InterpreterApi statike | krijo (Opsionet e ByteBuffer byteBuffer, InterpreterApi.Options ) Ndërton një shembull InterpreterApi , duke përdorur modelin dhe opsionet e specifikuara. |
abstrakte int | getInputIndex (OpEmri i vargut ) Merr indeksin e një hyrjeje duke pasur parasysh emrin op të hyrjes. |
Tensor abstrakt | getInputTensor (int inputIndex) Merr tensorin të lidhur me indeksin e dhënë të hyrjes. |
abstrakte int | getInputTensorCount () Merr numrin e tensorëve të hyrjes. |
abstrakt i gjatë | getLastNativeInferenceDurationNanosekonda () Rikthen kohën e konkluzionit origjinal. |
abstrakte int | getOutputIndex (Opname i vargut ) Merr indeksin e një prodhimi duke pasur parasysh emrin op të prodhimit. |
Tensor abstrakt | getOutputTensor (int outputIndex) Merr tensorin të lidhur me indeksin e dhënë të daljes. |
abstrakte int | getOutputTensorCount () Merr numrin e tensorëve në dalje. |
zbrazëti abstrakte | resizeInput (int idx, int[] dims, boolean strikte) Ndryshon madhësinë e hyrjes idx-të të modelit vendas në dims të dhëna. |
zbrazëti abstrakte | resizeInput (int idx, int[] dims) Ndryshon madhësinë e hyrjes idx-të të modelit vendas në dims të dhëna. |
zbrazëti abstrakte | ekzekutim (Hyrja e objektit , dalja e objektit ) Ekzekuton konkluzionet e modelit nëse modeli merr vetëm një hyrje dhe siguron vetëm një dalje. |
zbrazëti abstrakte | runForMultipleInputsOutputs ( hyrjet e objektit[] , Harta < Integer , Object > daljet) Ekzekuton konkluzionet e modelit nëse modeli merr hyrje të shumta, ose kthen dalje të shumta. |
Metodat e trashëguara
Metodat publike
abstrakt publik void allocateTensors ()
Përditëson në mënyrë të qartë alokimet për të gjithë tensorët, nëse është e nevojshme.
Kjo do të përhapë forma dhe alokime të memories për tensorët e varur duke përdorur formën(at) e tensorit hyrës siç është dhënë.
Shënim: Kjo thirrje është *thjesht fakultative*. Shpërndarja e tensorit do të ndodhë automatikisht gjatë ekzekutimit nëse ndonjë tensor hyrës është ndryshuar përmasat. Kjo thirrje është më e dobishme në përcaktimin e formave për çdo tensorë dalës përpara ekzekutimit të grafikut, p.sh.
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...
Shënim: Disa grafikë kanë rezultate në formë dinamike, në të cilin rast forma e daljes mund të mos përhapet plotësisht derisa të ekzekutohet përfundimi.
Hedhjet
IllegalStateException | nëse tensorët e grafikut nuk mund të alokohen me sukses. |
---|
mbyllje abstrakte publike zbrazëti ()
Lëshoni burime të lidhura me shembullin InterpreterApi
.
Krijimi publik statik i InterpreterApi ( File modelFile, InterpreterApi.Options opsionet)
Ndërton një shembull InterpreterApi
, duke përdorur modelin dhe opsionet e specifikuara. Modeli do të ngarkohet nga një skedar.
Parametrat
modelFile | Një skedar që përmban një model TF Lite të trajnuar paraprakisht. |
---|---|
opsionet | Një grup opsionesh për përshtatjen e sjelljes së përkthyesit. |
Hedhjet
IllegalArgumentPërjashtim | nëse modelFile nuk kodon një model të vlefshëm TensorFlow Lite. |
---|
Krijimi publik statik i InterpreterApi (Opsionet e ByteBuffer byteBuffer, InterpreterApi.Options )
Ndërton një shembull InterpreterApi
, duke përdorur modelin dhe opsionet e specifikuara. Modeli do të lexohet nga një ByteBuffer
.
Parametrat
byteBuffer | Një model TF Lite i trajnuar paraprakisht, në formë të serializuar binare. ByteBuffer nuk duhet të modifikohet pas ndërtimit të një shembulli InterpreterApi . ByteBuffer mund të jetë ose një MappedByteBuffer që memoria harton një skedar modeli, ose një ByteBuffer i drejtpërdrejtë i nativeOrder() që përmban përmbajtjen e bajteve të një modeli. |
---|---|
opsionet | Një grup opsionesh për përshtatjen e sjelljes së përkthyesit. |
Hedhjet
IllegalArgumentPërjashtim | nëse byteBuffer nuk është një MappedByteBuffer dhe as një ByteBuffer i drejtpërdrejtë i nativeOrder. |
---|
abstrakt publik int getInputIndex ( OpEmri i vargut)
Merr indeksin e një hyrjeje duke pasur parasysh emrin op të hyrjes.
Parametrat
opEmri |
---|
Hedhjet
IllegalArgumentPërjashtim | nëse opName nuk përputhet me asnjë hyrje në modelin e përdorur për të inicializuar interpretuesin. |
---|
Tensor abstrakt publik getInputTensor (int inputIndex)
Merr tensorin të lidhur me indeksin e dhënë të hyrjes.
Parametrat
InputIndeksi |
---|
Hedhjet
IllegalArgumentPërjashtim | nëse inputIndex është negativ ose nuk është më i vogël se numri i inputeve të modelit. |
---|
abstrakt publik int getInputTensorCount ()
Merr numrin e tensorëve të hyrjes.
abstrakt publik Long getLastNativeInferenceDurationNanosekonda ()
Rikthen kohën e konkluzionit origjinal.
Hedhjet
IllegalArgumentPërjashtim | nëse modeli nuk inicializohet nga interpretuesi. |
---|
abstrakt publik int getOutputIndex ( OpEmri i vargut)
Merr indeksin e një prodhimi duke pasur parasysh emrin op të prodhimit.
Parametrat
opEmri |
---|
Hedhjet
IllegalArgumentPërjashtim | nëse opName nuk përputhet me asnjë dalje në modelin e përdorur për të inicializuar interpretuesin. |
---|
Tensor abstrakt publik getOutputTensor (int outputIndex)
Merr tensorin të lidhur me indeksin e dhënë të daljes.
Shënim: Detajet e tensorit të daljes (p.sh. forma) mund të mos plotësohen plotësisht derisa të ekzekutohet përfundimi. Nëse keni nevojë për detaje të përditësuara *para* ekzekutimit të konkluzionit (p.sh., pas ndryshimit të madhësisë së një tensori hyrës, i cili mund të zhvleftësojë format e tensoreve dalëse), përdorni allocateTensors()
për të aktivizuar në mënyrë eksplicite alokimin dhe përhapjen e formës. Vini re se, për grafikët me forma dalëse që varen nga *vlerat* e hyrjes, forma dalëse mund të mos përcaktohet plotësisht derisa të ekzekutohet përfundimi.
Parametrat
Indeksi i daljes |
---|
Hedhjet
IllegalArgumentPërjashtim | nëse outputIndex është negativ ose nuk është më i vogël se numri i rezultateve të modelit. |
---|
abstrakt publik int getOutputTensorCount ()
Merr numrin e tensorëve në dalje.
abstrakt publik void resizeInput (int idx, int[] dims, boolean strikte)
Ndryshon madhësinë e hyrjes idx-të të modelit vendas në dims të dhëna.
Kur "strict" është e vërtetë, vetëm dimensionet e panjohura mund të ndryshohen. Dimensionet e panjohura tregohen si `-1` në grupin e kthyer nga `Tensor.shapeSignature()`.
Parametrat
idx | |
---|---|
zbehet | |
i rreptë |
Hedhjet
IllegalArgumentPërjashtim | nëse idx është negativ ose nuk është më i vogël se numri i hyrjeve të modelit; ose nëse ndodh gabim gjatë ndryshimit të madhësisë së hyrjes idx-të. Për më tepër, gabimi ndodh kur përpiqeni të ndryshoni madhësinë e një tensori me dimensione fikse kur 'strict' është e vërtetë. |
---|
abstrakt publik void resizeInput (int idx, int[] dims)
Ndryshon madhësinë e hyrjes idx-të të modelit vendas në dims të dhëna.
Parametrat
idx | |
---|---|
zbehet |
Hedhjet
IllegalArgumentPërjashtim | nëse idx është negativ ose nuk është më i vogël se numri i hyrjeve të modelit; ose nëse ndodh gabim gjatë ndryshimit të madhësisë së hyrjes idx-të. |
---|
ekzekutim abstrakt publik i zbrazët (Hyrja e objektit , dalja e objektit )
Ekzekuton konkluzionet e modelit nëse modeli merr vetëm një hyrje dhe siguron vetëm një dalje.
Paralajmërim: API është më efikas nëse një Buffer
(mundësisht i drejtpërdrejtë, por jo i nevojshëm) përdoret si lloji i të dhënave hyrëse/dalëse. Ju lutemi merrni parasysh përdorimin e Buffer
për të ushqyer dhe marrë të dhëna primitive për performancë më të mirë. Llojet e mëposhtme të Buffer
betonit mbështeten:
-
ByteBuffer
- i pajtueshëm me çdo lloj themelor primitiv Tensor. -
FloatBuffer
- i pajtueshëm me tensorët float. -
IntBuffer
- i pajtueshëm me tensorët int32. -
LongBuffer
- i pajtueshëm me tensorët int64.
Buffer
s, ose si hyrje skalare. Parametrat
hyrje | një grup ose një grup shumëdimensional, ose një Buffer i llojeve primitive duke përfshirë int, float, long dhe byte. Buffer është mënyra e preferuar për të kaluar të dhëna të mëdha hyrëse për llojet primitive, ndërsa llojet e vargjeve kërkojnë përdorimin e shtegut të hyrjes së grupit (shumë-dimensionale). Kur përdoret një Buffer , përmbajtja e tij duhet të mbetet e pandryshuar derisa të bëhet përfundimi i modelit dhe thirrësi duhet të sigurojë që Buffer është në pozicionin e duhur të leximit. Një vlerë null lejohet vetëm nëse thirrësi përdor një Delegate që lejon ndërveprimin e trajtimit të tamponit dhe një buffer i tillë është lidhur me Tensor e hyrjes. |
---|---|
prodhimit | një grup shumëdimensional i të dhënave dalëse, ose një Buffer i llojeve primitive duke përfshirë int, float, long dhe byte. Kur përdoret një Buffer , thirrësi duhet të sigurojë që i është caktuar pozicioni i duhur i shkrimit. Një vlerë null lejohet dhe është e dobishme për raste të caktuara, p.sh., nëse thirrësi po përdor një Delegate që lejon ndërveprimin e dorezës së tamponit, dhe një tampon i tillë është i lidhur me Tensor e daljes (shih gjithashtu Interpreter.Options#setAllowBufferHandleOutput(boolean) ), ose nëse grafiku ka dalë në mënyrë dinamike, pasi thirrja në formë duhet të jetë në formë Tensor dhe thirret, duke marrë të dhënat direkt nga tensori i daljes (nëpërmjet Tensor.asReadOnlyBuffer() ). |
Hedhjet
IllegalArgumentPërjashtim | nëse input është e pavlefshme ose bosh, ose nëse ndodh një gabim gjatë ekzekutimit të konkluzionit. |
---|---|
IllegalArgumentPërjashtim | (EKSPERIMENTAL, subjekt ndryshimi) nëse përfundimi ndërpritet nga setCancelled(true) . |
abstrakt publik void runForMultipleInputsOutputs ( hyrjet e objektit[] , Harta < Integer , Object > daljet)
Ekzekuton konkluzionet e modelit nëse modeli merr hyrje të shumta, ose kthen dalje të shumta.
Paralajmërim: API është më efikas nëse Buffer
-et (mundësisht të drejtpërdrejta, por jo të nevojshme) përdoren si llojet e të dhënave hyrëse/dalëse. Ju lutemi merrni parasysh përdorimin e Buffer
për të ushqyer dhe marrë të dhëna primitive për performancë më të mirë. Llojet e mëposhtme të Buffer
betonit mbështeten:
-
ByteBuffer
- i pajtueshëm me çdo lloj themelor primitiv Tensor. -
FloatBuffer
- i pajtueshëm me tensorët float. -
IntBuffer
- i pajtueshëm me tensorët int32. -
LongBuffer
- i pajtueshëm me tensorët int64.
Buffer
s, ose si hyrje skalare. Shënim: vlerat null
për elementet individuale të inputs
dhe outputs
lejohen vetëm nëse thirrësi përdor një Delegate
që lejon ndërveprimin e menaxhimit të tamponit dhe një buffer i tillë është lidhur me Tensor
(t) përkatëse hyrëse ose dalëse.
Parametrat
inputet | një grup të dhënash hyrëse. Inputet duhet të jenë në të njëjtin rend si hyrjet e modelit. Çdo hyrje mund të jetë një grup ose një grup shumëdimensional, ose një Buffer i llojeve primitive duke përfshirë int, float, long dhe byte. Buffer është mënyra e preferuar për të kaluar të dhëna të mëdha hyrëse, ndërsa llojet e vargjeve kërkojnë përdorimin e shtegut të hyrjes së grupit (shumë-dimensionale). Kur përdoret Buffer , përmbajtja e tij duhet të mbetet e pandryshuar derisa të bëhet përfundimi i modelit dhe thirrësi duhet të sigurojë që Buffer është në pozicionin e duhur të leximit. |
---|---|
daljet | një hartë duke hartuar indekset e daljes në grupe shumëdimensionale të të dhënave dalëse ose Buffer s të llojeve primitive duke përfshirë int, float, long dhe byte. Duhet vetëm të mbajë shënime që rezultatet të përdoren. Kur përdoret një Buffer , thirrësi duhet të sigurojë që i është caktuar pozicioni i duhur i shkrimit. Harta mund të jetë bosh për rastet kur ose dorezat e tamponit përdoren për të dhënat tensore dalëse, ose rastet kur daljet kanë formë dinamike dhe thirrësi duhet të kërkojë formën e Tensor të daljes pasi të jetë thirrur konkluzioni, duke marrë të dhënat direkt nga tensori i daljes (nëpërmjet Tensor.asReadOnlyBuffer() ) . |
Hedhjet
IllegalArgumentPërjashtim | nëse inputs janë të pavlefshme ose bosh, nëse outputs janë të pavlefshme, ose nëse ndodh një gabim gjatë ekzekutimit të konkluzionit. |
---|