שיעור הנהג להסקת מסקנות מהמודל באמצעות TensorFlow Lite.
הערה: אם אינך זקוק לגישה לאף אחת מהאפשרויות ה"ניסיוניות" תכונות ה-API שמפורטות בהמשך, מעדיפים להשתמש בהן במקום להשתמש ב-TranslateerApi וב-TranslateerFact , במקום להשתמש ישירות ב'תרגום שיחה פעילה'.
Interpreter
כולל מודל TensorFlow Lite שעבר אימון מקדים, שבו פעולות
מופעלות לצורך הסקת מסקנות מהמודל.
לדוגמה, אם המודל מקבל רק קלט אחד ומחזיר רק פלט אחד:
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);
הסדר של נתוני הקלט והפלט נקבעים בהמרה של מודל TensorFlow ל-TensorFlowLite ב-Toco, וכך גם צורות ברירת המחדל של הקלט.
כאשר ערכי הקלט מוצגים כמערכים (רב-מימדיים), רכיבי הקלט המתאימים
לשנות את גודלן במרומז בהתאם לצורת המערך. כשמזינים ערכי קלט בתור Buffer
ללא שינוי גודל מרומז, המתקשר חייב לוודא שגודל הבייטים של Buffer
תואם לזה של הטנזור התואם, או שקודם הוא משנה את הגודל של הטנזור דרך resizeInput(int, int[])
. מידע על הצורה והסוגים של Tensor אפשר לקבל דרך המחלקה Tensor
, שזמינה דרך getInputTensor(int)
ו-getOutputTensor(int)
.
אזהרה: מכונות Interpreter
לא בטוחות לשרשורים. Interpreter
הוא הבעלים של משאבים שחייבים לפנות במפורש על ידי הפעלה של close()
ספריית TFLite מבוססת על NDK API 19. יכול להיות שהתכונה תפעל גם ברמות API של Android מתחת ל-19, אבל הדבר לא מובטח.
מחלקות מקוננות
מחלקה | Interpreter.Options | סיווג אפשרויות לשליטה בהתנהגות של המתורגמן בסביבת זמן הריצה. |
בנייה ציבורית
תרגום(קובץ modelFile, אפשרויות של Interpreter.Options)
מופעלת
Interpreter ומציינת אפשרויות להתאמה אישית של התנהגות המתורגמן. |
|
שיטות ציבוריות
ריק |
allocateTensors()
מעדכן באופן מפורש את ההקצאות לכל הפרמטרים של Tensor, אם יש צורך.
|
ריק |
Close()
שחרור משאבים שמשויכים למכונה
InterpreterApi . |
int | |
Tensor |
getInputTensor(int inputIndex)
הפונקציה מקבלת את ה-Tensor שמשויך לאינדקס הקלט שסופק.
|
int |
getInputTensorCount()
הפונקציה מקבלת את מספר Tensors הקלט.
|
Tensor |
getInputTensorFromSignature(StringinputName, StringSignatureKey)
הפונקציה מקבלת את ה-Tensor שמשויך לשם הקלט ולשם שיטת החתימה שסופקו.
|
ארוכה |
getLastNativeInferenceDurationNanoseconds()
הפונקציה מחזירה את תזמון ההסקה המקורי.
|
int | |
Tensor |
getOutputTensor(int outputIndex)
הפונקציה מקבלת את ה-Tensor שמשויך לאינדקס הפלט שסופק.
|
int |
getOutputTensorCount()
הפונקציה מקבלת את מספר Tensors הפלט.
|
Tensor |
getOutputTensorFromSignature(StringoutputName, StringSignatureKey)
הפונקציה מקבלת את ה-Tensor שמשויך לשם הפלט שסופק ב-method של חתימה ספציפית.
|
String[] |
getSignatureInputs(StringSignatureKey)
הפונקציה מקבלת את רשימת ערכי הקלט של SignatureDefs ל-method
signatureKey . |
String[] |
getSignatureKeys()
מקבלת את רשימת שמות השיטות שיוצאו באמצעות SignatureDef וזמינים במודל.
|
String[] | |
ריק |
resetVariableTensors()
מתקדם: איפוס כל הפרמטרים של המשתנים לערך ברירת המחדל.
|
ריק |
resizeInput(int idx, int[] dims, boolean strict)
משנה את גודל הקלט מסוג idx-th של המודל המקורי לעמימות הנתונים הנתונים.
|
ריק |
resizeInput(int idx, int[] מעומעם)
משנה את גודל הקלט מסוג idx-th של המודל המקורי לעמימות הנתונים הנתונים.
|
ריק | |
ריק |
runForMultipleInputsOutputs(אובייקט[] קלט, פלט מפה<Integer, אובייקט>)
מפעילה את ההֶקֵּשׁ של המודל אם המודל מקבל כמה קלטים, או מחזיר כמה פלטים.
|
ריק |
runSignature(מפה<מחרוזת, אובייקט> קלט, מפה<מחרוזת, אובייקט> פלטים)
זהה ל-
runSignature(Map, Map, String) , אבל לא מחייב העברה של SignatureKey,
בהנחה שלמודל יש SignatureDef אחד. |
ריק | |
ריק |
setCancelled(בוליאני בוטל)
מתקדם: הפרעה להסקת המסקנות באמצע השיחה אל
run(Object, Object) . |
שיטות שעברו בירושה
בנייה ציבורית
ציבורי תרגום שיחה (קובץ modelFile)
מתבצע אתחול של Interpreter
.
פרמטרים
modelFile | קובץ של מודל TF Lite שעבר אימון מראש. |
---|
קליעות
IllegalArgumentException | אם modelFile לא מקודד רכיב TensorFlow Lite תקין
מודל טרנספורמר.
|
---|
ציבורי תרגום שיחה (קובץ modelFile, אפשרויות Interpreter.Options)
מופעלת Interpreter
ומציינת אפשרויות להתאמה אישית של התנהגות המתורגמן.
פרמטרים
modelFile | קובץ של מודל TF Lite שעבר אימון מקדים |
---|---|
אפשרויות | קבוצת אפשרויות להתאמה אישית של התנהגות המתורגמים |
קליעות
IllegalArgumentException | אם modelFile לא מקודד רכיב TensorFlow Lite תקין
מודל טרנספורמר.
|
---|
ציבורי תרגום שיחה (ByteBuffer byteBuffer)
מאתחלת Interpreter
עם ByteBuffer
של קובץ מודל.
אין לשנות את ה-ByteBuffer אחרי בניית Interpreter
.
ByteBuffer
יכול להיות MappedByteBuffer
שמשמש למיפוי זיכרון של קובץ מודל, או
ערך ByteBuffer
ישיר של NativeOrder() שמכיל את תוכן הבייטים של המודל.
פרמטרים
byteBuffer |
---|
קליעות
IllegalArgumentException | אם byteBuffer הוא לא MappedByteBuffer או
ישירות ByteBuffer מ-NativeOrder.
|
---|
ציבורי תרגום שיחה (ByteBuffer byteBuffer, Interpreter.Options אפשרויות)
הפעלת Interpreter
עם ByteBuffer
של קובץ מודל וקבוצה של
Interpreter.Options
בהתאמה אישית.
אין לשנות את ByteBuffer
לאחר היצירה של Interpreter
. ByteBuffer
יכול להיות MappedByteBuffer
שממפה את הזיכרון
קובץ מודל או ByteBuffer
ישיר של NativeOrder() שמכיל את תוכן הבייטים
של דגם מסוים.
פרמטרים
byteBuffer | |
---|---|
אפשרויות |
קליעות
IllegalArgumentException | אם byteBuffer הוא לא MappedByteBuffer או
ישירות ByteBuffer מ-NativeOrder.
|
---|
שיטות ציבוריות
ציבורי ריק allocateTensors ()
מעדכן באופן מפורש את ההקצאות לכל הפרמטרים של Tensor, אם יש צורך.
הפעולה הזו תפיץ צורות והקצאות זיכרון של מעבדי tensors תלויים באמצעות הקלט את צורות ה-tensor, בהתאם למה שניתנו.
הערה: השיחה הזו *אופציונלית לחלוטין*. הקצאת Tensor תתבצע באופן אוטומטי במהלך אם בוצע שינוי של הגודל של מעבדי קלט. קריאה זו שימושית במיוחד בקביעת צורות עבור גורמי פלט פלט לפני הרצת התרשים, למשל,
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
.
ציבורי INT getInputIndex (מחרוזת opName)
מקבל אינדקס של קלט בהינתן שם הפעולה של הקלט.
פרמטרים
opName |
---|
ציבורי Tensor getInputTensor (int קלט Index)
הפונקציה מקבלת את ה-Tensor שמשויך לאינדקס הקלט שסופק.
פרמטרים
inputIndex |
---|
ציבורי INT getInputTensorCount ()
הפונקציה מקבלת את מספר Tensors הקלט.
ציבורי Tensor getInputTensorFromSignature (מחרוזתinputName, מחרוזתSignatureKey)
הפונקציה מקבלת את ה-Tensor שמשויך לשם הקלט ולשם שיטת החתימה שסופקו.
אזהרה: זהו API ניסיוני והוא עשוי להשתנות.
פרמטרים
inputName | הזנת שם בחתימה. |
---|---|
signatureKey | מפתח חתימה המזהה את ה-SignatureDef יכול להיות null אם המודל כולל חתימה אחת. |
קליעות
IllegalArgumentException | אם הערך של inputName או של signatureKey הוא null או ריק,
או שם לא חוקי
|
---|
ציבורי INT getOutputIndex (מחרוזת opName)
מקבל אינדקס של פלט בהינתן שם הפעולה של הפלט.
פרמטרים
opName |
---|
ציבורי Tensor getOutputTensor (אינדקס פלט קלט)
הפונקציה מקבלת את ה-Tensor שמשויך לאינדקס הפלט שסופק.
הערה: ייתכן שהפרטים של ארגומנט הפלט (למשל צורה) לא יאוכלסו במלואם עד לאחר ההסקה
מבוצעת. אם דרושים לך פרטים מעודכנים *לפני* הפעלת ההסקה (למשל, אחרי שינוי גודל
את Tensor הקלט, שעשוי לפסול צורות T tensor פלט, השתמש ב-allocateTensors()
כדי
להפעיל במפורש הקצאה והפצה של צורות. חשוב לשים לב שלתרשימים עם צורות פלט
שתלויות בערכי *ערכי קלט*, ייתכן שצורת הפלט לא תיקבע במלואה עד
במהלך ההסקה הזו.
פרמטרים
outputIndex |
---|
ציבורי INT getOutputTensorCount ()
הפונקציה מקבלת את מספר Tensors הפלט.
ציבורי Tensor getOutputTensorFromSignature (מחרוזתoutputName, מחרוזתSignatureKey)
הפונקציה מקבלת את ה-Tensor שמשויך לשם הפלט שסופק ב-method של חתימה ספציפית.
הערה: ייתכן שהפרטים של ארגומנט הפלט (למשל צורה) לא יאוכלסו במלואם עד לאחר ההסקה
מבוצעת. אם דרושים לך פרטים מעודכנים *לפני* הפעלת ההסקה (למשל, אחרי שינוי גודל
את Tensor הקלט, שעשוי לפסול צורות T tensor פלט, השתמש ב-allocateTensors()
כדי
להפעיל במפורש הקצאה והפצה של צורות. חשוב לשים לב שלתרשימים עם צורות פלט
שתלויות בערכי *ערכי קלט*, ייתכן שצורת הפלט לא תיקבע במלואה עד
במהלך ההסקה הזו.
אזהרה: זהו API ניסיוני והוא עשוי להשתנות.
פרמטרים
outputName | שם הפלט בחתימה. |
---|---|
signatureKey | מפתח חתימה המזהה את ה-SignatureDef יכול להיות null אם המודל כולל חתימה אחת. |
קליעות
IllegalArgumentException | אם outputName או signatureKey הם null או
צוין שם ריק או לא תקין.
|
---|
ציבורי String[] getSignatureInputs (מחרוזתSignatureKey)
הפונקציה מקבלת את רשימת ערכי הקלט של SignatureDefs ל-method signatureKey
.
אזהרה: זהו API ניסיוני והוא עשוי להשתנות.
פרמטרים
signatureKey |
---|
ציבורי String[] getSignatureKeys ()
מקבלת את רשימת שמות השיטות שיוצאו באמצעות SignatureDef וזמינים במודל.
אזהרה: זהו API ניסיוני והוא עשוי להשתנות.
ציבורי String[] getSignatureOutputs (מחרוזתSignatureKey)
קבלת רשימת הפלט של SignatureDefs ל-method signatureKey
.
אזהרה: זהו API ניסיוני והוא עשוי להשתנות.
פרמטרים
signatureKey |
---|
ציבורי ריק resetVariableTensors ()
מתקדם: איפוס כל הפרמטרים של המשתנים לערך ברירת המחדל.
אם למשתנה tensor לא משויך מאגר נתונים זמני, הוא יאופס לאפס.
אזהרה: זהו API ניסיוני והוא עשוי להשתנות.
ציבורי ריק resizeInput (int idx, int[] מעומעם, בוליאני קפדני)
משנה את גודל הקלט מסוג idx-th של המודל המקורי לעמימות הנתונים הנתונים.
אם הערך של 'strict' הוא True, אפשר לשנות את הגודל רק של מאפיינים לא ידועים. מאפיינים לא ידועים הם מצוין כ-'-1' במערך שהוחזר על ידי 'Tensor.shapeSignature() '.
פרמטרים
IDx | |
---|---|
מעומעם | |
מחמיר |
ציבורי ריק resizeInput (int idx, int[] מעומעם)
משנה את גודל הקלט מסוג idx-th של המודל המקורי לעמימות הנתונים הנתונים.
פרמטרים
IDx | |
---|---|
מעומעם |
ציבורי ריק הרצה (אובייקט, קלט, אובייקט פלט)
מפעילה את מסקנות המודל אם המודל מקבל רק קלט אחד ומספק רק פלט אחד.
אזהרה: ה-API יעיל יותר אם Buffer
(עדיף להיות ישיר, אבל לא נדרש)
משמש כסוג נתוני הקלט/פלט. כדאי להשתמש ב-Buffer
כדי להזין ולאחזר
נתונים ראשוניים לשיפור הביצועים. הסוגים הממשיים הבאים של Buffer
הם
נתמך:
ByteBuffer
– תואם לכל סוג של Tensor פרימיטיבי.FloatBuffer
– תואם למכשירי Tensor מצופים.IntBuffer
– תואם למכשירי int32 Tensor.LongBuffer
– תואם למכשירי int64 של Tensor.
Buffer
או כקלט סקלרי.פרמטרים
קלט | מערך או מערך רב-מימדי, או Buffer של סוגים פרימיטיביים
כולל int, float, long ו-byte. Buffer הוא הדרך המועדפת להעביר שידורים חיים
נתוני קלט עבור טיפוסים פרימיטיביים, ואילו סוגי מחרוזות מחייבים שימוש באופרטור (רב-מימדי)
נתיב הקלט של מערך. כשמשתמשים ב-Buffer , התוכן שלו צריך להישאר ללא שינוי עד
הסקת מסקנות, והמתקשר חייב לוודא שה-Buffer נמצא
מיקום קריאה מתאים. מותר להזין ערך של null רק אם המתקשר משתמש ב-
Delegate שמאפשר יכולת פעולה הדדית של מאגר נתונים זמני, ומאגר נתונים זמני כזה קושר
קלט Tensor . |
---|---|
output | מערך רב-מימדי של נתוני פלט, או Buffer של סוגים פרימיטיביים
כולל int, float, long ו-byte. כשנעשה שימוש ב-Buffer , המתקשר צריך לוודא
להגדיר את מיקום הכתיבה המתאים. מותר להשתמש בערך null, והוא שימושי עבור
במקרים מסוימים, למשל אם המתקשר משתמש ב-Delegate שמאפשר נקודת אחיזה למאגר הנתונים הזמני
יכולת פעולה הדדית, ומאגר נתונים זמני כזה קושר לפלט Tensor (אפשר לעיין גם ב-Interpreter.Options#setAllowBufferHandleOutput(boolean)),
או אם התרשים יצר פלט באופן דינמי והמתקשר צריך לשלוח שאילתה על הצורה Tensor של הפלט לאחר הפעלת ההסקה, ולאחזר את הנתונים ישירות מהפלט
tensor (דרך Tensor.asReadOnlyBuffer() ). |
ציבורי ריק runForMultipleInputsOutputs (אובייקט[] קלט, מפה<מספר שלם, אובייקט> פלטים)
מפעילה את ההֶקֵּשׁ של המודל אם המודל מקבל כמה קלטים, או מחזיר כמה פלטים.
אזהרה: ה-API יעיל יותר אם פונקציות Buffer
(עדיף ישירות, אבל לא נדרש)
משמשים כסוגי נתוני קלט/פלט. כדאי להשתמש ב-Buffer
כדי להזין ולאחזר
נתונים ראשוניים לשיפור הביצועים. הסוגים הממשיים הבאים של Buffer
הם
נתמך:
ByteBuffer
– תואם לכל סוג של Tensor פרימיטיבי.FloatBuffer
– תואם למכשירי Tensor מצופים.IntBuffer
– תואם למכשירי int32 Tensor.LongBuffer
– תואם למכשירי int64 של Tensor.
Buffer
או כקלט סקלרי.
הערה: null
לרכיבים נפרדים של inputs
ו-outputs
הם
מותרת רק אם המתקשר משתמש ב-Delegate
שמאפשר יכולת פעולה הדדית של מאגר נתונים זמני, וגם
מאגר כזה קושר לקלט או לפלט המתאימים Tensor
.
פרמטרים
נתוני קלט | מערך של נתוני קלט. סדר הקלט צריך להיות זהה לזה של
מודל טרנספורמר. כל קלט יכול להיות מערך או מערך רב-מימדי, או Buffer
טיפוסים פרימיטיביים, כולל int, float, long ו-byte. הדרך המועדפת היא Buffer
להעברת נתוני קלט גדולים, ואילו סוגי מחרוזות מחייבים שימוש במערך (רב-מימדי)
בנתיב הקלט. כאשר משתמשים ב-Buffer , התוכן שלו צריך להישאר ללא שינוי עד שהמודל
הסקת מסקנות, והמתקשר חייב לוודא שהBuffer נמצא בזמן המתאים
מצב קריאה. |
---|---|
פלט | מיפוי של מדדי פלט במפה למערכים רב-ממדיים של נתוני פלט או ל-Buffer s של סוגים פרימיטיביים, כולל int, float, long ו-byte. צריך רק לשמור
של הפלט שבו יש להשתמש. כשנעשה שימוש ב-Buffer , המתקשר צריך לוודא
להגדיר את מיקום הכתיבה המתאים. המפה עשויה להיות ריקה במקרים שבהם
משתמשים במאגרי נתונים זמניים לצורך מאגר נתונים של פלט img_tensor, או במקרים שבהם הפלטים נעשים באופן דינמי.
והקוראים צריכים לשלוח שאילתה לצורת הפלט Tensor לאחר ההסקה
להפעיל, לאחזר את הנתונים ישירות מקטע הפלט (דרך Tensor.asReadOnlyBuffer() ). |
ציבורי ריק runSignature (מפה<מחרוזת, אובייקט> קלט, מפה<מחרוזת, אובייקט> פלטים)
זהה ל-runSignature(Map, Map, String)
, אבל לא מחייב העברה של SignatureKey,
בהנחה שלמודל יש SignatureDef אחד. אם למודל יש יותר מ-SignatureDef אחד, הוא
להקפיץ הודעת שגיאה.
אזהרה: זהו API ניסיוני והוא עשוי להשתנות.
פרמטרים
נתוני קלט | |
---|---|
פלט |
ציבורי ריק runSignature (מפה<מחרוזת, אובייקט> קלט, מפה<מחרוזת, אובייקט> פלטים, מחרוזת חתימת מפתח)
מפעילה את מסקנות המודל על סמך SignatureDef שסופק דרך signatureKey
.
ניתן למצוא פרטים נוספים על סוגי הקלט והפלט המותרים בכתובת run(Object, Object)
סוגי נתונים שונים.
אזהרה: זהו API ניסיוני והוא עשוי להשתנות.
פרמטרים
נתוני קלט | מפה משם הקלט ב-SignatureDef לאובייקט הקלט. |
---|---|
פלט | מפה משם הפלט ב-SignatureDef לפלט נתוני הפלט. יכול להיות שהשדה הזה יהיה ריק אם
רוצה להריץ שאילתות על הנתונים של Tensor ישירות לאחר הסקת המסקנות (למשל, אם
צורת הפלט היא דינמית, או שנעשה שימוש בנקודות אחיזה למאגר הנתונים הזמני של הפלט). |
signatureKey | מפתח חתימה המזהה את ה-SignatureDef. |
קליעות
IllegalArgumentException | אם הערך של inputs הוא null או ריק, אם outputs או
הערך signatureKey הוא null, או אם מתרחשת שגיאה בזמן הרצת ההסקה.
|
---|
ציבורי ריק setCancelled (בוליאני בוטל)
מתקדם: הפרעה להסקת המסקנות באמצע השיחה אל run(Object, Object)
.
דגל ביטול יוגדר כ-True כשמפעילים את הפונקציה הזו. המתרגם
בודקים את הדגל בין הפעלות של הפעלה, ואם הוא true
, המתרגם יפסיק
להגדיר. המתרגם יישאר במצב מבוטל עד שהוא 'לא בוטל' באופן מפורש לפי
setCancelled(false)
אזהרה: זהו API ניסיוני והוא עשוי להשתנות.
פרמטרים
בוטל | true כדי לבטל את ההסקה בדרך הטובה ביותר. false עד
בקורות החיים שלו. |
---|
קליעות
IllegalStateException | אם המתרגם לא מאותחל מושבתת כברירת מחדל. |
---|