InterpreterApi

الواجهة العامة InterpreterApi
الفئات الفرعية المعروفة غير المباشرة

واجهة إلى مترجم نموذج TensorFlow Lite، باستثناء الطرق التجريبية

يتم تضمين نموذج TensorFlow Lite في مثيل InterpreterApi الذي تم تدريبه مسبقًا، حيث يتم تنفيذ العمليات لاستنتاج النموذج.

على سبيل المثال، إذا كان أحد النماذج يأخذ إدخالاً واحدًا فقط ويعرض ناتجًا واحدًا فقط:

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 مقارنةً بالإصدار 19 من واجهة NDK API. يمكن أن تعمل هذه الميزة مع مستويات واجهة برمجة تطبيقات Android التي تقلّ عن 19 عامًا، ولكنّها غير مضمونة.

الصفوف المتداخلة

صنف InterpreterApi.Options فئة خيارات للتحكّم في سلوك المترجم الفوري في وقت التشغيل

الطرق العامة

تجريدي باطل
allocateTensors()
تحدّث التوزيعات بشكل صريح لجميع الموترات، إذا لزم الأمر.
تجريدي باطل
Close()
إلغاء حجز الموارد المرتبطة بالمثيل InterpreterApi
ثابت InterpreterApi
create(خيارات نموذج File FileFile، خيارات InterpreterApi.Options)
تنشئ هذه الدالة مثيل InterpreterApi باستخدام النموذج والخيارات المحدّدة.
ثابت InterpreterApi
create(خيارات ByteBuffer byteBuffer، InterpreterApi.Options)
تنشئ هذه الدالة مثيل InterpreterApi باستخدام النموذج والخيارات المحدّدة.
تجريدي عدد صحيح
getInputIndex(سلسلة opName)
للحصول على فهرس لمدخل يحدد اسم العملية للمدخل.
تجريدي مستشعر
getInputTensor(int enterIndex)
للحصول على Tensor المرتبط بفهرس الإدخال المقدم.
تجريدي عدد صحيح
getInputTensorCount()
للحصول على عدد موترات الإدخال.
تجريدي طويل
getLastNativeInferenceDurationNanoseconds()
تعرض توقيت الاستنتاج الأصلي.
تجريدي عدد صحيح
getOutputIndex(سلسلة opName)
للحصول على فهرس مُخرج وفقًا لاسم عملية للمخرجات.
تجريدي مستشعر
getOutputTensor(int generateIndex)
للحصول على Tensor المرتبط بفهرس الإخراج المقدم.
تجريدي عدد صحيح
getOutputTensorCount()
للحصول على عدد موجات المخرجات.
تجريدي باطل
resizeInput(int idx, int[] dims, boolean strict)
لتغيير حجم الإدخال رقم التعريف ID للنموذج الأصلي إلى وحدات تعتيم محددة.
تجريدي باطل
resizeInput(int idx, int[] Dis)
لتغيير حجم الإدخال رقم التعريف ID للنموذج الأصلي إلى وحدات تعتيم محددة.
تجريدي باطل
run(إدخال كائن، إخراج كائن)
يتم تشغيل استنتاج نموذج إذا كان النموذج يأخذ إدخالاً واحدًا فقط ويقدّم ناتجًا واحدًا فقط.
تجريدي باطل
runForMultipleInputsOutputs(إدخالات Object[]، ومخرجات خريطة<عدد صحيح، ومخرجات كائن>)
يتم تشغيل استنتاج النموذج إذا أخذ النموذج مدخلات متعددة أو يعرض مخرجات متعددة.

الطرق المكتسَبة

الطرق العامة

متاح للجميع مقتطف تجريدي فارغ 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...

ملاحظة: تحتوي بعض الرسومات البيانية على مخرجات ذات شكل ديناميكي، وفي هذه الحالة قد لا يتم نشر شكل الناتج بالكامل إلى أن يتم تنفيذ الاستنتاج.

الرميات
IllegalStateException إذا تعذّر تخصيص موترات الرسم البياني بنجاح.

علني ملخص تجريدي خالٍ إغلاق ()

إلغاء حجز الموارد المرتبطة بالمثيل InterpreterApi

