إضافة الاقتراحات إلى تطبيقك باستخدام TensorFlow Lite وFirebase - درس تطبيقي حول الترميز في Android

1- نظرة عامة

مرحبًا بك في قسم "الاقتراحات" من خلال TensorFlow Lite والدرس التطبيقي حول ترميز Firebase. في هذا الدرس التطبيقي حول الترميز، ستتعرّف على كيفية استخدام TensorFlow Lite وFirebase لنشر نموذج اقتراح في تطبيقك. يستند هذا الدرس التطبيقي حول الترميز إلى هذا المثال من TensorFlow Lite.

تسمح الاقتراحات للتطبيقات باستخدام تعلُّم الآلة لعرض المحتوى الأكثر صلة بكل مستخدم بذكاء. وتأخذ في الاعتبار سلوك المستخدم السابق لاقتراح محتوى التطبيق الذي قد يرغب المستخدم في التفاعل معه في المستقبل باستخدام نموذج تم تدريبه على السلوك المجمّع لعدد كبير من المستخدمين الآخرين.

يشرح هذا الدليل التوجيهي كيفية الحصول على بيانات من مستخدمي تطبيقك من خلال "إحصاءات Firebase"، وإنشاء نموذج لتعلُّم الآلة لتقديم اقتراحات من تلك البيانات، ثم استخدام ذلك النموذج في تطبيق Android لإجراء الاستنتاج والحصول على الاقتراحات. وعلى وجه الخصوص، ستقترح اقتراحاتنا الأفلام التي من المرجّح أن يشاهدها المستخدم بالنظر إلى قائمة الأفلام التي أبدى المستخدم إعجابه بها سابقًا.

المعلومات التي ستطّلع عليها

  • دمج "إحصاءات Firebase" في تطبيق Android لجمع بيانات سلوك المستخدمين
  • تصدير تلك البيانات إلى Google Big Query
  • معالجة البيانات مسبقًا وتدريب نموذج توصيات TF Lite
  • فعِّل نموذج TF Lite في تقنية تعلُّم الآلة في Firebase والوصول إليه من تطبيقك.
  • التنفيذ على الاستنتاج على الجهاز باستخدام النموذج لاقتراح توصيات للمستخدمين

المتطلبات

  • أحدث إصدار من استوديو Android
  • نموذج التعليمات البرمجية.
  • جهاز اختباري يعمل بالإصدار 7.8 من نظام التشغيل Android أو الإصدارات الأحدث والإصدار 9.8 من "خدمات Google Play" أو إصدار أحدث، أو محاكي يتضمّن الإصدار 9.8 من "خدمات Google Play" أو إصدار أحدث
  • في حال استخدام جهاز، استخدِم كابل توصيل.

كيف ستستخدم هذا البرنامج التعليمي؟

القراءة فقط اقرأها وأكمِل التمارين

كيف تقيّم تجربتك في إنشاء تطبيقات Android؟

حديث متوسط بارع

2- الحصول على الرمز النموذجي

استنسِخ مستودع GitHub من سطر الأوامر.

$ git clone https://github.com/FirebaseExtended/codelab-contentrecommendation-android.git

3- استيراد تطبيق إجراء التفعيل

من "استوديو Android"، اختَر الدليل codelab-recommendations-android ( android_studio_folder.png) من نموذج تنزيل الرمز (ملف > فتح > .../codelab-recommendations-android/start).

من المفترض أن يكون مشروع البدء مفتوحًا الآن في "استوديو Android".

4. إنشاء مشروع على "وحدة تحكُّم Firebase"

إنشاء مشروع جديد

  1. انتقِل إلى وحدة تحكُّم Firebase.
  2. اختَر إضافة مشروع (أو إنشاء مشروع إذا كان هذا هو المشروع الأول).
  3. اختَر اسم المشروع أو أدخِله وانقر على متابعة.
  4. تأكَّد من أنّ "تفعيل إحصاءات Google لهذا المشروع" مفعّلة.
  5. اتّبِع خطوات الإعداد المتبقية في "وحدة تحكُّم Firebase"، ثم انقر على "إنشاء مشروع" (أو "إضافة Firebase"، إذا كنت تستخدم مشروعًا حاليًا على Google).

