الفئات الفرعية المعروفة غير المباشرة |
واجهة إلى مترجم نموذج 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 باستخدام النموذج والخيارات المحدّدة. |
تجريدي عدد صحيح | |
تجريدي مستشعر |
getInputTensor(int enterIndex)
للحصول على Tensor المرتبط بفهرس الإدخال المقدم.
|
تجريدي عدد صحيح |
getInputTensorCount()
للحصول على عدد موترات الإدخال.
|
تجريدي طويل |
getLastNativeInferenceDurationNanoseconds()
تعرض توقيت الاستنتاج الأصلي.
|
تجريدي عدد صحيح | |
تجريدي مستشعر |
getOutputTensor(int generateIndex)
للحصول على Tensor المرتبط بفهرس الإخراج المقدم.
|
تجريدي عدد صحيح |
getOutputTensorCount()
للحصول على عدد موجات المخرجات.
|
تجريدي باطل |
resizeInput(int idx, int[] dims, boolean strict)
لتغيير حجم الإدخال رقم التعريف ID للنموذج الأصلي إلى وحدات تعتيم محددة.
|
تجريدي باطل |
resizeInput(int idx, int[] Dis)
لتغيير حجم الإدخال رقم التعريف ID للنموذج الأصلي إلى وحدات تعتيم محددة.
|
تجريدي باطل | |
تجريدي باطل |
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 فارغًا، أو إذا حدث خطأ عند تنفيذ الاستنتاج.
|
---|