הוסף המלצות לאפליקציה שלך עם TensorFlow Lite ו-Firebase - Android Codelab

קל לארגן דפים בעזרת אוספים אפשר לשמור ולסווג תוכן על סמך ההעדפות שלך.

1. סקירה כללית

ברוכים הבאים להמלצות עם TensorFlow Lite ומעבדת הקוד של Firebase. במעבדת קוד זה תלמד כיצד להשתמש ב-TensorFlow Lite וב-Firebase כדי לפרוס מודל המלצה לאפליקציה שלך. מעבד קוד זה מבוסס על דוגמה זו של TensorFlow Lite.

ההמלצות מאפשרות לאפליקציות להשתמש בלמידת מכונה כדי להגיש בצורה חכמה את התוכן הרלוונטי ביותר עבור כל משתמש. הם לוקחים בחשבון את התנהגות המשתמשים בעבר כדי להציע תוכן של האפליקציה שהמשתמש ירצה ליצור איתו אינטראקציה בעתיד על ידי שימוש במודל שהוכשר על ההתנהגות המצטברת של מספר רב של משתמשים אחרים.

מדריך זה מראה כיצד להשיג נתונים ממשתמשי האפליקציה שלך באמצעות Firebase Analytics, לבנות מודל למידת מכונה עבור המלצות מהנתונים האלה, ולאחר מכן להשתמש במודל זה באפליקציית Android כדי להפעיל הסקה ולקבל המלצות. בפרט, ההמלצות שלנו יציעו באילו סרטים סביר להניח שהמשתמש יצפה בהתחשב ברשימת הסרטים שהמשתמש אהב בעבר.

מה תלמד

  • שלב את Firebase Analytics באפליקציית אנדרואיד כדי לאסוף נתוני התנהגות משתמשים
  • ייצא את הנתונים האלה ל-Google Big Query
  • עבדו מראש את הנתונים והכשירו מודל המלצות TF Lite
  • פרוס את מודל TF Lite ב-Firebase ML וגשת אליו מהאפליקציה שלך
  • הפעל על הסקת מכשיר באמצעות המודל כדי להציע המלצות למשתמשים

מה אתה צריך

  • Android Studio גרסה 3.4+.
  • קוד לדוגמה.
  • מכשיר בדיקה עם Android 2.3+ ושירותי Google Play 9.8 ואילך, או אמולטור עם שירותי Google Play 9.8 ואילך
  • אם משתמשים במכשיר, כבל חיבור.

כיצד תשתמש במדריך זה?

קרא אותו רק עד הסוף קראו אותו והשלימו את התרגילים

איך תדרג את החוויה שלך בבניית אפליקציות אנדרואיד?

טִירוֹן ביניים בקיא

2. קבל את הקוד לדוגמה

שיבוט את מאגר GitHub משורת הפקודה.

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

3. ייבא את אפליקציית המתנע

מ-Android Studio, בחר את codelab-recommendations-android ( android_studio_folder.png ) מהורדת הקוד לדוגמה ( קובץ > פתח > .../codelab-recommendations-android/start).

כעת אתה אמור לפתוח את פרויקט ההתחלה ב-Android Studio.

4. צור פרוייקט מסוף Firebase

צור פרויקט חדש

  1. עבור אל מסוף Firebase .
  2. בחר הוסף פרויקט (או צור פרויקט אם זה הראשון).
  3. בחר או הזן שם פרויקט ולחץ על המשך .
  4. ודא ש"הפעל את Google Analytics עבור פרויקט זה" מופעל.
  5. בצע את שלבי ההגדרה הנותרים במסוף Firebase, ולאחר מכן לחץ על צור פרויקט (או הוסף Firebase, אם אתה משתמש בפרויקט קיים של Google).