public static InterpreterApi create (File formFile، خيارات InterpreterApi.Options)

تنشئ هذه الدالة مثيل InterpreterApi باستخدام النموذج والخيارات المحدّدة. سيتم تحميل النموذج من ملف.

المَعلمات
modelFile ملف يحتوي على نموذج TF Lite مدرّب مسبقًا.
الخيارات مجموعة من الخيارات لتخصيص سلوك المترجم الفوري.
الرميات
IllegalArgumentException إذا لم يتم ترميز نموذج TensorFlow Lite للترميز modelFile.

public static InterpreterApi إنشاء (ByteBuffer byteBuffer، خيارات InterpreterApi.Options)

تنشئ هذه الدالة مثيل InterpreterApi باستخدام النموذج والخيارات المحدّدة. ستتم قراءة النموذج من خلال ByteBuffer.

المَعلمات
byteBuffer نموذج TF Lite مدرّب مسبقًا، في شكل تسلسلي ثنائي. يجب عدم تعديل ByteBuffer بعد إنشاء مثيل InterpreterApi. يمكن أن تكون السمة ByteBuffer إما MappedByteBuffer يضبط الذاكرة على ملف نموذج أو ByteBuffer مباشر للقيم الأصليةOrder() يحتوي على محتوى البايت الخاص بنموذج.
الخيارات مجموعة من الخيارات لتخصيص سلوك المترجم الفوري.
الرميات
IllegalArgumentException إذا لم يكن byteBuffer MappedByteBuffer أو ByteBuffer مباشرًا من الأصليOrder.

public تجريدي int getInputIndex (سلسلة opName)

للحصول على فهرس لمدخل يحدد اسم العملية للمدخل.

المَعلمات
opName
الرميات
IllegalArgumentException إذا كانت السمة opName لا تتطابق مع أي إدخال في النموذج المستخدَم لإعداد خدمة الترجمة الفورية.

عام تجريدي Tensor getInputTensor (int enterIndex)

للحصول على Tensor المرتبط بفهرس الإدخال المقدم.

المَعلمات
inputIndex
الرميات
IllegalArgumentException إذا كانت قيمة inputIndex سالبة أو ليست أصغر من عدد إدخالات النموذج.

public تجريدي int getInputTensorCount ()

للحصول على عدد موترات الإدخال.

متاح للجميع ملخّص طويل getLastNativeInferenceDurationNanoseconds ()

تعرض توقيت الاستنتاج الأصلي.

الرميات
IllegalArgumentException إذا لم يتم إعداد النموذج من خلال أداة الترجمة الفورية.

متاح للجميع ملخّص int getOutputIndex (سلسلة opName)

للحصول على فهرس مُخرج وفقًا لاسم عملية للمخرجات.

المَعلمات
opName
الرميات
IllegalArgumentException إذا لم تتطابق السمة opName مع أي ناتج في النموذج المستخدَم لإعداد خدمة الترجمة الفورية.

متاح للجميع مجرد getOutputTensor

للحصول على Tensor المرتبط بفهرس الإخراج المقدم.

ملاحظة: قد لا تتم تعبئة تفاصيل موصّل الإخراج (مثل الشكل) بالكامل إلا بعد تنفيذ الاستنتاج. إذا كنت بحاجة إلى تعديل تفاصيل *قبل* تنفيذ الاستنتاج (على سبيل المثال، بعد تغيير حجم موتّر الإدخال، ما قد يؤدي إلى إلغاء صلاحية أشكال مجسّم الإخراج)، استخدِم allocateTensors() لتشغيل التخصيص ونشر الأشكال بشكل صريح. بالنسبة إلى الرسوم البيانية التي تتضمّن أشكال الإخراج التي تعتمد على *قيم* الإدخال، قد لا يتم تحديد شكل الناتج بالكامل إلى أن يتم تنفيذ الاستنتاج.

المَعلمات
outputIndex
الرميات
IllegalArgumentException إذا كانت قيمة outputIndex سالبة أو لم تكن أصغر من عدد نتائج النموذج.

public تجريدي int getOutputTensorCount ()

للحصول على عدد موجات المخرجات.

