کلاس درایور برای استنتاج مدل با 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) قطع می کند. |
روش های ارثی
سازندگان عمومی
مترجم عمومی ( فایل 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() که حاوی محتوای بایت های یک مدل است.
پارامترها
بایت بافر |
---|
پرتاب می کند
IllegalArgumentException | اگر byteBuffer یک MappedByteBuffer یا یک ByteBuffer مستقیم از nativeOrder نباشد. |
---|
مترجم عمومی ( ByteBuffer byteBuffer، گزینه های Interpreter.Options )
یک Interpreter
با یک ByteBuffer
از یک فایل مدل و مجموعه ای از Interpreter.Options
سفارشی راه اندازی می کند.
ByteBuffer
نباید پس از ساخت یک Interpreter
اصلاح شود. ByteBuffer
می تواند یک MappedByteBuffer
باشد که حافظه یک فایل مدل را نقشه برداری می کند، یا یک ByteBuffer
مستقیم از NativeOrder() که حاوی محتوای بایت های یک مدل است.
پارامترها
بایت بافر | |
---|---|
گزینه ها |
پرتاب می کند
IllegalArgumentException | اگر byteBuffer یک MappedByteBuffer یا یک ByteBuffer مستقیم از nativeOrder نباشد. |
---|
روش های عمومی
public 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
را منتشر کنید.
public int getInputIndex ( رشته opName)
با توجه به نام عملیات ورودی، فهرست ورودی را دریافت می کند.
پارامترها
opName |
---|
تانسور عمومی getInputTensor (int inputIndex)
تانسور مرتبط با شاخص ورودی ارائه شده را دریافت می کند.
پارامترها
InputIndex |
---|
عمومی int getInputTensorCount ()
تعداد تانسورهای ورودی را بدست می آورد.
تانسور عمومی getInputTensorFromSignature (نام ورودی رشته ، کلید امضای رشته )
تانسور مرتبط با نام ورودی ارائه شده و نام روش امضا را دریافت می کند.
هشدار: این یک API آزمایشی است و ممکن است تغییر کند.
پارامترها
نام ورودی | نام را در امضا وارد کنید |
---|---|
کلید امضا | اگر مدل دارای یک امضا باشد، کلید امضا که SignatureDef را شناسایی می کند، می تواند تهی باشد. |
پرتاب می کند
IllegalArgumentException | اگر inputName یا signatureKey خالی یا خالی باشد، یا نام نامعتبر ارائه شود. |
---|
public int getOutputIndex ( رشته opName)
با توجه به نام عملیاتی خروجی، شاخص خروجی را دریافت می کند.
پارامترها
opName |
---|
تانسور عمومی getOutputTensor (int outputIndex)
تانسور مرتبط با شاخص خروجی ارائه شده را دریافت می کند.
توجه: جزئیات تانسور خروجی (به عنوان مثال، شکل) ممکن است تا پس از اجرای استنتاج به طور کامل پر نشوند. اگر *قبل از* اجرای استنتاج به جزئیات به روز نیاز دارید (به عنوان مثال، پس از تغییر اندازه یک تانسور ورودی، که ممکن است اشکال تانسور خروجی را باطل کند)، از allocateTensors()
استفاده کنید تا به صراحت تخصیص و انتشار شکل را فعال کنید. توجه داشته باشید که برای نمودارهایی با اشکال خروجی که وابسته به *مقدارهای* ورودی هستند، شکل خروجی ممکن است تا زمان استنتاج به طور کامل مشخص نشود.
پارامترها
OutputIndex |
---|
عمومی int getOutputTensorCount ()
تعداد تانسورهای خروجی را بدست می آورد.
تانسور عمومی getOutputTensorFromSignature (نام خروجی رشته ، کلید امضای رشته )
تانسور مرتبط با نام خروجی ارائه شده را در روش امضای خاص دریافت می کند.
توجه: جزئیات تانسور خروجی (به عنوان مثال، شکل) ممکن است تا پس از اجرای استنتاج به طور کامل پر نشوند. اگر *قبل از* اجرای استنتاج به جزئیات به روز نیاز دارید (به عنوان مثال، پس از تغییر اندازه یک تانسور ورودی، که ممکن است اشکال تانسور خروجی را باطل کند)، از allocateTensors()
استفاده کنید تا به صراحت تخصیص و انتشار شکل را فعال کنید. توجه داشته باشید که برای نمودارهایی با اشکال خروجی که وابسته به *مقدارهای* ورودی هستند، شکل خروجی ممکن است تا زمان استنتاج به طور کامل مشخص نشود.
هشدار: این یک API آزمایشی است و ممکن است تغییر کند.
پارامترها
outputName | نام خروجی در امضا |
---|---|
کلید امضا | اگر مدل دارای یک امضا باشد، کلید امضا که SignatureDef را شناسایی می کند، می تواند تهی باشد. |
پرتاب می کند
IllegalArgumentException | اگر outputName یا signatureKey خالی یا خالی باشد، یا نام نامعتبر ارائه شود. |
---|
رشته عمومی[] getSignatureInputs ( String signatureKey)
لیست ورودی های SignatureDefs را برای متد signatureKey
دریافت می کند.
هشدار: این یک API آزمایشی است و ممکن است تغییر کند.
پارامترها
کلید امضا |
---|
رشته عمومی[] getSignatureKeys ()
فهرستی از نامهای روش صادر شده SignatureDef موجود در مدل را دریافت میکند.
هشدار: این یک API آزمایشی است و ممکن است تغییر کند.
رشته عمومی[] getSignatureOutputs ( String signatureKey)
لیستی از خروجی های SignatureDefs را برای متد signatureKey
دریافت می کند.
هشدار: این یک API آزمایشی است و ممکن است تغییر کند.
پارامترها
کلید امضا |
---|
عمومی void resetVariableTensors ()
Advanced: همه تانسورهای متغیر را به مقدار پیش فرض بازنشانی می کند.
اگر تانسور متغیر دارای بافر مرتبط نباشد، به صفر بازنشانی میشود.
هشدار: این یک API آزمایشی است و ممکن است تغییر کند.
public void resizeInput (int idx, int[] dims, boolean strict)
اندازه ورودی idx-امین مدل بومی را به کمرنگهای داده شده تغییر میدهد.
وقتی «سخت» True باشد، فقط ابعاد ناشناخته را می توان تغییر اندازه داد. ابعاد ناشناخته به عنوان "-1" در آرایه ای که توسط "Tensor.shapeSignature()" برگردانده شده است نشان داده می شود.
پارامترها
idx | |
---|---|
کم نور می کند | |
سختگیر |
public void resizeInput (int idx, int[] dims)
اندازه ورودی 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() ). |
public void runForMultipleInputsOutputs ( ورودی های Object[] ، Map < Integer ، Object > خروجی ها)
اگر مدل چندین ورودی دریافت کند یا خروجی های متعددی را برمی گرداند، استنتاج مدل را اجرا می کند.
هشدار: اگر 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() ). |
عمومی void runSignature ( Map < رشته ، شی > ورودی ها، نقشه < رشته ، شی > خروجی ها)
همانند runSignature(Map, Map, String)
اما نیازی به ارسال signatureKey ندارد، با فرض اینکه مدل دارای یک SignatureDef باشد. اگر مدل بیش از یک SignatureDef داشته باشد یک استثنا ایجاد می کند.
هشدار: این یک API آزمایشی است و ممکن است تغییر کند.
پارامترها
ورودی ها | |
---|---|
خروجی ها |
عمومی void runSignature ( Map < رشته ، شی > ورودی ها، نقشه < رشته ، شی > خروجی ها، رشته امضا کلید)
استنتاج مدل را بر اساس 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 که به طور پیش فرض خاموش است مقداردهی اولیه نشده باشد. |
---|