5- إضافة Firebase

  1. من شاشة النظرة العامة لمشروعك الجديد، انقر على رمز Android لبدء عملية الإعداد.
  2. أدخِل اسم حزمة الدرس التطبيقي حول الترميز: com.google.firebase.codelabs.recommendations.
  3. اختَر تسجيل التطبيق.

إضافة ملف google-services.json إلى تطبيقك

بعد إضافة اسم الحزمة واختيار "تسجيل"، انقر على تنزيل google-services.json للحصول على ملف إعداد Firebase Android، ثم انسخ ملف google-services.json إلى دليل app في مشروعك. بعد تنزيل الملف، يمكنك تخطّي الخطوات التالية التي تظهر في وحدة التحكّم (سبق أن تم تنفيذها لك في مشروع الإصدار android-start).

إضافة المكوّن الإضافي "خدمات Google" إلى تطبيقك

يستخدم المكوّن الإضافي "خدمات Google" ملف google-services.json لضبط تطبيقك على استخدام Firebase. من المفترض أن تتم إضافة الأسطر التالية إلى ملفات Builder.gradle.kts في المشروع (يُرجى التحقّق من ذلك):

app/build.grad.kts

plugins {
    id("com.google.gms.google-services")
}

build.grad.kts

plugins {
    id("com.google.gms.google-services") version "4.3.15" apply false
}

مزامنة مشروعك مع ملفات Gradle

وللتأكد من أن جميع التبعيات متاحة لتطبيقك، يجب عليك مزامنة مشروعك مع ملفات Gradle في هذه المرحلة. حدد ملف > مزامنة المشروع مع ملفات Gradle من شريط أدوات "استوديو Android"

6- تشغيل تطبيق إجراء التفعيل

بعد أن تم استيراد المشروع إلى "استوديو Android" وضبط المكوّن الإضافي google-services باستخدام ملف JSON، يمكنك تشغيل التطبيق للمرة الأولى. اربط جهاز Android، وانقر على تشغيل ( التنفيذ.png) في شريط أدوات "استوديو Android".

من المفترض أن يتم تشغيل التطبيق على جهازك. عند هذه النقطة، يمكنك الاطلاع على تطبيق يعمل يعرض علامة تبويب تحتوي على قائمة بالأفلام، وعلامة تبويب "الأفلام التي أعجبتني" وعلامة تبويب "الاقتراحات". يمكنك النقر على فيلم في قائمة الأفلام لإضافته إلى قائمة الأفلام التي أعجبتك. بعد إكمال الخطوات المتبقية من الدرس التطبيقي حول الترميز، سنتمكّن من اقتراح أفلام في علامة التبويب "الاقتراحات".

7- إضافة "إحصاءات Firebase" إلى التطبيق

في هذه الخطوة، يجب إضافة Firebase Analytics إلى التطبيق لتسجيل بيانات سلوك المستخدم (في هذه الحالة، الأفلام التي تعجب المستخدم). وسيتم استخدام هذه البيانات بشكل مجمّع في الخطوات المستقبلية لتطبيق نموذج الاقتراحات.

إضافة قائمة المواد الخاصة بمنصة Firebase والاعتمادية على "إحصاءات Google"

تعتبر الاعتماديات التالية ضرورية لإضافة Firebase Analytics إلى تطبيقك. ويجب تضمينها مسبقًا في ملف app/build.gradle.kts (التحقّق).

app/build.grad.kts

implementation(platform("com.google.firebase:firebase-bom:32.0.0"))
implementation("com.google.firebase:firebase-analytics-ktx")

إعداد "إحصاءات Firebase" في التطبيق

يحتوي LikeMoviesViewModel على وظائف لتخزين الأفلام التي تعجب المستخدم. وفي كل مرة يعجب المستخدم بفيلم جديد، نريد أيضًا إرسال حدث في سجل الإحصاءات لتسجيل ذلك مثل.