public ملخّص تجريدي خالٍ resizeInput (int idx, int[] dims, boolean strict)

لتغيير حجم الإدخال رقم التعريف ID للنموذج الأصلي إلى وحدات تعتيم محددة.

عندما تكون قيمة "strict" صحيحة، لا يمكن تغيير حجم سوى الأبعاد غير المعروفة فقط. تتم الإشارة إلى الأبعاد غير المعروفة على أنّها "-1" في الصفيف الذي يعرضه "Tensor.shapeSignature() ".

المَعلمات
idx
dims
متشدّد
الرميات
IllegalArgumentException إذا كانت السمة idx سالبة أو لم تكن أصغر من عدد إدخالات النموذج، أو في حال حدوث خطأ عند تغيير حجم إدخال رقم التعريف الدولي. بالإضافة إلى ذلك، يحدث الخطأ عند محاولة تغيير حجم متوتر بأبعاد ثابتة عندما تكون قيمة `strict` True.

متاح للجميع ملخّص تجريدي فارغ resizeInput (int idx, int[] Dis)

لتغيير حجم الإدخال رقم التعريف ID للنموذج الأصلي إلى وحدات تعتيم محددة.

المَعلمات
idx
dims
الرميات
IllegalArgumentException إذا كانت السمة idx سالبة أو لم تكن أصغر من عدد إدخالات النموذج، أو في حال حدوث خطأ عند تغيير حجم إدخال رقم التعريف الدولي.

متاح للجميع ملخّص تجريدي فارغ run (إدخال كائن، ومخرجات كائن)

يتم تشغيل استنتاج نموذج إذا كان النموذج يأخذ إدخالاً واحدًا فقط ويقدّم ناتجًا واحدًا فقط.

تحذير: تكون واجهة برمجة التطبيقات أكثر فعالية إذا تم استخدام Buffer (يُفضَّل أن تكون مباشرة، ولكنها غير مطلوبة) كنوع بيانات الإدخال/الإخراج. ننصحك باستخدام السمة Buffer لخلاصة البيانات الأساسية واسترجاعها لتحقيق أداء أفضل. يُسمح باستخدام أنواع Buffer الملموسة التالية:

  • ByteBuffer: متوافق مع أي نوع Tensor أساسي أساسي.
  • FloatBuffer: متوافقة مع أجهزة Tensor العائمة.
  • "IntBuffer" متوافق مع أجهزة int32 Tensors.
  • LongBuffer: متوافق مع أجهزة int64 Tensors
يُرجى العلم أنّ الأنواع المنطقية متاحة فقط كصفائف، وليس Buffer كمدخلات عددية.

