کلاس درایور برای استنتاج مدل با TensorFlow Lite.
توجه: اگر به هیچ یک از ویژگیهای API "تجربی" زیر نیاز ندارید، ترجیح دهید به جای استفاده مستقیم از Interpreter از InterpreterApi و InterpreterFactory استفاده کنید.
یک 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
بدست آورد که از طریق getInputTensor(int)
و getOutputTensor(int)
در دسترس است.
اخطار: نمونه های Interpreter
نظر رشته ای ایمن نیستند . یک Interpreter
دارای منابعی است که باید به صراحت با فراخوانی close()
آزاد شوند.
کتابخانه TFLite بر اساس NDK API 19 ساخته شده است. ممکن است برای سطوح Android API زیر 19 کار کند، اما تضمینی نیست.
کلاس | مترجم.گزینه ها | یک کلاس گزینه برای کنترل رفتار مفسر زمان اجرا. |
مترجم ( گزینه های File modelFile، Interpreter.Options ) یک Interpreter راهاندازی میکند و گزینههایی را برای سفارشیسازی رفتار مفسر مشخص میکند. | |
مترجم ( ByteBuffer byteBuffer، گزینه های Interpreter.Options ) یک Interpreter با یک ByteBuffer از یک فایل مدل و مجموعه ای از Interpreter.Options سفارشی راه اندازی می کند. |
خالی | allocateTensors () در صورت لزوم، تخصیص ها را برای همه تانسورها به صراحت به روز می کند. |
خالی | بستن () منابع مرتبط با نمونه InterpreterApi را منتشر کنید. |
بین المللی | |
تانسور | getInputTensor (int inputIndex) تانسور مرتبط با شاخص ورودی ارائه شده را دریافت می کند. |
بین المللی | getInputTensorCount () تعداد تانسورهای ورودی را بدست می آورد. |
تانسور | getInputTensorFromSignature (نام ورودی رشته ، کلید امضای رشته) تانسور مرتبط با نام ورودی ارائه شده و نام روش امضا را دریافت می کند. |
طولانی | getLastNativeInferenceDurationNanoseconds () زمان استنتاج بومی را برمیگرداند. |
بین المللی | |
تانسور | getOutputTensor (int outputIndex) تانسور مرتبط با شاخص خروجی ارائه شده را دریافت می کند. |
بین المللی | getOutputTensorCount () تعداد تانسورهای خروجی را بدست می آورد. |
تانسور | getOutputTensorFromSignature (نام خروجی رشته ، کلید امضای رشته) تانسور مرتبط با نام خروجی ارائه شده را در روش امضای خاص دریافت می کند. |
رشته[] | getSignatureInputs ( String signatureKey) لیست ورودی های SignatureDefs را برای متد signatureKey دریافت می کند. |
رشته[] | getSignatureKeys () فهرستی از نامهای روش صادر شده SignatureDef موجود در مدل را دریافت میکند. |
رشته[] | getSignatureOutputs ( String signatureKey) لیستی از خروجی های SignatureDefs را برای متد signatureKey دریافت می کند. |
خالی | resetVariableTensors () Advanced: همه تانسورهای متغیر را به مقدار پیش فرض بازنشانی می کند. |
خالی | resizeInput (int idx، int[] dims، boolean strict) اندازه ورودی idx-امین مدل بومی را به کمرنگهای داده شده تغییر میدهد. |
خالی | resizeInput (int idx، int[] dims) اندازه ورودی idx-امین مدل بومی را به کمرنگهای داده شده تغییر میدهد. |
خالی | |
خالی | runForMultipleInputsOutputs ( ورودی های شی[] ، نقشه < عدد صحیح ، شی > خروجی ها) اگر مدل چندین ورودی دریافت کند یا خروجی های متعددی را برمی گرداند، استنتاج مدل را اجرا می کند. |
خالی | runSignature ( Map < رشته ، شی > ورودی ها، نقشه < رشته ، شی > خروجی ها) همانند runSignature(Map, Map, String) اما نیازی به ارسال signatureKey ندارد، با فرض اینکه مدل دارای یک SignatureDef باشد. |
خالی | |
خالی | setCancelled (بولی لغو شد) پیشرفته: استنتاج را در میانه فراخوانی برای run(Object, Object) قطع می کند. |
یک Interpreter
را راهاندازی میکند.
modelFile | یک فایل از یک مدل TF Lite از پیش آموزش دیده. |
---|
IllegalArgumentException | اگر modelFile یک مدل معتبر TensorFlow Lite را کد نمی کند. |
---|
یک Interpreter
راهاندازی میکند و گزینههایی را برای سفارشیسازی رفتار مفسر مشخص میکند.
modelFile | یک فایل از مدل TF Lite از پیش آموزش دیده |
---|---|
گزینه ها | مجموعه ای از گزینه ها برای سفارشی کردن رفتار مترجم |
IllegalArgumentException | اگر modelFile یک مدل معتبر TensorFlow Lite را کد نمی کند. |
---|
یک Interpreter
با ByteBuffer
یک فایل مدل راه اندازی می کند.
ByteBuffer نباید پس از ساخت یک Interpreter
اصلاح شود. ByteBuffer
می تواند یک MappedByteBuffer
باشد که حافظه یک فایل مدل را نقشه برداری می کند، یا یک ByteBuffer
مستقیم از NativeOrder() که حاوی محتوای بایت های یک مدل است.
بایت بافر |
---|
IllegalArgumentException | اگر byteBuffer یک MappedByteBuffer یا یک ByteBuffer مستقیم از nativeOrder نباشد. |
---|
یک Interpreter
با یک ByteBuffer
از یک فایل مدل و مجموعه ای از Interpreter.Options
سفارشی راه اندازی می کند.
ByteBuffer
نباید پس از ساخت یک Interpreter
اصلاح شود. ByteBuffer
می تواند یک MappedByteBuffer
باشد که حافظه یک فایل مدل را نقشه برداری می کند، یا یک ByteBuffer
مستقیم از NativeOrder() که حاوی محتوای بایت های یک مدل است.
بایت بافر | |
---|---|
گزینه ها |
IllegalArgumentException | اگر byteBuffer یک MappedByteBuffer یا یک ByteBuffer مستقیم از nativeOrder نباشد. |
---|
در صورت لزوم، تخصیص ها را برای همه تانسورها به صراحت به روز می کند.
این اشکال و تخصیص حافظه را برای تانسورهای وابسته با استفاده از شکل(های) تانسور ورودی همانطور که داده شد منتشر می کند.
توجه: این تماس *صرفا اختیاری* است. اگر اندازه هر یک از تانسورهای ورودی تغییر کرده باشد، تخصیص تانسور به طور خودکار در طول اجرا اتفاق میافتد. این فراخوانی در تعیین اشکال برای هر تانسور خروجی قبل از اجرای نمودار بسیار مفید است، به عنوان مثال،
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
را منتشر کنید.
با توجه به نام عملیات ورودی، فهرست ورودی را دریافت می کند.
opName |
---|
تانسور مرتبط با شاخص ورودی ارائه شده را دریافت می کند.
InputIndex |
---|
تعداد تانسورهای ورودی را بدست می آورد.
تانسور مرتبط با نام ورودی ارائه شده و نام روش امضا را دریافت می کند.
هشدار: این یک API آزمایشی است و ممکن است تغییر کند.
نام ورودی | نام را در امضا وارد کنید |
---|---|
کلید امضا | اگر مدل دارای یک امضا باشد، کلید امضا که SignatureDef را شناسایی می کند، می تواند تهی باشد. |
IllegalArgumentException | اگر inputName یا signatureKey خالی یا خالی باشد، یا نام نامعتبر ارائه شود. |
---|
زمان استنتاج بومی را برمیگرداند.
با توجه به نام عملیاتی خروجی، شاخص خروجی را دریافت می کند.
opName |
---|
تانسور مرتبط با شاخص خروجی ارائه شده را دریافت می کند.
توجه: جزئیات تانسور خروجی (به عنوان مثال، شکل) ممکن است تا پس از اجرای استنتاج به طور کامل پر نشوند. اگر *قبل از* اجرای استنتاج به جزئیات به روز نیاز دارید (به عنوان مثال، پس از تغییر اندازه یک تانسور ورودی، که ممکن است اشکال تانسور خروجی را باطل کند)، از allocateTensors()
استفاده کنید تا به صراحت تخصیص و انتشار شکل را فعال کنید. توجه داشته باشید که برای نمودارهایی با اشکال خروجی که وابسته به *مقدارهای* ورودی هستند، شکل خروجی ممکن است تا زمان استنتاج به طور کامل مشخص نشود.
OutputIndex |
---|
تعداد تانسورهای خروجی را بدست می آورد.
تانسور مرتبط با نام خروجی ارائه شده را در روش امضای خاص دریافت می کند.
توجه: جزئیات تانسور خروجی (به عنوان مثال، شکل) ممکن است تا پس از اجرای استنتاج به طور کامل پر نشوند. اگر *قبل از* اجرای استنتاج به جزئیات به روز نیاز دارید (به عنوان مثال، پس از تغییر اندازه یک تانسور ورودی، که ممکن است اشکال تانسور خروجی را باطل کند)، از allocateTensors()
استفاده کنید تا به صراحت تخصیص و انتشار شکل را فعال کنید. توجه داشته باشید که برای نمودارهایی با اشکال خروجی که وابسته به *مقدارهای* ورودی هستند، شکل خروجی ممکن است تا زمان استنتاج به طور کامل مشخص نشود.
هشدار: این یک API آزمایشی است و ممکن است تغییر کند.
outputName | نام خروجی در امضا |
---|---|
کلید امضا | اگر مدل دارای یک امضا باشد، کلید امضا که SignatureDef را شناسایی می کند، می تواند تهی باشد. |
IllegalArgumentException | اگر outputName یا signatureKey خالی یا خالی باشد، یا نام نامعتبر ارائه شود. |
---|
لیست ورودی های SignatureDefs را برای متد signatureKey
دریافت می کند.
هشدار: این یک API آزمایشی است و ممکن است تغییر کند.
کلید امضا |
---|
فهرستی از نامهای روش صادر شده SignatureDef موجود در مدل را دریافت میکند.
هشدار: این یک API آزمایشی است و ممکن است تغییر کند.
لیستی از خروجی های SignatureDefs را برای متد signatureKey
دریافت می کند.
هشدار: این یک API آزمایشی است و ممکن است تغییر کند.
کلید امضا |
---|
Advanced: همه تانسورهای متغیر را به مقدار پیش فرض بازنشانی می کند.
اگر تانسور متغیر دارای بافر مرتبط نباشد، به صفر بازنشانی میشود.
هشدار: این یک API آزمایشی است و ممکن است تغییر کند.
اندازه ورودی idx-امین مدل بومی را به کمرنگهای داده شده تغییر میدهد.
وقتی «سخت» True باشد، فقط ابعاد ناشناخته را می توان تغییر اندازه داد. ابعاد ناشناخته به عنوان "-1" در آرایه ای که توسط "Tensor.shapeSignature()" برگردانده شده است نشان داده می شود.
idx | |
---|---|
کم نور می کند | |
سخت گیرانه |
اندازه ورودی idx-امین مدل بومی را به کمرنگهای داده شده تغییر میدهد.
idx | |
---|---|
کم نور می کند |
استنتاج مدل را در صورتی اجرا می کند که مدل فقط یک ورودی بگیرد و تنها یک خروجی ارائه دهد.
هشدار: اگر یک Buffer
(ترجیحاً مستقیم، اما لازم نیست) به عنوان نوع داده ورودی/خروجی استفاده شود، API کارآمدتر است. لطفاً از Buffer
برای تغذیه و واکشی داده های اولیه برای عملکرد بهتر استفاده کنید. انواع Buffer
بتن زیر پشتیبانی می شود:
-
ByteBuffer
- سازگار با هر نوع Tensor ابتدایی زیرین. -
FloatBuffer
- سازگار با تانسورهای شناور. -
IntBuffer
- سازگار با تانسورهای int32. -
LongBuffer
- سازگار با تانسورهای int64.
Buffer
یا به عنوان ورودی های اسکالر. ورودی | یک آرایه یا آرایه چند بعدی یا یک Buffer از انواع ابتدایی شامل int، float، long و byte. Buffer روش ترجیحی برای ارسال داده های ورودی بزرگ برای انواع اولیه است، در حالی که انواع رشته ها نیاز به استفاده از مسیر ورودی آرایه (چند بعدی) دارند. هنگامی که یک Buffer استفاده می شود، محتوای آن باید تا زمانی که استنتاج مدل انجام نشود، بدون تغییر باقی بماند و تماس گیرنده باید اطمینان حاصل کند که Buffer در موقعیت خواندن مناسب است. یک مقدار null فقط در صورتی مجاز است که تماس گیرنده از یک Delegate استفاده کند که اجازه تعامل با کنترل بافر را می دهد و چنین بافری به Tensor ورودی متصل شده باشد. |
---|---|
خروجی | یک آرایه چند بعدی از داده های خروجی، یا یک Buffer از انواع ابتدایی شامل int، float، long و byte. هنگامی که از Buffer استفاده می شود، تماس گیرنده باید مطمئن شود که موقعیت نوشتن مناسب را تنظیم کرده است. یک مقدار تهی مجاز است و برای موارد خاصی مفید است، به عنوان مثال، اگر تماسگیرنده از یک Delegate استفاده میکند که اجازه تعامل با بافر را میدهد، و چنین بافری به Tensor خروجی متصل شده است (همچنین رجوع کنید به Interpreter.Options#setAllowBufferHandleOutput(boolean) )، یا اگر نمودار خروجی هایی به شکل پویا داشته باشد و تماس گیرنده باید شکل Tensor خروجی را پس از فراخوانی استنتاج جستجو کند و داده ها را مستقیماً از تانسور خروجی واکشی کند (از طریق Tensor.asReadOnlyBuffer() ). |
اگر مدل چندین ورودی دریافت کند یا خروجی های متعددی را برمی گرداند، استنتاج مدل را اجرا می کند.
هشدار: اگر Buffer
(ترجیحاً مستقیم، اما لازم نیست) به عنوان انواع داده های ورودی/خروجی استفاده شود، API کارآمدتر است. لطفاً از Buffer
برای تغذیه و واکشی داده های اولیه برای عملکرد بهتر استفاده کنید. انواع Buffer
بتن زیر پشتیبانی می شود:
-
ByteBuffer
- سازگار با هر نوع Tensor ابتدایی زیرین. -
FloatBuffer
- سازگار با تانسورهای شناور. -
IntBuffer
- سازگار با تانسورهای int32. -
LongBuffer
- سازگار با تانسورهای int64.
Buffer
یا به عنوان ورودی های اسکالر. توجه: مقادیر null
برای عناصر منفرد inputs
و outputs
تنها در صورتی مجاز است که تماس گیرنده از یک Delegate
استفاده کند که اجازه تعامل با دسته بافر را می دهد و چنین بافری به Tensor
(های) ورودی یا خروجی مربوطه متصل شده باشد.
ورودی ها | آرایه ای از داده های ورودی ورودی ها باید به ترتیب ورودی های مدل باشند. هر ورودی می تواند یک آرایه یا آرایه چند بعدی یا یک Buffer از انواع اولیه از جمله int، float، long و byte باشد. Buffer روش ترجیحی برای ارسال داده های ورودی بزرگ است، در حالی که انواع رشته ها نیاز به استفاده از مسیر ورودی آرایه (چند بعدی) دارند. هنگامی که Buffer استفاده می شود، محتوای آن باید تا زمانی که استنتاج مدل انجام شود، بدون تغییر باقی بماند و تماس گیرنده باید اطمینان حاصل کند که Buffer در موقعیت خواندن مناسب است. |
---|---|
خروجی ها | نقشهای که شاخصهای خروجی را به آرایههای چند بعدی دادههای خروجی یا Buffer از انواع ابتدایی شامل int، float، long و byte نگاشت میکند. برای استفاده از خروجی ها فقط باید ورودی ها را حفظ کند. هنگامی که از Buffer استفاده می شود، تماس گیرنده باید مطمئن شود که موقعیت نوشتن مناسب را تنظیم کرده است. نقشه ممکن است برای مواردی که از دستههای بافر برای دادههای تانسور خروجی استفاده میشود، یا مواردی که خروجیها به صورت پویا شکل میگیرند و تماسگیرنده باید شکل Tensor خروجی را پس از فراخوانی استنتاج جستجو کند، و دادهها را مستقیماً از تانسور خروجی واکشی کند، خالی باشد. از طریق Tensor.asReadOnlyBuffer() ). |
همانند runSignature(Map, Map, String)
اما نیازی به ارسال signatureKey ندارد، با فرض اینکه مدل دارای یک SignatureDef باشد. اگر مدل بیش از یک SignatureDef داشته باشد یک استثنا ایجاد می کند.
هشدار: این یک API آزمایشی است و ممکن است تغییر کند.
ورودی ها | |
---|---|
خروجی ها |
استنتاج مدل را بر اساس SignatureDef ارائه شده از طریق signatureKey
اجرا می کند.
برای جزئیات بیشتر در مورد انواع داده های ورودی و خروجی مجاز به run(Object, Object)
مراجعه کنید.
هشدار: این یک API آزمایشی است و ممکن است تغییر کند.
ورودی ها | نقشه ای از نام ورودی در SignatureDef به یک شی ورودی. |
---|---|
خروجی ها | نقشه ای از نام خروجی در SignatureDef برای خروجی داده ها. اگر تماس گیرنده بخواهد مستقیماً پس از استنتاج از داده های Tensor پرس و جو کند، ممکن است خالی باشد (مثلاً اگر شکل خروجی پویا باشد یا از دسته های بافر خروجی استفاده شود). |
کلید امضا | کلید امضا برای شناسایی SignatureDef. |
IllegalArgumentException | اگر inputs تهی یا خالی هستند، اگر outputs یا signatureKey تهی باشد، یا اگر هنگام اجرای استنتاج خطایی رخ دهد. |
---|
پیشرفته: استنتاج را در میانه فراخوانی برای run(Object, Object)
قطع می کند.
با فراخوانی این تابع، یک پرچم لغو روی true تنظیم می شود. مفسر پرچم بین فراخوانهای Op را بررسی میکند و اگر true
باشد، مفسر اجرا را متوقف میکند. مفسر تا زمانی که به صراحت توسط setCancelled(false)
"لغو نشده" شود، در حالت لغو باقی می ماند.
هشدار: این یک API آزمایشی است و ممکن است تغییر کند.
لغو شد | true برای لغو استنتاج به بهترین روش. false برای از سرگیری. |
---|
IllegalStateException | اگر مفسر با گزینه cancellable که به طور پیش فرض خاموش است مقداردهی اولیه نشده باشد. |
---|