أضف دالة onMovieLike مع التعليمة البرمجية أدناه لتسجيل حدث تحليلات عندما ينقر المستخدم على أحد الأفلام.

LikeMoviesViewModel.kt

import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.analytics.ktx.analytics
import com.google.firebase.analytics.ktx.logEvent
import com.google.firebase.ktx.Firebase


class LikedMoviesViewModel internal constructor (application: Application) : AndroidViewModel(application) {

    ...

    fun onMovieLiked(movie: Movie) {
        movies.setLike(movie, true)
        logAnalyticsEvent(movie.id.toString())
    }
       
}

أضِف الحقل والدالة التالية لتسجيل حدث في "إحصاءات Google" عند إضافة فيلم إلى قائمة "الإعجابات" لدى المستخدم.

LikeMoviesViewModel.kt

import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.analytics.ktx.analytics
import com.google.firebase.analytics.ktx.logEvent
import com.google.firebase.ktx.Firebase


class LikedMoviesViewModel internal constructor (application: Application) : AndroidViewModel(application) {
    ...
    private val firebaseAnalytics = Firebase.analytics

    ...

    /**
     * Logs an event in Firebase Analytics that is used in aggregate to train the recommendations
     * model.
     */
    private fun logAnalyticsEvent(id: String) {
        firebaseAnalytics.logEvent(FirebaseAnalytics.Event.SELECT_ITEM) {
            param(FirebaseAnalytics.Param.ITEM_ID, id)
        }
    }

8- اختبار دمج "إحصاءات Google"

في هذه الخطوة، سننشئ أحداث "إحصاءات Google" في التطبيق ونتحقّق من إرسالها إلى "وحدة تحكُّم Firebase".

تفعيل تسجيل تصحيح الأخطاء في "إحصاءات Google"

تم تصميم "إحصاءات Firebase" لزيادة عمر بطارية المستخدم إلى أقصى حد، كما أنها ستعمل على تجميع الأحداث على الجهاز وإرسالها إلى Firebase من حين لآخر فقط. ولأغراض تصحيح الأخطاء، يمكننا إيقاف هذا السلوك للاطّلاع على الأحداث، حيث يتم تسجيلها في الوقت الفعلي من خلال تنفيذ الأمر التالي في واجهة الأوامر.

محطة الركّاب

adb shell setprop debug.firebase.analytics.app com.google.firebase.codelabs.recommendations

التأكّد من إنشاء أحداث في "إحصاءات Google"

  1. في "استوديو Android"، افتح نافذة Logcat لفحص التسجيل من تطبيقك.
  2. اضبط فلتر Logcat على سلسلة "Logging event" (حدث التسجيل).
  3. تأكّد من أنّ قيمة "select_item" يتم إطلاق أحداث "إحصاءات Google" في كل مرة تُعجبك بفيلم في التطبيق.

في هذه المرحلة، تم دمج "إحصاءات Firebase" في تطبيقك بنجاح. عندما يستخدم المستخدمون تطبيقك ويعجبون بالأفلام، سيتم تسجيل عدد إبداءات الإعجاب الخاصة بهم بشكل مجمّع. سنستخدم هذه البيانات المجمّعة في بقية هذا الدرس التطبيقي حول الترميز لتدريب نموذج الاقتراحات. في ما يلي خطوة اختيارية للاطّلاع على أحداث "إحصاءات Google" نفسها التي رأيتها في Logcat والتي يتم بثّها أيضًا إلى وحدة تحكُّم Firebase. يمكنك التخطّي إلى الصفحة التالية.

اختياري: تأكيد أحداث "إحصاءات Google" في "وحدة تحكُّم Firebase"