5. הוסף את Firebase

  1. ממסך הסקירה הכללית של הפרויקט החדש שלך, לחץ על סמל אנדרואיד כדי להפעיל את זרימת העבודה של ההגדרה.
  2. הזן את שם החבילה של Codelab: com.google.firebase.codelabs.recommendations
  3. בחר הרשמה אפליקציה .

הוסף קובץ google-services.json לאפליקציה שלך

לאחר הוספת שם החבילה ובחירה בהרשמה, לחץ על הורד את google-services.json כדי להשיג את קובץ התצורה של Firebase Android ולאחר מכן העתק את הקובץ google-services.json לספריית app בפרויקט שלך. לאחר הורדת הקובץ תוכל לדלג על השלבים הבאים המוצגים בקונסולה (הם כבר בוצעו עבורך בפרויקט build-android-start).

הוסף תוסף Google-Services לאפליקציה שלך

הפלאגין google-services משתמש בקובץ google-services.json כדי להגדיר את האפליקציה שלך לשימוש ב-Firebase. יש להוסיף את השורות הבאות כבר לקבצי build.gradle בפרויקט (סמן לאישור):

app/build.grade

apply plugin: 'com.google.gms.google-services'

build.grade

classpath 'com.google.gms:google-services:4.3.13'

סנכרן את הפרויקט שלך עם קבצי Gradle

כדי להיות בטוח שכל התלות זמינות לאפליקציה שלך, עליך לסנכרן את הפרויקט שלך עם קבצי Gradle בשלב זה. בחר קובץ > סנכרן פרויקט עם קבצי Gradle מסרגל הכלים של Android Studio.

6. הפעל את אפליקציית המתנע

כעת, לאחר שייבאת את הפרויקט ל-Android Studio והגדרת את התוסף של google-services עם קובץ ה-JSON שלך, אתה מוכן להפעיל את האפליקציה בפעם הראשונה. חבר את מכשיר האנדרואיד שלך ולחץ על הפעל ( execute.png ) בסרגל הכלים של Android Studio.

האפליקציה אמורה להפעיל במכשיר שלך. בשלב זה, אתה יכול לראות אפליקציה מתפקדת שמציגה כרטיסייה עם רשימת סרטים, כרטיסיית סרטים שאהבתי וכרטיסיית המלצות. אתה יכול ללחוץ על סרט ברשימת הסרטים כדי להוסיף אותו לרשימת האהובים שלך. לאחר השלמת השלבים הנותרים של מעבדת הקוד, נוכל להפיק המלצות לסרטים בלשונית המלצות.

7. הוסף את Firebase Analytics לאפליקציה

בשלב זה, תוסיף את Firebase Analytics לאפליקציה כדי לרשום נתוני התנהגות משתמשים (במקרה זה, אילו סרטים המשתמש אוהב). נתונים אלה ישמשו במצטבר בשלבים עתידיים כדי להכשיר את מודל ההמלצות.

הוסף תלות ב-Firebase Analytics

התלות הבאה נחוצה כדי להוסיף Firebase Analytics לאפליקציה שלך. זה כבר אמור להיכלל בקובץ app/build.gradle (אימות).

app/build.grade

implementation 'com.google.firebase:firebase-analytics-ktx:21.1.0'

הגדר את Firebase Analytics באפליקציה

ה- LikedMoviesViewModel מכיל פונקציות לאחסון הסרטים שהמשתמש אוהב. בכל פעם שהמשתמש אוהב סרט חדש, אנחנו רוצים לשלוח גם אירוע ביומן ניתוח כדי להקליט את הלייק הזה.

הוסף את הפונקציה onMovieLiked עם הקוד למטה כדי לרשום אירוע ניתוח כאשר המשתמש לוחץ כמו על סרט.

LikedMoviesViewModel.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())
    }
       
}

הוסף את השדה והפונקציה הבאים כדי לרשום אירוע Analytics כאשר סרט נוסף לרשימת הלייקים של המשתמש.

LikedMoviesViewModel.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. בדוק את שילוב Analytics שלך

