الفئات الفرعية المعروفة غير المباشرة |
الواجهة إلى أداة الترجمة الفورية لنموذج 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 نموذج مع توكو، وكذلك الأشكال الافتراضية للمدخلات.
عند توفير المُدخلات كصفائف (متعددة الأبعاد)، سيتم إدخال مؤشرات
ضمنيًا وفقًا لشكل تلك الصفيفة. عند توفير الإدخالات على هيئة أنواع Buffer
، لا يتم تنفيذ أي تغيير ضمني لتغيير الحجم. يجب أن يتأكد المتصل من أنّ حجم Buffer
بايت يتطابق مع حجم متّسِر المقابل، أو أنّه يتطابق أولاً
قم بتغيير حجم وحدة متيسرة عبر resizeInput(int, int[])
. يمكن تغيير معلومات شكل الموتّر ونوعه
يتم الحصول عليها من خلال الفئة Tensor
المتاحة عبر getInputTensor(int)
وgetOutputTensor(int)
.
تحذير: مثيلات InterpreterApi
غير آمنة لسلاسل المحادثات.
تحذير: يمتلك المثيل InterpreterApi
موارد يجب أن تكون
تم تحريره صراحةً من خلال استدعاء close()
تم إنشاء مكتبة TFLite وفقًا للإصدار 19 من واجهة برمجة التطبيقات NDK API. ويمكن أن يعمل مع مستويات واجهات برمجة تطبيقات Android الأقدم من 19. لكنه ليس مضمونًا.
الفصول الدراسية المتداخلة
صنف | InterpreterApi.Options | فئة خيارات للتحكّم في سلوك ميزة "الترجمة الفورية" في بيئة التشغيل. |
الطرق العامة
تجريدي فراغ |
allocateTensors()
يتم تعديل عمليات التخصيص صراحةً لجميع وحدات قياس الأداء، إذا لزم الأمر.
|
تجريدي فراغ |
إغلاق()
إصدار الموارد المرتبطة بالمثيل
InterpreterApi |
ثابتة InterpreterApi |
create(خيارا File modelFile، InterpreterApi.Options)
تنشئ هذه الدالة مثيل
InterpreterApi باستخدام النموذج والخيارات المحدّدة. |
ثابتة InterpreterApi |
create(خيارات ByteBuffer byteBuffer، خيارات InterpreterApi.Options)
تنشئ هذه الدالة مثيل
InterpreterApi باستخدام النموذج والخيارات المحدّدة. |
تجريدي تدخُّل دفاعي | |
تجريدي Tensor |
getInputTensor(int enterIndex)
يحصل على Tensor المرتبط بفهرس الإدخال المتوفر.
|
تجريدي تدخُّل دفاعي |
getInputTensorCount()
للحصول على عدد مترابطات الإدخال.
|
تجريدي طويل |
getLastNativeInferenceDurationNanoseconds()
تعرض توقيت الاستنتاج الأصلي.
|
تجريدي تدخُّل دفاعي | |
تجريدي Tensor |
getOutputTensor(int objectIndex)
يحصل على Tensor المرتبط بفهرس الإخراج المقدَّم.
|
تجريدي تدخُّل دفاعي |
getOutputTensorCount()
الحصول على عدد Tensors للمخرجات.
|
تجريدي فراغ |
resizeInput(int idx, int[] dims, boolean strict)
لتغيير حجم إدخال idx-th للنموذج الأصلي إلى وحدات تعتيم محددة.
|
تجريدي فراغ |
resizeInput(int idx, int[] تتعلق بتعتيم الشاشة)
لتغيير حجم إدخال idx-th للنموذج الأصلي إلى وحدات تعتيم محددة.
|
تجريدي فراغ | |
تجريدي فراغ |
runForMultipleInputsOutputs(إدخالات Object[] وMap<عدد صحيح، Object>)
لتنفيذ استنتاج النموذج إذا كان النموذج يستخدم إدخالات متعددة أو يعرض مخرجات متعددة
|
الطرق المكتسبة
الطرق العامة
علنية تجريدي فراغ allocateTensors ()
يتم تعديل عمليات التخصيص صراحةً لجميع وحدات قياس الأداء، إذا لزم الأمر.
سيؤدي ذلك إلى نشر الأشكال وعمليات تخصيص الذاكرة لأعداد المتوترات التابعة باستخدام المدخلات. شكل أو أشكال مترابطة(Tenor) كما هو موضح.
ملاحظة: هذه المكالمة *اختيارية تمامًا*. سيتم تخصيص Tensor تلقائيًا أثناء في حال تغيير حجم أي من مقادير الإدخال. تكون هذه المكالمة مفيدة للغاية في تحديد لأي أداة متجهة للمخرجات قبل تنفيذ الرسم البياني، على سبيل المثال،
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 إنشاء (File modelFile, InterpreterApi.Options )
تنشئ هذه الدالة مثيل InterpreterApi
باستخدام النموذج والخيارات المحدّدة. النموذج
سيتم تحميله من ملف.
المعلمات
modelFile | ملف يحتوي على نموذج TF Lite المدرَّب مسبقًا |
---|---|
الخيارات | مجموعة من الخيارات لتخصيص سلوك ميزة "الترجمة الفورية" |
الرميات
IllegalArgumentException | إذا كان modelFile لا يشفّر ملف TensorFlow Lite صالح
الأمثل.
|
---|
علنية ثابتة InterpreterApi إنشاء (ByteBuffer byteBuffer, InterpreterApi.Options)
تنشئ هذه الدالة مثيل InterpreterApi
باستخدام النموذج والخيارات المحدّدة. النموذج
ستتم قراءتها من ByteBuffer
.
المعلمات
byteBuffer | نموذج TF Lite المدرب مسبقًا، في شكل تسلسلي ثنائي. يجب أن
لن يتم تعديلها بعد إنشاء مثيل InterpreterApi . يمكن أن تكون السمة ByteBuffer إما MappedByteBuffer الذي يربط بين ملف نموذج والذاكرة
توجيه ByteBuffer لـNativeOrder() الذي يحتوي على محتوى البايت من أحد النماذج. |
---|---|
الخيارات | مجموعة من الخيارات لتخصيص سلوك ميزة "الترجمة الفورية" |
الرميات
IllegalArgumentException | إذا لم تكن byteBuffer علامة MappedByteBuffer أو
قيمة مباشرة ByteBuffer من originalOrder.
|
---|
علنية تجريدي تدخُّل دفاعي getInputIndex (سلسلة opName)
الحصول على فهرس للمدخل حسب اسم العملية للمدخل
المعلمات
opName |
---|
الرميات
IllegalArgumentException | إذا كان opName لا يتطابق مع أي إدخال في النموذج المستخدَم
لإعداد المترجم الفوري.
|
---|
علنية تجريدي Tensor getInputTensor (int enterIndex)
يحصل على Tensor المرتبط بفهرس الإدخال المتوفر.
المعلمات
inputIndex |
---|
الرميات
IllegalArgumentException | إذا كانت inputIndex سالبة أو ليست أصغر من
عدد مدخلات النموذج.
|
---|
علنية تجريدي تدخُّل دفاعي getInputTensorCount ()
للحصول على عدد مترابطات الإدخال.
علنية تجريدي طويل getLastNativeInferenceDurationNanoseconds ()
تعرض توقيت الاستنتاج الأصلي.
الرميات
IllegalArgumentException | إذا لم يتم إعداد النموذج بواسطة المترجم. |
---|
علنية تجريدي تدخُّل دفاعي getOutputIndex (سلسلة opName)
الحصول على فهرس للناتج وفقًا لاسم عملية المخرجات.
المعلمات
opName |
---|
الرميات
IllegalArgumentException | إذا لم تتطابق السمة opName مع أي ناتج في النموذج المستخدَم
لإعداد المترجم الفوري.
|
---|
علنية تجريدي Tensor getOutputTensor (int consentIndex)
يحصل على Tensor المرتبط بفهرس الإخراج المقدَّم.
ملاحظة: قد لا تتم تعبئة تفاصيل مترابط الإخراج (مثل الشكل) بالكامل إلا بعد الاستنتاج
يتم تنفيذه. إذا كنت بحاجة إلى تفاصيل محدّثة *قبل* تنفيذ الاستنتاج (على سبيل المثال، بعد تغيير حجم
إدخال متنسورة، والذي قد يلغي صلاحية أشكال متّجه الإخراج)، استخدم allocateTensors()
من أجل
تؤدي إلى إطلاق التخصيص ونشر الأشكال بشكل صريح. لاحظ أنه بالنسبة للرسومات البيانية ذات أشكال الإخراج
التي تعتمد على *قيم* المدخلات، فقد لا يتم تحديد شكل الإخراج بشكل كامل حتى
تشغيل الاستنتاج.
المعلمات
outputIndex |
---|
الرميات
IllegalArgumentException | إذا كانت outputIndex سالبة أو ليست أصغر من
عدد مخرجات النموذج.
|
---|
علنية تجريدي تدخُّل دفاعي getOutputTensorCount ()
الحصول على عدد Tensors للمخرجات.
علنية تجريدي فراغ resizeInput (int idx, int[] تتعلق بالتعتيم، منطقي)
لتغيير حجم إدخال idx-th للنموذج الأصلي إلى وحدات تعتيم محددة.
عندما تكون القيمة "متشددة" على "صحيح"، لا يمكن تغيير حجم سوى الأبعاد غير المعروفة. السمات غير المعروفة هي يشار إليه باسم `-1` في الصفيف الذي يتم عرضه بواسطة `Tensor.shapeSignature()`.
المعلمات
idx. | |
---|---|
إضاءة خافتة | |
متشدّد |
الرميات
IllegalArgumentException | إذا كان idx سالبًا أو ليس أصغر من العدد
لمدخلات النماذج أو إذا حدث خطأ عند تغيير حجم إدخال idx-th بالإضافة إلى ذلك، فإن الخطأ
تحدث عند محاولة تغيير حجم متسلسل بأبعاد ثابتة عندما تكون "صارمة" True.
|
---|
علنية تجريدي فراغ resizeInput (int idx, int[] تعتيم)
لتغيير حجم إدخال idx-th للنموذج الأصلي إلى وحدات تعتيم محددة.
المعلمات
idx. | |
---|---|
إضاءة خافتة |
الرميات
IllegalArgumentException | إذا كان idx سالبًا أو ليس أصغر من العدد
لمدخلات النماذج أو إذا حدث خطأ عند تغيير حجم إدخال idx-th
|
---|
علنية تجريدي فراغ تشغيل (إدخال كائن، إخراج الكائن)
تعمل على تشغيل استنتاج النموذج إذا كان النموذج يستخدم إدخالاً واحدًا فقط ويوفر ناتجًا واحدًا فقط.
تحذير: تكون واجهة برمجة التطبيقات أكثر كفاءة إذا كان Buffer
(يُفضل أن يكون مباشرًا، ولكن غير مطلوب)
تُستخدم كنوع بيانات الإدخال/الإخراج. يُرجى استخدام Buffer
للحصول على الخلاصات والجلب
بيانات أولية لتحقيق أداء أفضل. تشمل أنواع Buffer
الملموسة التالية:
مدعوم:
ByteBuffer
- متوافق مع أي نوع من أنواع Tensor الأساسية.FloatBuffer
- متوافق مع العشرات العائمة.IntBuffer
: متوافق مع int32 TensorsLongBuffer
- متوافق مع int64 Tensors.
Buffer
أو كمدخلات عددية.المعلمات
مصدر الإدخال | مصفوفة أو مصفوفة متعددة الأبعاد، أو Buffer من الأنواع الأساسية
بما في ذلك int وfloat وlong وbyte. إنّ Buffer هي الطريقة المفضّلة لتمرير القيم الكبيرة.
بيانات الإدخال للأنواع الأولية، بينما تتطلب أنواع السلاسل استخدام (متعدد الأبعاد)
مسار إدخال الصفيفة. عند استخدام Buffer ، يجب أن يظل محتواه بدون تغيير حتى
يتم استنتاج النموذج، ويجب أن يتأكّد المتصل من أنّ قيمة Buffer
موضع القراءة المناسب. يُسمَح بقيمة null فقط إذا كان المتصل يستخدم
Delegate الذي يتيح إمكانية التشغيل التفاعلي لمؤشر المخزن المؤقت، وتم ربط هذا المخزن المؤقت
الإدخال Tensor |
---|---|
output | مصفوفة متعددة الأبعاد من بيانات المخرجات أو Buffer من الأنواع الأساسية
بما في ذلك int وfloat وlong وbyte. عند استخدام Buffer ، يجب أن يتأكد المتصل من أنّ المتصل
من تعيين موضع الكتابة المناسب. يُسمح باستخدام القيمة الفارغة، وهي مفيدة
حالات معيّنة، مثلًا إذا كان المتصل يستخدم Delegate تسمح بمؤشر المخزن المؤقت
إمكانية التشغيل التفاعلي، وتم ربط مثل هذا المخزن المؤقت بالمخرجات Tensor (يُرجى الاطّلاع أيضًا على Interpreter.Options#setAllowBufferHandleOutput(boolean))،
أو إذا كان الرسم البياني يحتوي على مخرجات ذات شكل ديناميكي وكان على المتصل الاستعلام عن شكل Tensor الناتج بعد استدعاء الاستنتاج، ما يؤدي إلى جلب البيانات مباشرةً من الناتج
Tenor (عبر Tensor.asReadOnlyBuffer() ). |
الرميات
IllegalArgumentException | إذا كانت قيمة input فارغة أو فارغة، أو إذا حدث خطأ عندما
تشغيل الاستنتاج. |
---|---|
IllegalArgumentException | (ميزة تجريبية، وتخضع للتغيير) إذا كان الاستنتاج
تمت مقاطعة setCancelled(true) .
|
علنية تجريدي فراغ runForMultipleInputsOutputs (إدخالات Object[]، الخريطة<عدد صحيح والكائن> المخرجات)
لتنفيذ استنتاج النموذج إذا كان النموذج يستخدم إدخالات متعددة أو يعرض مخرجات متعددة
تحذير: تكون واجهة برمجة التطبيقات أكثر كفاءة إذا كانت Buffer
(يُفضَّل أن تكون مباشرة، ولكن غير مطلوبة)
تُستخدم كأنواع بيانات الإدخال/الإخراج. يُرجى استخدام Buffer
للحصول على الخلاصات والجلب
بيانات أولية لتحقيق أداء أفضل. تشمل أنواع Buffer
الملموسة التالية:
مدعوم:
ByteBuffer
- متوافق مع أي نوع من أنواع Tensor الأساسية.FloatBuffer
- متوافق مع العشرات العائمة.IntBuffer
: متوافق مع int32 TensorsLongBuffer
- متوافق مع int64 Tensors.
Buffer
أو كمدخلات عددية.
ملاحظة: قيم null
للعناصر الفردية لـ inputs
وoutputs
هي
السماح بذلك فقط إذا كان المتصل يستخدم Delegate
تسمح بإمكانية التشغيل المتداخل لمؤشر المخزن المؤقت
تم ربط هذا المخزن المؤقت بالمدخلات أو المخرجات Tensor
(المخرجات) المقابلة.
المعلمات
مصادر الإدخال | صفيف من بيانات الإدخال. يجب أن تكون المدخلات بالترتيب نفسه كمدخلات
الأمثل. يمكن أن يكون كل إدخال مصفوفة أو مصفوفة متعددة الأبعاد، أو يمكن أن يمثل Buffer
الأنواع الأولية بما في ذلك int وfloat وlong وbyte. Buffer هي الطريقة المفضّلة.
لتمرير بيانات المدخلات الكبيرة، بينما تتطلب أنواع السلاسل استخدام الصفيف (متعدد الأبعاد)
مسار الإدخال. عند استخدام Buffer ، يجب أن يظل المحتوى بدون تغيير إلى أن يتم استخدام النموذج
يتم الاستنتاج، ويجب أن يتأكّد المتصل من أنّ "Buffer " في الوقت المناسب
موضع القراءة. |
---|---|
النتائج | مؤشرات ناتج تعيين الخريطة إلى صفائف متعددة الأبعاد لبيانات المخرجات أو Buffer من الأنواع الأساسية بما في ذلك int وfloat وlong وبايت. يحتاج فقط إلى جعل
الإدخالات للمخرجات التي سيتم استخدامها. عند استخدام Buffer ، يجب أن يتأكد المتصل من أنّ المتصل
من تعيين موضع الكتابة المناسب. قد تكون الخريطة فارغة للحالات التي
تُستخدَم مؤشرات المخزن المؤقت لبيانات مترابط الإخراج أو الحالات التي يتم فيها استخدام المُخرجات ديناميكيًا
ويجب على المتصل الاستعلام عن شكل الناتج Tensor بعد الاستنتاج
تم استدعاء، جلب البيانات مباشرةً من متوتر الإخراج (عبر Tensor.asReadOnlyBuffer() ). |
الرميات
IllegalArgumentException | إذا كانت inputs فارغة أو فارغة، إذا كانت outputs
فارغة، أو إذا حدث خطأ عند تشغيل الاستنتاج.
|
---|