  1. انتقِل إلى وحدة تحكُّم Firebase.
  2. اختَر DebugView ضمن "إحصاءات Google".
  3. في "استوديو Android"، اختَر تشغيل لتشغيل التطبيق وإضافة بعض الأفلام إلى قائمة "المحتوى الذي أعجبك".
  4. في DebugView ضمن وحدة تحكُّم Firebase، تحقَّق من تسجيل هذه الأحداث أثناء إضافة أفلام في التطبيق.

9- تصدير بيانات "إحصاءات Google" إلى Big Query

Big Query هو منتج من Google Cloud يسمح لك بفحص كميات كبيرة من البيانات ومعالجتها. في هذه الخطوة، عليك ربط مشروعك على "وحدة تحكُّم Firebase" بخدمة Big Query كي يتم تلقائيًا تصدير بيانات "إحصاءات Google" التي أنشأها تطبيقك إلى Big Query.

تفعيل تصدير Big Query

  1. انتقِل إلى وحدة تحكُّم Firebase.
  2. اختَر رمز ترس "الإعدادات" بجانب نظرة عامة على المشروع، ثم اختَر إعدادات المشروع.
  3. انقر على علامة التبويب عمليات الدمج.
  4. اختَر ربط (أو إدارة) داخل مجموعة BigQuery.
  5. اختَر التالي في الخطوة لمحة عن ربط Firebase بأداة BigQuery.
  6. ضمن قسم إعداد الدمج، انقر على مفتاح التبديل لتفعيل إرسال بيانات "إحصاءات Google" واختيار الربط بأداة BigQuery.

لقد فعّلت الآن مشروع وحدة تحكُّم Firebase لإرسال بيانات حدث "إحصاءات Firebase" تلقائيًا إلى Big Query. ويحدث ذلك تلقائيًا بدون أي تفاعل إضافي، إلا أنّ عملية التصدير الأولى التي تنشئ مجموعة بيانات "إحصاءات Google" في BigQuery قد لا تحدث لمدة 24 ساعة. بعد إنشاء مجموعة البيانات، يصدِّر Firebase باستمرار أحداث "إحصاءات Google" الجديدة إلى Big Query في جدول اليوم الواحد، ويجمِّع الأحداث من الأيام السابقة في جدول الأحداث.

يتطلب تدريب نموذج توصية الكثير من البيانات. نظرًا لأنه ليس لدينا بالفعل تطبيق يُنشئ كميات كبيرة من البيانات، ففي الخطوة التالية سنستورد نموذج مجموعة بيانات إلى BigQuery لاستخدامها في بقية هذا البرنامج التعليمي.

10- استخدام BigQuery للحصول على بيانات تدريب النماذج

الآن بعد أن ربطنا وحدة تحكُّم Firebase التابعة لنا للتصدير إلى BigQuery، ستظهر بيانات أحداث إحصاءات التطبيقات تلقائيًا في وحدة تحكُّم BigQuery بعد مرور بعض الوقت. للحصول على بعض البيانات الأولية لأغراض هذا البرنامج التعليمي، سنقوم في هذه الخطوة باستيراد نموذج مجموعة بيانات حالية إلى وحدة تحكم BigQuery لاستخدامها في تدريب نموذج التوصيات.

استيراد نموذج مجموعة بيانات إلى BigQuery

  1. انتقِل إلى لوحة بيانات BigQuery في وحدة التحكّم في Google Cloud.
  2. اختَر اسم مشروعك من القائمة.
  3. حدد اسم مشروعك في الجزء السفلي من شريط التنقل الأيمن في BigQuery للاطلاع على التفاصيل.
  4. اختَر إنشاء مجموعة بيانات لفتح لوحة إنشاء مجموعة البيانات.
  5. أدخِل "firebase_recommendations_dataset" من أجل رقم تعريف مجموعة البيانات واختَر إنشاء مجموعة بيانات.
  6. ستظهر مجموعة البيانات الجديدة في القائمة اليمنى أسفل اسم المشروع. انقر عليه.
  7. اختَر إنشاء جدول لفتح لوحة إنشاء الجدول.
  8. بالنسبة إلى إنشاء جدول من، اختَر "Google Cloud Storage".
  9. في الحقل اختيار ملف من حزمة GCS، أدخِل "gs://firebase-recommendations/recommendations-test/format_data_filtered.txt".
  10. اختيار "JSONL" في القائمة المنسدلة تنسيق الملف.
  11. أدخِل "جدول_الاقتراحات" بالنسبة إلى اسم الجدول.
  12. حدد المربع أسفل المخطط > الكشف التلقائي > المخطّطات ومَعلمات الإدخال
  13. اختَر إنشاء جدول.

استكشاف نموذج مجموعة بيانات

في هذه المرحلة، يمكنك اختياريًا استكشاف المخطط ومعاينة مجموعة البيانات هذه.