בשלב זה, ניצור אירועי Analytics באפליקציה ונוודא שהם נשלחים ל-Firebase Console.

הפעל רישום באגים של Analytics

Firebase Analytics נועד למקסם את חיי הסוללה של המשתמש ויבצע אצווה של אירועים במכשיר וישלח אותם ל-Firebase רק מדי פעם. למטרות ניפוי באגים, אנו יכולים להשבית התנהגות זו כדי לראות אירועים כשהם נרשמים בזמן אמת על ידי הפעלת הפקודה הבאה במעטפת.

מָסוֹף

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

ודא שאירועי Analytics נוצרים

  1. ב-Android studio, פתח את חלון Logcat כדי לבחון רישום מהאפליקציה שלך.
  2. הגדר את מסנן Logcat למחרוזת "אירוע רישום".
  3. ודא שאירועי "select_item" Analytics נפלטים בכל פעם שאתה אוהב סרט באפליקציה.

בשלב זה, שילבת בהצלחה את Firebase Analytics באפליקציה שלך. כאשר משתמשים משתמשים באפליקציה שלך ואוהבים סרטים, הלייקים שלהם ייכנסו לצבירה. אנו נשתמש בנתונים המצטברים הללו בשאר מעבדת הקוד הזה כדי להכשיר את מודל ההמלצות שלנו. להלן שלב אופציונלי לראות את אותם אירועי Analytics שראיתם ב-Logcat זורמים גם למסוף Firebase. אתם מוזמנים לדלג לעמוד הבא.

אופציונלי: אשר אירועים של Analytics ב-Firebase Console

  1. עבור אל מסוף Firebase .
  2. בחר DebugView תחת Analytics
  3. ב-Android Studio, בחר הפעל כדי להפעיל את האפליקציה ולהוסיף כמה סרטים לרשימת הלייקים שלך.
  4. ב-DebugView של קונסולת Firebase, ודא שהאירועים האלה נרשמים בזמן שאתה מוסיף סרטים באפליקציה.

9. ייצא נתוני אנליטיקס ל-Big Query

Big Query הוא מוצר של Google Cloud המאפשר לך לבחון ולעבד כמויות גדולות של נתונים. בשלב זה, תחבר את פרויקט Firebase Console שלך ​​ל-Big Query כך שנתוני Analytics שנוצרו על ידי האפליקציה שלך ייצאו אוטומטית ל-Big Query.

אפשר ייצוא שאילתה גדולה

  1. עבור אל מסוף Firebase .
  2. בחר בסמל גלגל השיניים של הגדרות לצד סקירת פרויקט ולאחר מכן בחר הגדרות פרויקט
  3. בחר בכרטיסייה אינטגרציות .
  4. בחר קישור (או נהל ) בתוך בלוק BigQuery .
  5. בחר הבא בשלב אודות קישור Firebase ל-BigQuery .
  6. בקטע הגדר אינטגרציה , לחץ על המתג כדי לאפשר שליחת נתוני Google Analytics ובחר קישור ל-BigQuery .

עכשיו אפשרת לפרויקט מסוף Firebase שלך ​​לשלוח אוטומטית נתוני אירועים של Firebase Analytics אל Big Query. זה קורה אוטומטית ללא כל אינטראקציה נוספת, עם זאת, ייתכן שהייצוא הראשון שיוצר את מערך הנתונים האנליטיים ב-BigQuery לא יקרה במשך 24 שעות. לאחר יצירת מערך הנתונים, Firebase מייצאת ללא הרף אירועים חדשים מ-Analytics ל-Big Query לטבלה תוך-יום, ומקבצת אירועים מהימים האחרונים בטבלת האירועים.

הכשרת מודל המלצות דורשת הרבה נתונים. מכיוון שעדיין אין לנו אפליקציה המייצרת כמויות גדולות של נתונים, בשלב הבא נייבא מערך נתונים לדוגמה ל-BigQuery לשימוש עבור שאר המדריך הזה.

