InterpreterApi

ממשק ציבורי InterpreterApi
תת-מחלקות עקיפות ידועות

ממשק למפרשן מודל TensorFlow Lite, לא כולל שיטות ניסוי.

מופע InterpreterApi מקפל בתוכו מודל TensorFlow Lite מאומן מראש, שבו מבוצעות פעולות להסקת מודל.

לדוגמה, אם מודל לוקח רק קלט אחד ומחזיר רק פלט אחד:

try (InterpreterApi interpreter =
     new InterpreterApi.create(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 (InterpreterApi interpreter =
     new InterpreterApi.create(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 (InterpreterApi interpreter =
     new InterpreterApi.create(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 עם Toco, וכך גם צורות ברירת המחדל של הקלט.

כאשר קלטים מסופקים כמערכים (רב-ממדיים), גודלו של טנסור/ים הקלט המתאימים ישתנה באופן מרומז בהתאם לצורתו של אותו מערך. כאשר קלט מסופק כסוגי Buffer , לא מתבצע שינוי גודל מרומז; המתקשר חייב לוודא שגודל בתים Buffer תואם לזה של הטנזור המתאים, או שהוא משנה את גודל הטנזור תחילה באמצעות resizeInput(int, int[]) . ניתן לקבל מידע על צורת וסוג טנסור באמצעות מחלקת Tensor , הזמינה באמצעות getInputTensor(int) ו- getOutputTensor(int) .

אזהרה: מופעי InterpreterApi אינם בטוחים לשרשור.

אזהרה: מופע InterpreterApi הוא הבעלים של משאבים שיש לשחרר אותם במפורש על ידי הפעלת close()

ספריית TFLite בנויה כנגד NDK API 19. היא עשויה לעבוד עבור רמות API של Android מתחת ל-19, אך לא מובטחת.

כיתות מקוננות

מעמד InterpreterApi.Options מחלקת אפשרויות לשליטה בהתנהגות מתורגמן בזמן ריצה.

שיטות ציבוריות

ריק מופשט
allocateTensors ()
מעדכן במפורש הקצאות עבור כל הטנזורים, במידת הצורך.
ריק מופשט
סגור ()
שחרר משאבים המשויכים למופע InterpreterApi .
InterpreterApi סטטי
ליצור (אפשרויות קובץ modelFile, InterpreterApi.Options )
בונה מופע InterpreterApi , תוך שימוש במודל ובאפשרויות שצוינו.
InterpreterApi סטטי
ליצור (אפשרויות ByteBuffer byteBuffer, InterpreterApi.Options )
בונה מופע InterpreterApi , תוך שימוש במודל ובאפשרויות שצוינו.
מופשט int
getInputIndex ( מחרוזת opName)
מקבל אינדקס של קלט בהינתן שם הפעולה של הקלט.
טנסור מופשט
getInputTensor (int inputIndex)
מקבל את הטנזור המשויך לאינדקס הקלט שסופק.
מופשט int
getInputTensorCount ()
מקבל את מספר טנסור הקלט.
מופשט ארוך
getLastNativeInferenceDurationNanoseconds ()
מחזיר תזמון מסקנות מקומיות.
מופשט int
getOutputIndex ( String opName)
מקבל אינדקס של פלט בהינתן שם האופציה של הפלט.
טנסור מופשט
getOutputTensor (int outputIndex)
מקבל את הטנזור המשויך לאינדקס הפלט שסופק.
מופשט int
getOutputTensorCount ()
מקבל את מספר טנסור הפלט.
ריק מופשט
resizeInput (int idx, int[] dims, בוליאני strict)
משנה את גודל הקלט ה-idx-th של המודל המקורי לעמעום הנתון.
ריק מופשט
resizeInput (int idx, int[] dims)
משנה את גודל הקלט ה-idx-th של המודל המקורי לעמעום הנתון.
ריק מופשט
הפעלה ( קלט אובייקט, פלט אובייקט )
מפעיל הסקת מודל אם המודל לוקח רק קלט אחד, ומספק רק פלט אחד.
ריק מופשט
runForMultipleInputsOutputs (כניסות אובייקט[] , מפה < מספר שלם , אובייקט > יציאות)
מפעיל הסקת מודל אם המודל לוקח מספר כניסות, או מחזיר פלטים מרובים.

שיטות בירושה

שיטות ציבוריות

תקציר פומבי void allocateTensors ()

מעדכן במפורש הקצאות עבור כל הטנזורים, במידת הצורך.

זה יפיץ צורות והקצאות זיכרון לטנזורים תלויים באמצעות צורות טנזור הקלט כפי שניתנו.

הערה: שיחה זו היא *אופציונלית בלבד*. הקצאת טנסור תתרחש אוטומטית במהלך הביצוע אם גודל טנסור קלט שונה. קריאה זו שימושית ביותר בקביעת הצורות עבור טנסור פלט כלשהו לפני ביצוע הגרף, למשל,

 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...

הערה: לחלק מהגרפים יש פלטים בעלי צורה דינמית, ובמקרה זה ייתכן שצורת הפלט לא תתפשט במלואה עד לביצוע ההסקה.

זורק
חריגה של מדינה בלתי חוקית אם לא ניתן היה להקצות בהצלחה את הטנזורים של הגרף.

תקציר ציבורי ריק סגור ()

שחרר משאבים המשויכים למופע InterpreterApi .

יצירת InterpreterApi סטטית ציבורית (אפשרויות מודל קובץ File , InterpreterApi.Options )

בונה מופע InterpreterApi , תוך שימוש במודל ובאפשרויות שצוינו. הדגם ייטען מקובץ.

פרמטרים
modelFile קובץ המכיל דגם TF Lite מאומן מראש.
אפשרויות סט אפשרויות להתאמה אישית של התנהגות המתורגמן.
זורק
חריג טיעון לא חוקי אם modelFile אינו מקודד מודל TensorFlow Lite חוקי.

public static InterpreterApi create (אפשרויות ByteBuffer byteBuffer, InterpreterApi.Options )

בונה מופע InterpreterApi , תוך שימוש במודל ובאפשרויות שצוינו. המודל ייקרא מתוך ByteBuffer .

פרמטרים
byteBuffer דגם TF Lite מאומן מראש, בצורה סידרית בינארית. אין לשנות את ByteBuffer לאחר בניית מופע InterpreterApi . ה- ByteBuffer יכול להיות MappedByteBuffer שממפה זיכרון של קובץ מודל, או ByteBuffer ישיר של nativeOrder() שמכיל את תוכן הבתים של מודל.
אפשרויות סט אפשרויות להתאמה אישית של התנהגות המתורגמן.
זורק
חריג טיעון לא חוקי אם byteBuffer אינו MappedByteBuffer וגם לא ByteBuffer ישיר של nativeOrder.

תקציר ציבורי int getInputIndex ( String opName)

מקבל אינדקס של קלט בהינתן שם הפעולה של הקלט.

פרמטרים
opName
זורק
חריג טיעון לא חוקי אם opName אינו תואם לאף קלט במודל המשמש לאתחול המתורגמן.

תקציר ציבורי Tensor getInputTensor (int inputIndex)

מקבל את הטנזור המשויך לאינדקס הקלט שסופק.

פרמטרים
inputIndex
זורק
חריג טיעון לא חוקי אם inputIndex שלילי או אינו קטן ממספר כניסות הדגם.

תקציר ציבורי int getInputTensorCount ()

מקבל את מספר טנסור הקלט.

תקציר ציבורי Long getLastNativeInferenceDurationNanoseconds ()

מחזיר תזמון מסקנות מקומיות.

זורק
חריג טיעון לא חוקי אם המודל לא מאותחל על ידי המתורגמן.

תקציר ציבורי int getOutputIndex ( String opName)

מקבל אינדקס של פלט בהינתן שם האופציה של הפלט.

פרמטרים
opName
זורק
חריג טיעון לא חוקי אם opName אינו תואם פלט כלשהו במודל המשמש לאתחול המתורגמן.

תקציר ציבורי Tensor getOutputTensor (int outputIndex)

מקבל את הטנזור המשויך לאינדקס הפלט שסופק.

הערה: ייתכן שפרטי טנסור פלט (למשל, צורה) לא יאוכלסו במלואם עד לאחר ביצוע ההסקה. אם אתה זקוק לפרטים מעודכנים *לפני* הפעלת הסקת מסקנות (למשל, לאחר שינוי גודל טנזור קלט, מה שעשוי לבטל צורות טנזור פלט), השתמש allocateTensors() כדי להפעיל באופן מפורש הקצאה והפצת צורה. שים לב, עבור גרפים עם צורות פלט התלויות ב-*ערכים* של קלט, ייתכן שצורת הפלט לא תיקבע במלואה עד להסקה.

פרמטרים
outputIndex
זורק
חריג טיעון לא חוקי אם outputIndex שלילי או אינו קטן ממספר פלטי הדגם.

תקציר ציבורי int getOutputTensorCount ()

מקבל את מספר טנסור הפלט.

public abstract void resizeInput (int idx, int[] dims, boolean strict)

משנה את גודל הקלט ה-idx-th של המודל המקורי לעמעום הנתון.

כאשר 'strict' הוא True, ניתן לשנות את הגודל של מידות לא ידועות בלבד. מידות לא ידועות מסומנות כ-'-1' במערך המוחזר על ידי 'Tensor.shapeSignature()'.

פרמטרים
idx
מתעמעם
קַפְּדָנִי
זורק
חריג טיעון לא חוקי אם idx שלילי או אינו קטן ממספר כניסות הדגם; או אם מתרחשת שגיאה בעת שינוי גודל הקלט idx-th. בנוסף, השגיאה מתרחשת בעת ניסיון לשנות את גודל טנזור עם ממדים קבועים כאשר 'strict' הוא True.

public abstract void resizeInput (int idx, int[] dims)

משנה את גודל הקלט ה-idx-th של המודל המקורי לעמעום הנתון.

פרמטרים
idx
מתעמעם
זורק
חריג טיעון לא חוקי אם idx שלילי או אינו קטן ממספר כניסות הדגם; או אם מתרחשת שגיאה בעת שינוי גודל הקלט idx-th.

הפעלת ריק תקציר ציבורי ( קלט אובייקט, פלט אובייקט )

מפעיל הסקת מודל אם המודל לוקח רק קלט אחד, ומספק רק פלט אחד.

אזהרה: ה-API יעיל יותר אם נעשה שימוש Buffer (רצוי ישיר, אך לא נדרש) כסוג נתוני הקלט/פלט. אנא שקול להשתמש Buffer כדי להאכיל ולאחזר נתונים פרימיטיביים לביצועים טובים יותר. סוגי Buffer הבטון הבאים נתמכים:

  • ByteBuffer - תואם לכל סוג Tensor פרימיטיבי בסיסי.
  • FloatBuffer - תואם ל-float Tensors.
  • IntBuffer - תואם עם int32 Tensors.
  • LongBuffer - תואם טנסור int64.
שים לב שסוגים בוליאניים נתמכים רק כמערכים, לא כ- Buffer s, או ככניסות סקלריות.

פרמטרים
קֶלֶט מערך או מערך רב מימדי, או Buffer מסוגים פרימיטיביים כולל int, float, long ובייט. Buffer הוא הדרך המועדפת להעביר נתוני קלט גדולים עבור טיפוסים פרימיטיביים, בעוד שסוגי מחרוזות דורשים שימוש בנתיב הקלט של המערך (רב-ממדי). כאשר נעשה שימוש Buffer , התוכן שלו צריך להישאר ללא שינוי עד להסקת הדגם, ועל המתקשר לוודא Buffer נמצא במיקום הקריאה המתאים. ערך null מותר רק אם המתקשר משתמש ב- Delegate המאפשר אינטררופ של נקודת אחיזה, ומאגר כזה נקשר לקלט Tensor .
תְפוּקָה מערך רב ממדי של נתוני פלט, או Buffer מסוגים פרימיטיביים כולל int, float, long ובייט. כאשר נעשה שימוש Buffer , על המתקשר לוודא שהוא מוגדר במיקום הכתיבה המתאים. ערך null מותר, והוא שימושי במקרים מסוימים, למשל, אם המתקשר משתמש ב- Delegate המאפשר אינטראפ של טיפול במאגר, ומאגר כזה נקשר ל- Tensor הפלט (ראה גם Interpreter.Options#setAllowBufferHandleOutput(בולאני) ), או אם לגרף יש פלטים בעלי צורה דינמית ועל המתקשר לשאול את צורת Tensor לאחר הפעלת ההסקה, להביא את הנתונים ישירות מטנסור הפלט (דרך Tensor.asReadOnlyBuffer() ).
זורק
חריג טיעון לא חוקי אם input הוא ריק או ריק, או אם מתרחשת שגיאה בעת הפעלת הסקה.
חריג טיעון לא חוקי (ניסיוני, כפוף לשינויים) אם ההסקה מופסקת על ידי setCancelled(true) .

public abstract void runForMultipleInputsOutputs (כניסות אובייקט[] , מפה < מספר שלם , אובייקט > יציאות)

מפעיל הסקת מודל אם המודל לוקח מספר כניסות, או מחזיר פלטים מרובים.

אזהרה: ה-API יעיל יותר אם משתמשים Buffer s (רצוי ישירות, אך לא חובה) כסוגי נתוני קלט/פלט. אנא שקול להשתמש Buffer כדי להאכיל ולאחזר נתונים פרימיטיביים לביצועים טובים יותר. סוגי Buffer הבטון הבאים נתמכים:

  • ByteBuffer - תואם לכל סוג Tensor פרימיטיבי בסיסי.
  • FloatBuffer - תואם ל-float Tensors.
  • IntBuffer - תואם עם int32 Tensors.
  • LongBuffer - תואם טנסור int64.
שים לב שסוגים בוליאניים נתמכים רק כמערכים, לא כ- Buffer s, או ככניסות סקלריות.

הערה: ערכי null עבור אלמנטים בודדים של inputs outputs מותרים רק אם המתקשר משתמש ב- Delegate המאפשר אינטררופ של ידית מאגר, ומאגר כזה נקשר ל- Tensor הקלט או הפלט המתאימים.

פרמטרים
תשומות מערך של נתוני קלט. התשומות צריכות להיות באותו סדר כמו התשומות של המודל. כל קלט יכול להיות מערך או מערך רב ממדי, או Buffer מסוגים פרימיטיביים כולל int, float, long ובייט. Buffer הוא הדרך המועדפת להעביר נתוני קלט גדולים, בעוד שסוגי מחרוזות דורשים שימוש בנתיב הקלט של המערך (רב-ממדי). כאשר נעשה שימוש Buffer , התוכן שלו צריך להישאר ללא שינוי עד להסקת הדגם, ועל המתקשר לוודא Buffer נמצא במיקום הקריאה המתאים.
תפוקות מפה הממפה מדדי פלט למערכים רב מימדיים של נתוני פלט או Buffer s מסוגים פרימיטיביים כולל int, float, long ובייט. זה צריך לשמור רק ערכים כדי שהפלטים ישמשו. כאשר נעשה שימוש Buffer , על המתקשר לוודא שהוא מוגדר במיקום הכתיבה המתאים. המפה עשויה להיות ריקה במקרים שבהם נעשה שימוש בנקודות אחיזה של מאגר עבור נתוני טנסור פלט, או מקרים שבהם הפלטים מעוצבים בצורה דינמית והמתקשר חייב לשאול את צורת Tensor הפלט לאחר שהופעלה מסקנות, להביא את הנתונים ישירות מטנסור הפלט ( דרך Tensor.asReadOnlyBuffer() ).
זורק
חריג טיעון לא חוקי אם inputs הוא null או ריק, אם outputs הם null, או אם מתרחשת שגיאה בעת הפעלת הסקת מסקנות.