  1. اختَر firebase-recommendations-dataset في القائمة اليمنى لتوسيع الجداول التي تحتوي عليها.
  2. اختَر جدول جدول الاقتراحات لعرض مخطّط الجدول.
  3. اختَر معاينة للاطّلاع على بيانات أحداث "إحصاءات Google" الفعلية التي يحتوي عليها هذا الجدول.

إنشاء بيانات اعتماد لحساب الخدمة

والآن، سننشئ بيانات اعتماد حساب الخدمة في مشروع Google Cloud Console الذي يمكننا استخدامه في بيئة Colab في الخطوة التالية للوصول إلى بيانات BigQuery وتحميلها.

  1. تأكَّد من تفعيل الفوترة لمشروعك على Google Cloud.
  2. تفعيل واجهات برمجة التطبيقات في BigQuery وBigQuery Storage API < انقر هنا>
  3. انتقِل إلى صفحة إنشاء مفتاح حساب الخدمة.
  4. من قائمة حساب الخدمة، اختَر حساب خدمة جديد.
  5. في حقل اسم حساب الخدمة، أدخِل اسمًا.
  6. من قائمة الدور، اختَر مشروع >. المالك:
  7. انقر على إنشاء. ملف JSON يحتوي على المفاتيح التي تم تنزيلها على جهاز الكمبيوتر

في الخطوة التالية، سنستخدم Google Colab لمعالجة هذه البيانات مسبقًا وتدريب نموذج الاقتراحات.

11- نموذج معالجة البيانات مسبقًا وتدريب الاقتراحات

في هذه الخطوة، سنستخدم ورقة ملاحظات Colab لتنفيذ الخطوات التالية:

  1. استيراد بيانات BigQuery إلى ورقة ملاحظات Colab
  2. معالجة البيانات مسبقًا لإعدادها لتدريب النموذج
  3. تدريب نموذج التوصيات على بيانات الإحصاءات
  4. تصدير النموذج كنموذج TF lite
  5. نشر النموذج على "وحدة تحكُّم Firebase" حتى نتمكّن من استخدامه في تطبيقنا.

قبل إطلاق ورقة ملاحظات Colab التدريبية، سنفعِّل أولاً واجهة برمجة التطبيقات لإدارة النماذج في Firebase لتتمكّن Colab من نشر النموذج المدرَّب في وحدة تحكُّم Firebase.

تفعيل واجهة برمجة التطبيقات لإدارة نماذج Firebase

إنشاء حزمة لتخزين نماذج تعلُّم الآلة

في "وحدة تحكُّم Firebase"، انتقِل إلى "مساحة التخزين" وانقر على "البدء". fbbea78f0eb3dc9f.png

اتّبِع مربّع الحوار لإعداد الحزمة.

19517c0d6d2aa14d.png

تفعيل واجهة برمجة تطبيقات تعلُّم الآلة في Firebase

انتقِل إلى صفحة Firebase ML API على Google Cloud Console وانقر على "تفعيل".

استخدام ورقة ملاحظات Colab لتدريب النموذج ونشره

افتح دفتر ملاحظات colab باستخدام الرابط التالي وأكمل الخطوات الواردة به. بعد الانتهاء من الخطوات الواردة في ورقة ملاحظات Colab، سيكون لديك ملف نموذج TF lite يتم نشره في وحدة تحكُّم Firebase حتى نتمكّن من مزامنته مع التطبيق.

الفتح في Colab

12- تنزيل النموذج في تطبيقك

في هذه الخطوة، سنُعدّل تطبيقنا لتنزيل النموذج الذي درّبناه للتو من تعلُّم الآلة من Firebase.

إضافة اعتمادية تعلُّم الآلة في Firebase

هناك حاجة إلى الاعتمادية التالية من أجل استخدام نماذج تعلُّم الآلة من Firebase في تطبيقك. من المفترض أن يكون قد تمت إضافته (التحقق).

app/build.grad.kts

implementation("com.google.firebase:firebase-ml-modeldownloader:24.1.2")

تنزيل النموذج باستخدام واجهة برمجة تطبيقات "مدير نماذج Firebase"

انسخ الرمز أدناه إلى recommendedClient.kt لإعداد الشروط التي يتم بموجبها تنزيل النموذج، ثم أنشئ مهمة تنزيل لمزامنة النموذج البعيد مع تطبيقنا.

recommendedClient.kt