10. השתמש ב-BigQuery כדי לקבל נתוני אימון מודל

כעת, לאחר שחיברנו את מסוף Firebase שלנו כדי לייצא ל-BigQuery, נתוני אירועי ניתוח האפליקציה שלנו יופיעו אוטומטית במסוף BigQuery לאחר זמן מה. כדי לקבל כמה נתונים ראשוניים למטרות המדריך הזה, בשלב זה נייבא מערך נתונים לדוגמה קיים למסוף BigQuery שלך כדי להשתמש בו כדי להכשיר את מודל ההמלצות שלנו.

ייבא מערך נתונים לדוגמה לתוך BigQuery

  1. עבור אל לוח המחוונים של BigQuery במסוף הענן של Google.
  2. בחר את שם הפרויקט שלך בתפריט.
  3. בחר את שם הפרויקט שלך בתחתית הניווט הימני של BigQuery כדי לראות פרטים.
  4. בחר צור מערך נתונים כדי לפתוח את חלונית יצירת מערך הנתונים.
  5. הזן 'firebase_recommendations_dataset' עבור מזהה מערך הנתונים ובחר צור מערך נתונים .
  6. מערך הנתונים החדש יופיע בתפריט השמאלי מתחת לשם הפרויקט. לחץ עליו.
  7. בחר צור טבלה כדי לפתוח את חלונית יצירת הטבלה.
  8. עבור צור טבלה מתוך בחר 'אחסון בענן של Google'.
  9. בשדה Select file from GCS bucket , הזן 'gs://firebase-recommendations/recommendations-test/formatted_data_filtered.txt'.
  10. בחר 'JSONL' בתפריט הנפתח של פורמט הקובץ .
  11. הזן 'table_recommendations' עבור שם הטבלה .
  12. סמן את התיבה תחת סכימה > זיהוי אוטומטי > סכימה ופרמטרי קלט
  13. בחר צור טבלה

חקור מערך נתונים לדוגמה

בשלב זה, באפשרותך לחקור את הסכימה ולצפות בתצוגה מקדימה של מערך הנתונים הזה.

  1. בחר firebase-recommendations-dataset בתפריט הימני כדי להרחיב את הטבלאות שהוא מכיל.
  2. בחר את טבלת ההמלצות כדי להציג את סכימת הטבלה.
  3. בחר תצוגה מקדימה כדי לראות את נתוני אירועי Analytics בפועל שהטבלה הזו מכילה.

צור אישורי חשבון שירות

כעת, ניצור אישורי חשבון שירות בפרויקט מסוף Google Cloud שלנו, בהם נוכל להשתמש בסביבת Colab בשלב הבא כדי לגשת לנתוני BigQuery שלנו ולטעון אותם.

  1. ודא שהחיוב מופעל עבור פרויקט Google Cloud שלך.
  2. הפעל את ממשקי API של BigQuery ו-BigQuery Storage API. < לחץ כאן >
  3. עבור לדף צור מפתח חשבון שירות .
  4. מרשימת חשבונות השירות , בחר חשבון שירות חדש .
  5. בשדה שם חשבון שירות , הזן שם.
  6. מרשימת התפקידים , בחר פרויקט > בעלים .
  7. לחץ על צור . קובץ JSON המכיל את הורדות המפתח שלך למחשב שלך.

בשלב הבא, נשתמש ב-Google Colab כדי לעבד מראש נתונים אלה ולהכשיר את מודל ההמלצות שלנו.

11. מעבד נתונים מראש ומודל המלצות הרכבת

בשלב זה, נשתמש במחברת Colab כדי לבצע את השלבים הבאים:

  1. לייבא את נתוני BigQuery למחברת Colab
  2. לעבד מראש את הנתונים כדי להכין אותם לאימון מודלים
  3. לאמן את מודל ההמלצות על נתוני הניתוח
  4. ייצא את הדגם כדגם TF lite
  5. לפרוס את המודל ל-Firebase Console כדי שנוכל להשתמש בו באפליקציה שלנו

