תת-מחלקות עקיפות ידועות |
ממשק למפרשן מודל 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 | |
טנסור מופשט | getInputTensor (int inputIndex) מקבל את הטנזור המשויך לאינדקס הקלט שסופק. |
מופשט int | getInputTensorCount () מקבל את מספר טנסור הקלט. |
מופשט ארוך | getLastNativeInferenceDurationNanoseconds () מחזיר תזמון מסקנות מקומיות. |
מופשט int | |
טנסור מופשט | 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, או אם מתרחשת שגיאה בעת הפעלת הסקת מסקנות. |
---|