    private fun downloadModel(modelName: String) {
        val conditions = CustomModelDownloadConditions.Builder()
            .requireWifi()
            .build()
        FirebaseModelDownloader.getInstance()
            .getModel(modelName, DownloadType.LOCAL_MODEL, conditions)
            .addOnCompleteListener {
                if (!it.isSuccessful) {
                    showToast(context, "Failed to get model file.")
                } else {
                    showToast(context, "Downloaded remote model: $modelName")
                    GlobalScope.launch { initializeInterpreter(it.result) }
                }
            }
            .addOnFailureListener {
                showToast(context, "Model download failed for recommendations, please check your connection.")
            }
    }

13- دمج نموذج الاقتراحات من Tensorflow Lite في تطبيقك

يتيح لك وقت تشغيل Tensorflow Lite استخدام نموذجك في التطبيق لإنشاء اقتراحات. في الخطوة السابقة، تم إعداد مترجم TFlite باستخدام ملف النموذج الذي نزّلناه. في هذه الخطوة، سنُحمّل أولاً قاموسًا وتصنيفات مرافقة لنموذجنا في خطوة الاستنتاج، ثم نضيف المعالجة المسبقة لتوليد المدخلات إلى نموذجنا وما بعد المعالجة حيث سنستخرج النتائج من الاستنتاج.

تحميل القاموس والتصنيفات

ويتم سرد التصنيفات المستخدَمة لإنشاء اقتراحات للاقتراحات من خلال نموذج الاقتراحات في الملف sorted_movie_vocab.json في مجلد res/assets. انسخ الرمز التالي لتحميل هذه العناصر المرشحة.

recommendedClient.kt

    /** Load recommendation candidate list.  */
    private suspend fun loadCandidateList() {
        return withContext(Dispatchers.IO) {
            val collection = MovieRepository.getInstance(context).getContent()
            for (item in collection) {
                candidates[item.id] = item
            }
            Log.v(TAG, "Candidate list loaded.")
        }
    }

تنفيذ مرحلة ما قبل المعالجة

في خطوة المعالجة المسبقة، نغير شكل البيانات المدخلة ليتناسب مع ما يتوقعه نموذجنا. هنا، نضع طول الإدخال بقيمة عنصر نائب إذا لم نكن قد نال الكثير من إعجاب المستخدم بالفعل. انسخ الرمز أدناه:

recommendedClient.kt

    /** Given a list of selected items, preprocess to get tflite input.  */
    @Synchronized
    private suspend fun preprocess(selectedMovies: List<Movie>): IntArray {
        return withContext(Dispatchers.Default) {
            val inputContext = IntArray(config.inputLength)
            for (i in 0 until config.inputLength) {
                if (i < selectedMovies.size) {
                    val (id) = selectedMovies[i]
                    inputContext[i] = id
                } else {
                    // Padding input.
                    inputContext[i] = config.pad
                }
            }
            inputContext
        }
    }


تشغيل ميزة "الترجمة الفورية" لإنشاء الاقتراحات

وهنا نستخدم النموذج الذي نزّلناه في خطوة سابقة للاستنتاج على مدخلاتنا التي تمّت معالجتها مسبقًا. نعيّن نوع الإدخال والمخرجات لنموذجنا وننفذ الاستنتاج لتوليد اقتراحات الأفلام. انسخ الرمز التالي والصقه في تطبيقك.

recommendedClient.kt