לפני שנשיק את מחברת ההדרכה של Colab, תחילה נפעיל את ה-API לניהול מודלים של Firebase כך ש-Colab תוכל לפרוס את המודל המאומן בקונסולת Firebase שלנו.

אפשר Firebase Model Management API

צור דלי לאחסון דגמי ה-ML שלך

במסוף Firebase שלך, עבור אל אחסון ולחץ על התחל. fbbea78f0eb3dc9f.png

עקוב אחר הדיאלוג כדי להגדיר את הדלי שלך.

19517c0d6d2aa14d.png

הפעל את Firebase ML API

עבור לדף Firebase ML API ב-Google Cloud Console ולחץ על הפעל.

השתמש במחברת Colab כדי לאמן ולפרוס את המודל

פתח את מחברת colab באמצעות הקישור הבא והשלם את השלבים שבתוכו. לאחר סיום השלבים במחברת Colab, יהיה לך קובץ דגם TF lite פרוס למסוף Firebase שנוכל לסנכרן עם האפליקציה שלנו.

פתוח ב-Colab

12. הורד את הדגם באפליקציה שלך

בשלב זה, נשנה את האפליקציה שלנו כדי להוריד את הדגם שאימנו זה עתה מ-Firebase Machine Learning.

הוסף תלות ב-Firebase ML

התלות הבאה נחוצה כדי להשתמש במודלים של Firebase Machine Learning באפליקציה שלך. זה כבר אמור להתווסף (אמת).

app/build.grade

implementation 'com.google.firebase:firebase-ml-modeldownloader:24.0.4'

הורד את הדגם עם Firebase Model Manager API

העתק את הקוד למטה אל RecommendationClient.kt כדי להגדיר את התנאים שבהם מתרחשת הורדת המודל וצור משימת הורדה כדי לסנכרן את הדגם המרוחק עם האפליקציה שלנו.

RecommendationClient.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. העתק את הקוד הבא כדי לטעון את המועמדים הללו.

RecommendationClient.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.")
        }
    }

יישם עיבוד מקדים

בשלב העיבוד המקדים, אנו משנים את צורת נתוני הקלט כדי להתאים למה שהמודל שלנו מצפה. כאן, אנו מרפדים את אורך הקלט עם ערך מציין מיקום אם לא יצרנו כבר הרבה לייקים של משתמשים. העתק את הקוד למטה:

RecommendationClient.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
        }
    }


הפעל את המתורגמן כדי ליצור המלצות

כאן אנו משתמשים במודל שהורדנו בשלב הקודם כדי להפעיל הסקה על הקלט המעובד מראש שלנו. אנו מגדירים את סוג הקלט והפלט עבור המודל שלנו ומפעילים מסקנות כדי להפיק את המלצות הסרטים שלנו. העתק את הקוד הבא לאפליקציה שלך.

RecommendationClient.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()
            }
        }
    }



יישם עיבוד לאחר

לבסוף, בשלב זה אנו מעבדים לאחר מכן את הפלט מהמודל שלנו, בוחרים את התוצאות בביטחון הגבוה ביותר ומסירים ערכים מכילים (סרטים שהמשתמש כבר אהב). העתק את הקוד הבא לאפליקציה שלך.

RecommendationClient.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 Analytics
  • ייצא אירועי ניתוח ל-BigQuery
  • אירועי ניתוח תהליכים מקדימים
  • המלצות רכבת מודל TensorFlow
  • ייצא מודל ופריסה ל-Firebase Console
  • הגש המלצות על סרטים באפליקציה

הצעדים הבאים

  • הטמע המלצות Firebase ML באפליקציה שלך.

למד עוד

יש שאלה?

דווח על בעיות