الفئات الفرعية غير المباشرة المعروفة |
واجهة لمترجم نموذج 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 عبر فئة Tensor
، المتوفرة عبر getInputTensor(int)
و getOutputTensor(int)
.
تحذير: مثيلات InterpreterApi
ليست آمنة لمؤشر الترابط.
تحذير: يمتلك مثيل InterpreterApi
الموارد التي يجب تحريرها بشكل صريح عن طريق استدعاء close()
تم إنشاء مكتبة TFLite وفقًا لـ NDK API 19. وقد تعمل مع مستويات Android API الأقل من 19، ولكنها غير مضمونة.
فئات متداخلة
فصل | InterpreterApi.Options | فئة خيارات للتحكم في سلوك مترجم وقت التشغيل. |
الأساليب العامة
الفراغ المجرد | تخصيص Tensors () يقوم بتحديث التخصيصات بشكل صريح لجميع الموترات، إذا لزم الأمر. |
الفراغ المجرد | يغلق () قم بتحرير الموارد المرتبطة بمثيل InterpreterApi . |
واجهة برمجة التطبيقات الثابتة | إنشاء ( ملف modelFile، خيارات InterpreterApi.Options ) إنشاء مثيل InterpreterApi ، باستخدام النموذج والخيارات المحددة. |
واجهة برمجة التطبيقات الثابتة | إنشاء (خيارات ByteBuffer byteBuffer و InterpreterApi.Options ) إنشاء مثيل InterpreterApi ، باستخدام النموذج والخيارات المحددة. |
كثافة العمليات مجردة | |
الموتر مجردة | getInputTensor (int inputIndex) يحصل على Tensor المرتبط بفهرس الإدخال المقدم. |
كثافة العمليات مجردة | getInputTensorCount () الحصول على عدد موترات الإدخال. |
مجردة طويلة | getLastNativeInferenceDurationNanothans () إرجاع توقيت الاستدلال الأصلي. |
كثافة العمليات مجردة | |
الموتر مجردة | getOutputTensor (intputIndex) يحصل على Tensor المرتبط بفهرس الإخراج المقدم. |
كثافة العمليات مجردة | getOutputTensorCount () الحصول على عدد Tensors الإخراج. |
الفراغ المجرد | تغيير حجم الإدخال (int idx، int[] dims، boolean الصارمة) يقوم بتغيير حجم إدخال idx-th للنموذج الأصلي إلى القيم المعتمة. |
الفراغ المجرد | تغيير حجم الإدخال (int idx، int[] dims) يقوم بتغيير حجم إدخال idx-th للنموذج الأصلي إلى القيم المعتمة. |
الفراغ المجرد | |
الفراغ المجرد | runForMultipleInputsOutputs (مدخلات الكائن [] ، خريطة < عدد صحيح ، كائن > النواتج) يتم تشغيل استنتاج النموذج إذا كان النموذج يأخذ مدخلات متعددة، أو يقوم بإرجاع مخرجات متعددة. |
الطرق الموروثة
الأساليب العامة
تخصيص الفراغ الملخص العام Tensors ()
يقوم بتحديث التخصيصات بشكل صريح لجميع الموترات، إذا لزم الأمر.
سيؤدي هذا إلى نشر الأشكال وتخصيصات الذاكرة للموترات التابعة باستخدام شكل (أشكال) موتر الإدخال كما هو محدد.
ملحوظة: هذه المكالمة *اختيارية تمامًا*. سيحدث تخصيص الموتر تلقائيًا أثناء التنفيذ إذا تم تغيير حجم أي موترات إدخال. يعد هذا الاستدعاء مفيدًا للغاية في تحديد الأشكال لأي موترات مخرجات قبل تنفيذ الرسم البياني، على سبيل المثال،
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...
ملاحظة: تحتوي بعض الرسوم البيانية على مخرجات ذات شكل ديناميكي، وفي هذه الحالة قد لا يتم نشر شكل المخرجات بشكل كامل حتى يتم تنفيذ الاستدلال.
رميات
IllegalStateException | إذا لم يكن من الممكن تخصيص موترات الرسم البياني بنجاح. |
---|
إغلاق الفراغ الملخص العام ()
قم بتحرير الموارد المرتبطة بمثيل InterpreterApi
.
إنشاء InterpreterApi ثابت عام ( ملف modelFile، خيارات InterpreterApi.Options )
إنشاء مثيل InterpreterApi
، باستخدام النموذج والخيارات المحددة. سيتم تحميل النموذج من ملف.
حدود
modelFile | ملف يحتوي على نموذج TF Lite مُدرب مسبقًا. |
---|---|
خيارات | مجموعة من الخيارات لتخصيص سلوك المترجم. |
رميات
IllegalArgumentException | إذا لم يقم modelFile بتشفير نموذج TensorFlow Lite صالح. |
---|
إنشاء InterpreterApi ثابت عام (خيارات ByteBuffer byteBuffer و InterpreterApi.Options )
إنشاء مثيل InterpreterApi
، باستخدام النموذج والخيارات المحددة. ستتم قراءة النموذج من ByteBuffer
.
حدود
byteBuffer | نموذج TF Lite مُدرب مسبقًا، في شكل متسلسل ثنائي. لا ينبغي تعديل ByteBuffer بعد إنشاء مثيل InterpreterApi . يمكن أن يكون ByteBuffer إما MappedByteBuffer الذي يقوم بتعيين ملف نموذج من الذاكرة، أو ByteBuffer المباشر لـ originalOrder() الذي يحتوي على محتوى البايتات الخاصة بالنموذج. |
---|---|
خيارات | مجموعة من الخيارات لتخصيص سلوك المترجم. |
رميات
IllegalArgumentException | إذا لم يكن byteBuffer MappedByteBuffer ولا ByteBuffer مباشرًا لـ originalOrder. |
---|
الملخص العام int getInputIndex ( String opName)
يحصل على فهرس الإدخال بالنظر إلى اسم العملية للإدخال.
حدود
اسم العملية |
---|
رميات
IllegalArgumentException | إذا كان opName لا يطابق أي إدخال في النموذج المستخدم لتهيئة المترجم. |
---|
الملخص العام getInputTensor (int inputIndex)
يحصل على Tensor المرتبط بفهرس الإدخال المقدم.
حدود
inputIndex |
---|
رميات
IllegalArgumentException | إذا كانت inputIndex سالبة أو ليست أصغر من عدد مدخلات النموذج. |
---|
الملخص العام int getInputTensorCount ()
الحصول على عدد موترات الإدخال.
الملخص العام Long getLastNativeInferenceDurationNano Seconds ()
إرجاع توقيت الاستدلال الأصلي.
رميات
IllegalArgumentException | إذا لم تتم تهيئة النموذج بواسطة المترجم. |
---|
الملخص العام int getOutputIndex ( String opName)
يحصل على فهرس الإخراج بالنظر إلى اسم المرجع للإخراج.
حدود
اسم العملية |
---|
رميات
IllegalArgumentException | إذا كان opName لا يطابق أي مخرجات في النموذج المستخدم لتهيئة المترجم. |
---|
الملخص العام getOutputTensor ( intputIndex)
يحصل على Tensor المرتبط بفهرس الإخراج المقدم.
ملحوظة: تفاصيل موتر الإخراج (على سبيل المثال، الشكل) قد لا يتم ملؤها بالكامل إلا بعد تنفيذ الاستدلال. إذا كنت بحاجة إلى تفاصيل محدثة *قبل* تشغيل الاستدلال (على سبيل المثال، بعد تغيير حجم موتر الإدخال، مما قد يؤدي إلى إبطال أشكال موتر الإخراج)، فاستخدم allocateTensors()
لتشغيل التخصيص ونشر الشكل بشكل صريح. لاحظ أنه بالنسبة للرسوم البيانية ذات أشكال المخرجات التي تعتمد على *قيم* الإدخال، فقد لا يتم تحديد شكل المخرجات بشكل كامل حتى يتم تشغيل الاستدلال.
حدود
inputIndex |
---|
رميات
IllegalArgumentException | إذا كان outputIndex سالبًا أو ليس أصغر من عدد مخرجات النموذج. |
---|
الملخص العام int getOutputTensorCount ()
الحصول على عدد Tensors الإخراج.
تغيير حجم الفراغ الملخص العام (int idx، int[] dims، boolean الصارمة)
يقوم بتغيير حجم إدخال idx-th للنموذج الأصلي إلى القيم المعتمة.
عندما تكون القيمة `strict` صحيحة، يمكن تغيير حجم الأبعاد غير المعروفة فقط. تتم الإشارة إلى الأبعاد غير المعروفة كـ `-1` في المصفوفة التي يتم إرجاعها بواسطة Tensor.shapeSignature()`.
حدود
معرف | |
---|---|
يخفت | |
حازم |
رميات
IllegalArgumentException | إذا كانت idx سالبة أو ليست أقل من عدد مدخلات النموذج؛ أو في حالة حدوث خطأ عند تغيير حجم إدخال idx-th. بالإضافة إلى ذلك، يحدث الخطأ عند محاولة تغيير حجم موتر ذي أبعاد ثابتة عندما تكون قيمة `strict` صحيحة. |
---|
تغيير حجم الفراغ الملخص العام (int idx، int[] dims)
يقوم بتغيير حجم إدخال idx-th للنموذج الأصلي إلى القيم المعتمة.
حدود
معرف | |
---|---|
يخفت |
رميات
IllegalArgumentException | إذا كانت idx سالبة أو ليست أقل من عدد مدخلات النموذج؛ أو في حالة حدوث خطأ عند تغيير حجم إدخال idx-th. |
---|
تشغيل الفراغ الملخص العام (إدخال الكائن ، إخراج الكائن )
يتم تشغيل استنتاج النموذج إذا كان النموذج يأخذ مدخلاً واحدًا فقط، ويوفر مخرجًا واحدًا فقط.
تحذير: تكون واجهة برمجة التطبيقات (API) أكثر كفاءة إذا تم استخدام Buffer
(يفضل أن يكون مباشرًا، ولكن ليس مطلوبًا) كنوع بيانات الإدخال/الإخراج. يرجى التفكير في استخدام Buffer
لتغذية وجلب البيانات الأولية للحصول على أداء أفضل. يتم دعم أنواع Buffer
الخرسانية التالية:
-
ByteBuffer
- متوافق مع أي نوع Tensor بدائي أساسي. -
FloatBuffer
- متوافق مع Tensors العائمة. -
IntBuffer
- متوافق مع Tensors int32. -
LongBuffer
- متوافق مع Tensors 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() ). |
رميات
IllegalArgumentException | إذا كان input فارغًا أو فارغًا، أو إذا حدث خطأ عند تشغيل الاستدلال. |
---|---|
IllegalArgumentException | (تجريبي، قابل للتغيير) إذا تمت مقاطعة الاستدلال بواسطة setCancelled(true) . |
runForMultipleInputsOutputs باطلة مجردة عامة (مدخلات Object[] ، خريطة < Integer ، Object > مخرجات)
يتم تشغيل استنتاج النموذج إذا كان النموذج يأخذ مدخلات متعددة، أو يقوم بإرجاع مخرجات متعددة.
تحذير: تكون واجهة برمجة التطبيقات (API) أكثر كفاءة إذا تم استخدام Buffer
(يفضل أن يكون مباشرًا، ولكن ليس مطلوبًا) كأنواع بيانات الإدخال/الإخراج. يرجى التفكير في استخدام Buffer
لتغذية وجلب البيانات الأولية للحصول على أداء أفضل. يتم دعم أنواع Buffer
الخرسانية التالية:
-
ByteBuffer
- متوافق مع أي نوع Tensor بدائي أساسي. -
FloatBuffer
- متوافق مع Tensors العائمة. -
IntBuffer
- متوافق مع Tensors int32. -
LongBuffer
- متوافق مع Tensors int64.
Buffer
، أو كمدخلات عددية. ملاحظة: لا يُسمح بالقيم null
للعناصر الفردية inputs
outputs
إلا إذا كان المتصل يستخدم Delegate
يسمح بالتشغيل البيني لمقبض المخزن المؤقت، وقد تم ربط هذا المخزن المؤقت بالمدخلات أو Tensor
المقابلة.
حدود
المدخلات | مجموعة من البيانات المدخلة. يجب أن تكون المدخلات بنفس ترتيب مدخلات النموذج. يمكن أن يكون كل إدخال عبارة عن مصفوفة أو مصفوفة متعددة الأبعاد، أو Buffer من الأنواع البدائية بما في ذلك int وfloat وlong وbyte. Buffer هو الطريقة المفضلة لتمرير بيانات الإدخال الكبيرة، في حين تتطلب أنواع السلسلة استخدام مسار إدخال المصفوفة (متعدد الأبعاد). عند استخدام Buffer ، يجب أن يظل محتواه دون تغيير حتى يتم استنتاج النموذج، ويجب على المتصل التأكد من أن Buffer في موضع القراءة المناسب. |
---|---|
النواتج | خريطة لتعيين مؤشرات الإخراج إلى صفائف متعددة الأبعاد لبيانات الإخراج أو Buffer للأنواع البدائية بما في ذلك int وfloat وlong وbyte. يحتاج فقط إلى الاحتفاظ بالإدخالات لاستخدام المخرجات. عند استخدام Buffer ، يجب على المتصل التأكد من ضبطه على موضع الكتابة المناسب. قد تكون الخريطة فارغة في الحالات التي يتم فيها استخدام مقابض المخزن المؤقت لبيانات موتر الإخراج، أو الحالات التي يتم فيها تشكيل المخرجات ديناميكيًا ويجب على المتصل الاستعلام عن شكل Tensor الإخراج بعد استدعاء الاستدلال، وجلب البيانات مباشرة من موتر الإخراج ( عبر Tensor.asReadOnlyBuffer() ). |
رميات
IllegalArgumentException | إذا كانت inputs فارغة أو فارغة، إذا كانت outputs فارغة، أو إذا حدث خطأ عند تشغيل الاستدلال. |
---|