    /** Given a list of selected items, and returns the recommendation results.  */
    @Synchronized
    suspend fun recommend(selectedMovies: List<Movie>): List<Result> {
        return withContext(Dispatchers.Default) {
            val inputs = arrayOf<Any>(preprocess(selectedMovies))

            // Run inference.
            val outputIds = IntArray(config.outputLength)
            val confidences = FloatArray(config.outputLength)
            val outputs: MutableMap<Int, Any> = HashMap()
            outputs[config.outputIdsIndex] = outputIds
            outputs[config.outputScoresIndex] = confidences
            tflite?.let {
                it.runForMultipleInputsOutputs(inputs, outputs)
                postprocess(outputIds, confidences, selectedMovies)
            } ?: run {
                Log.e(TAG, "No tflite interpreter loaded")
                emptyList()
            }
        }
    }



تنفيذ مرحلة ما بعد المعالجة

وأخيرًا، في هذه الخطوة، بعد ذلك نجري معالجة للمخرجات من نموذجنا، ونختار النتائج بأعلى مستوى من الثقة ونزيل القيم المتضمّنة (الأفلام التي أبدى المستخدم إعجابه بها). انسخ الرمز التالي والصقه في تطبيقك.

recommendedClient.kt

    /** Postprocess to gets results from tflite inference.  */
    @Synchronized
    private suspend fun postprocess(
        outputIds: IntArray, confidences: FloatArray, selectedMovies: List<Movie>
    ): List<Result> {
        return withContext(Dispatchers.Default) {
            val results = ArrayList<Result>()

            // Add recommendation results. Filter null or contained items.
            for (i in outputIds.indices) {
                if (results.size >= config.topK) {
                    Log.v(TAG, String.format("Selected top K: %d. Ignore the rest.", config.topK))
                    break
                }
                val id = outputIds[i]
                val item = candidates[id]
                if (item == null) {
                    Log.v(TAG, String.format("Inference output[%d]. Id: %s is null", i, id))
                    continue
                }
                if (selectedMovies.contains(item)) {
                    Log.v(TAG, String.format("Inference output[%d]. Id: %s is contained", i, id))
                    continue
                }
                val result = Result(
                    id, item,
                    confidences[i]
                )
                results.add(result)
                Log.v(TAG, String.format("Inference output[%d]. Result: %s", i, result))
            }
            results
        }
    }


اختبار تطبيقك

أعِد تشغيل تطبيقك. عند تحديد بعض الأفلام، سيتم تنزيل النموذج الجديد تلقائيًا والبدء في إنشاء التوصيات!

14- تهانينا

لقد أنشأت ميزة اقتراحات في تطبيقك باستخدام TensorFlow Lite وFirebase. يُرجى العِلم أنّه يمكن تعميم الأساليب والمسارات الموضَّحة في هذا الدرس التطبيقي حول الترميز، ويمكن استخدامها أيضًا لتطبيق أنواع أخرى من الاقتراحات.

المواضيع التي تناولناها

  • Firebase ML
  • "إحصاءات Firebase"
  • تصدير أحداث "إحصاءات Google" إلى BigQuery
  • أحداث الإحصاءات قبل المعالجة
  • نموذج TensorFlow لاقتراحات القطارات
  • تصدير النموذج ونشره على "وحدة تحكُّم Firebase"
  • عرض اقتراحات الأفلام في تطبيق

الخطوات التالية

  • نفِّذ اقتراحات تعلُّم الآلة من Firebase في تطبيقك.

مزيد من المعلومات

هل لديك سؤال؟

الإبلاغ عن المشاكل