InterpreterApi

ndërfaqja publike InterpreterApi
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.
Vini re se llojet boolean mbështeten vetëm si vargje, jo si 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.
Vini re se llojet boolean mbështeten vetëm si vargje, jo si 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.