المَعلمات
مصدر الإدخال مصفوفة أو مصفوفة متعددة الأبعاد، أو Buffer من الأنواع الأساسية، بما في ذلك عدد صحيح، وعدد عشري، وطويل، وبايت. إنّ العلامة Buffer هي الطريقة المفضّلة لتمرير بيانات إدخال كبيرة للأنواع الأساسية، في حين تتطلب أنواع السلاسل استخدام مسار إدخال المصفوفة (متعددة الأبعاد). عند استخدام Buffer، يجب أن يبقى محتواه بدون تغيير إلى أن يتم استنتاج النموذج، ويجب أن يتأكّد المتصل من ضبط Buffer في موضع القراءة المناسب. غير مسموح بالقيمة null إلا إذا كان المتصل يستخدم Delegate يتيح إمكانية التشغيل التفاعلي لمقبض المخزن المؤقت، وتم ربط هذا المخزن المؤقت بالإدخال Tensor.
الإنتاج مصفوفة متعددة الأبعاد من بيانات المخرجات أو Buffer من الأنواع الأساسية، بما في ذلك عدد صحيح وعدد عشري وطويل وبايت. عند استخدام Buffer، يجب أن يتأكّد المتصل من ضبطه على موضع الكتابة المناسب. ويُسمح باستخدام قيمة فارغة وهي مفيدة في حالات معيّنة، على سبيل المثال إذا كان المتصل يستخدم Delegate يتيح إمكانية التشغيل التفاعلي للمخزن المؤقت، وتم ربط هذا المخزن المؤقت بالمخرجات Tensor (راجِع أيضًا Interpreter.Options#setAllowBufferHandleOutput(boolean))، أو إذا كان الرسم البياني يستخدم مخرجات على شكل أشكال بشكل ديناميكي، ويجب أن يحصل المتصل على مخرجات بشكل ديناميكي من خلال Tensor.Tensor.asReadOnlyBuffer()
الرميات
IllegalArgumentException إذا كان input فارغًا أو فارغًا، أو في حال حدوث خطأ عند إجراء الاستنتاج.
IllegalArgumentException (ميزة تجريبية، عرضة للتغيير) إذا تمت مقاطعة الاستنتاج بمقدار setCancelled(true).

متاح للجميع مجرد runForMultipleInputsOutputs

يتم تشغيل استنتاج النموذج إذا أخذ النموذج مدخلات متعددة أو يعرض مخرجات متعددة.

تحذير: تكون واجهة برمجة التطبيقات أكثر فعالية في حال استخدام Buffer (يُفضَّل أن تكون مباشرة، ولكنها غير مطلوبة) كأنواع بيانات الإدخال/الإخراج. ننصحك باستخدام السمة Buffer لخلاصة البيانات الأساسية واسترجاعها لتحقيق أداء أفضل. يُسمح باستخدام أنواع Buffer الملموسة التالية:

  • ByteBuffer: متوافق مع أي نوع Tensor أساسي أساسي.
  • FloatBuffer: متوافقة مع أجهزة Tensor العائمة.
  • "IntBuffer" متوافق مع أجهزة int32 Tensors.
  • LongBuffer: متوافق مع أجهزة int64 Tensors
يُرجى العلم أنّ الأنواع المنطقية متاحة فقط كصفائف، وليس Buffer كمدخلات عددية.

ملاحظة: لا يُسمح بالقيم null للعناصر غير المرئية في الترميزَين inputs وoutputs إلا إذا كان المتصل يستخدم Delegate يسمح بإمكانية التشغيل التفاعلي لمقبض المخزن المؤقت، وتم ربط هذا المخزن المؤقت بالمدخلات أو الإخراج المقابلة Tensor.

المَعلمات
المدخلات صفيفة من بيانات الإدخال. يجب أن تكون المدخلات بنفس ترتيب مدخلات النموذج. يمكن أن يكون كل إدخال مصفوفة أو مصفوفة متعددة الأبعاد، أو Buffer من الأنواع الأساسية، بما في ذلك عدد صحيح وعدد عشري وطويل وبايت. إنّ Buffer هي الطريقة المفضّلة لتمرير بيانات إدخال كبيرة، في حين تتطلب أنواع السلاسل استخدام مسار إدخال المصفوفة (متعددة الأبعاد). عند استخدام السمة Buffer، يجب أن يبقى المحتوى بدون تغيير إلى أن يتم استنتاج النموذج، ويجب أن يتأكّد المتصل من ضبط Buffer في موضع القراءة المناسب.
المخرجات مؤشرات ناتج تعيين الخريطة إلى مصفوفات متعدّدة الأبعاد من البيانات الناتجة أو Buffer من الأنواع الأساسية، بما في ذلك عدد صحيح وعدد عشري وطويل وبايت. وتحتاج فقط إلى الاحتفاظ بالإدخالات حتى يتم استخدام المخرجات. عند استخدام Buffer، يجب أن يتأكّد المتصل من ضبطه على موضع الكتابة المناسب. قد تكون الخريطة فارغة في الحالات التي يتم فيها استخدام مقابض المخزن المؤقت مع بيانات منظّم الإخراج، أو الحالات التي يتم فيها تشكيل المخرجات ديناميكيًا ويجب على المتصل الاستعلام عن شكل Tensor الناتج بعد استدعاء الاستنتاج، واسترجاع البيانات مباشرةً من موصّل الإخراج (عبر Tensor.asReadOnlyBuffer()).
الرميات
IllegalArgumentException إذا كان inputs فارغًا أو فارغًا، أو إذا كان outputs فارغًا، أو إذا حدث خطأ عند تنفيذ الاستنتاج.