به توصیههای مربوط به TensorFlow Lite و Codelab Firebase خوش آمدید. در این کد لبه یاد خواهید گرفت که چگونه از TensorFlow Lite و Firebase برای استقرار یک مدل توصیه در برنامه خود استفاده کنید. این Codelab بر اساس این مثال TensorFlow Lite است.
توصیهها به برنامهها اجازه میدهند تا از یادگیری ماشینی برای ارائه هوشمندانهترین محتوا برای هر کاربر استفاده کنند. آنها رفتار کاربر گذشته را در نظر می گیرند تا محتوای برنامه ای را که کاربر ممکن است بخواهد در آینده با آن تعامل داشته باشد، با استفاده از مدلی که بر روی رفتار جمعی تعداد زیادی از کاربران دیگر آموزش دیده است، پیشنهاد می کنند.
این آموزش نشان میدهد که چگونه با Firebase Analytics دادههایی را از کاربران برنامه خود بهدست آورید، یک مدل یادگیری ماشینی برای توصیههایی از آن دادهها بسازید، و سپس از آن مدل در یک برنامه اندروید برای اجرای استنتاج و دریافت توصیهها استفاده کنید. به ویژه، توصیههای ما نشان میدهد که کاربر با توجه به فهرست فیلمهایی که قبلاً دوست داشته است، به احتمال زیاد کدام فیلمها را تماشا میکند.
- Firebase Analytics را در یک برنامه اندرویدی ادغام کنید تا داده های رفتار کاربر را جمع آوری کنید
- آن داده ها را به Google Big Query صادر کنید
- داده ها را از قبل پردازش کنید و مدل توصیه های TF Lite را آموزش دهید
- مدل TF Lite را در Firebase ML مستقر کرده و از برنامه خود به آن دسترسی داشته باشید
- استنتاج دستگاه را با استفاده از مدل اجرا کنید تا توصیه هایی به کاربران ارائه دهید
- آخرین نسخه اندروید استودیو .
- کد نمونه
- یک دستگاه آزمایشی با Android نسخه ۷ و بالاتر و سرویسهای Google Play نسخه ۹.۸ یا بالاتر، یا شبیهساز با سرویسهای Google Play نسخه ۹.۸ یا بالاتر
- در صورت استفاده از دستگاه، کابل اتصال.
مخزن GitHub را از خط فرمان کلون کنید.
$ git clone https://github.com/FirebaseExtended/codelab-contentrecommendation-android.git
از Android Studio، پوشه codelab-recommendations-android
را انتخاب کنید ( ) از نمونه کد دانلود ( File > Open > .../codelab-recommendations-android/start).
اکنون باید پروژه شروع را در Android Studio باز کنید.
- به کنسول Firebase بروید.
- افزودن پروژه (یا ایجاد پروژه اگر اولین پروژه است) را انتخاب کنید.
- نام پروژه را انتخاب یا وارد کنید و روی Continue کلیک کنید.
- مطمئن شوید که "Enable Google Analytics for this project" فعال باشد.
- مراحل راهاندازی باقیمانده را در کنسول Firebase دنبال کنید، سپس روی ایجاد پروژه (یا افزودن Firebase، اگر از یک پروژه Google موجود استفاده میکنید) کلیک کنید.
- از صفحه نمای کلی پروژه جدید خود، روی نماد Android کلیک کنید تا گردش کار راه اندازی شود.
- نام بسته Codelab را وارد کنید:
com.google.firebase.codelabs.recommendations
- ثبت برنامه را انتخاب کنید.
پس از افزودن نام بسته و انتخاب ثبت نام، روی Download google-services.json کلیک کنید تا فایل پیکربندی Android Firebase خود را دریافت کنید و سپس فایل google-services.json را در فهرست app
در پروژه خود کپی کنید. پس از دانلود فایل، می توانید مراحل بعدی نشان داده شده در کنسول را رد کنید (آنها قبلاً برای شما در پروژه build-android-start انجام شده اند).
افزونه google-services از فایل google-services.json برای پیکربندی برنامه شما برای استفاده از Firebase استفاده می کند. خطوط زیر باید قبلاً به فایلهای build.gradle.kts در پروژه اضافه شوند (برای تأیید بررسی کنید):
app/build.grade.kts
plugins {
id("com.google.gms.google-services")
}
build.grade.kts
plugins {
id("com.google.gms.google-services") version "4.3.15" apply false
}
برای اطمینان از اینکه همه وابستگی ها برای برنامه شما در دسترس هستند، باید پروژه خود را با فایل های gradle در این مرحله همگام کنید. File > Sync Project with Gradle Files را از نوار ابزار Android Studio انتخاب کنید.
اکنون که پروژه را به Android Studio وارد کرده اید و افزونه google-services
را با فایل JSON خود پیکربندی کرده اید، برای اولین بار آماده اجرای برنامه هستید. دستگاه اندروید خود را وصل کنید و روی Run کلیک کنید ( )در نوار ابزار Android Studio.
برنامه باید روی دستگاه شما راه اندازی شود. در این مرحله، میتوانید یک برنامه کاربردی را مشاهده کنید که یک برگه با فهرست فیلمها، یک تب فیلمهای پسندیده و یک برگه توصیهها را نشان میدهد. می توانید روی یک فیلم در لیست فیلم ها کلیک کنید تا آن را به لیست پسندیده خود اضافه کنید. پس از انجام مراحل باقیمانده از نرم افزار کد، می توانیم توصیه های فیلم را در تب توصیه ها تولید کنیم.
در این مرحله، Firebase Analytics را برای ثبت دادههای رفتار کاربر (در این مورد، فیلمهایی که کاربر دوست دارد) به برنامه اضافه میکنید. این دادهها در مراحل آتی برای آموزش مدل توصیهها به صورت مجموع استفاده خواهند شد.
وابستگی های زیر برای افزودن Firebase Analytics به برنامه شما ضروری است. آنها باید قبلاً در فایل app/build.gradle.kts گنجانده شده باشند (تأیید شود).
app/build.grade.kts
implementation(platform("com.google.firebase:firebase-bom:32.0.0"))
implementation("com.google.firebase:firebase-analytics-ktx")
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)
}
}
در این مرحله، رویدادهای Analytics را در برنامه تولید میکنیم و تأیید میکنیم که آنها به کنسول Firebase ارسال میشوند.
Firebase Analytics برای به حداکثر رساندن عمر باتری کاربر طراحی شده است و رویدادها را روی دستگاه دسته بندی می کند و فقط گهگاه آنها را به Firebase ارسال می کند. برای اهداف اشکالزدایی، میتوانیم این رفتار را غیرفعال کنیم تا با اجرای دستور زیر در پوسته، رویدادها را زمانی که بهصورت بلادرنگ ثبت میشوند، ببینیم.
ترمینال
adb shell setprop debug.firebase.analytics.app com.google.firebase.codelabs.recommendations
- در استودیو اندروید، پنجره Logcat را باز کنید تا لاگ کردن برنامه خود را بررسی کنید.
- فیلتر Logcat را روی رشته "Logging event" تنظیم کنید.
- بررسی کنید که رویدادهای Analytics "select_item" هر بار که فیلمی را در برنامه دوست دارید منتشر می شود.
در این مرحله، شما با موفقیت Firebase Analytics را در برنامه خود ادغام کرده اید. همانطور که کاربران از برنامه شما استفاده می کنند و فیلم ها را می پسندند، لایک های آنها در مجموع ثبت می شود. ما از این دادههای انبوه در بقیه قسمتهای این کد برای آموزش مدل توصیههایمان استفاده خواهیم کرد. در زیر یک مرحله اختیاری است تا رویدادهای Analytics مشابهی را که در Logcat مشاهده کردید، به کنسول Firebase نیز مشاهده کنید. با خیال راحت به صفحه بعدی بروید.
- به کنسول Firebase بروید.
- DebugView را در بخش Analytics انتخاب کنید
- در اندروید استودیو، Run را انتخاب کنید تا برنامه راه اندازی شود و چند فیلم به لیست لایک شده خود اضافه شود.
- در DebugView کنسول Firebase، بررسی کنید که با افزودن فیلمها به برنامه، این رویدادها ثبت میشوند.
Big Query یک محصول Google Cloud است که به شما امکان می دهد حجم زیادی از داده ها را بررسی و پردازش کنید. در این مرحله، پروژه Firebase Console خود را به Big Query متصل می کنید تا داده های Analytics تولید شده توسط برنامه شما به طور خودکار به Big Query صادر شود.
- به کنسول Firebase بروید.
- نماد چرخ دنده تنظیمات را در کنار نمای کلی پروژه انتخاب کنید و سپس تنظیمات پروژه را انتخاب کنید
- تب Integrations را انتخاب کنید.
- پیوند (یا مدیریت ) را در بلوک BigQuery انتخاب کنید.
- در مرحله About Linking Firebase به BigQuery گزینه Next را انتخاب کنید.
- در بخش پیکربندی یکپارچهسازی ، روی سوئیچ کلیک کنید تا ارسال دادههای Google Analytics فعال شود و پیوند به BigQuery را انتخاب کنید.
اکنون پروژه کنسول Firebase خود را فعال کرده اید تا به طور خودکار داده های رویداد Firebase Analytics را به Big Query ارسال کند. این به طور خودکار و بدون هیچ گونه تعامل بیشتر اتفاق می افتد، با این حال، اولین صادراتی که مجموعه داده های تجزیه و تحلیل را در BigQuery ایجاد می کند ممکن است تا 24 ساعت اتفاق نیفتد. پس از ایجاد مجموعه داده، Firebase به طور مداوم رویدادهای جدید Analytics را به Big Query در جدول روزانه صادر می کند و رویدادهای روزهای گذشته را در جدول رویدادها گروه بندی می کند.
آموزش مدل توصیه ها به داده های زیادی نیاز دارد. از آنجایی که ما در حال حاضر اپلیکیشنی نداریم که حجم زیادی از داده را تولید کند، در مرحله بعدی یک مجموعه داده نمونه را به BigQuery وارد می کنیم تا در ادامه این آموزش از آن استفاده کنیم.
اکنون که کنسول Firebase خود را برای صادرات به BigQuery متصل کردهایم، دادههای رویداد تجزیه و تحلیل برنامه ما پس از مدتی بهطور خودکار در کنسول BigQuery نشان داده میشود. برای به دست آوردن برخی از داده های اولیه برای اهداف این آموزش، در این مرحله یک مجموعه داده نمونه موجود را به کنسول BigQuery شما وارد می کنیم تا از آن برای آموزش مدل توصیه های خود استفاده کنیم.
- به داشبورد BigQuery در کنسول ابری Google بروید.
- نام پروژه خود را در منو انتخاب کنید.
- نام پروژه خود را در پایین ناوبری سمت چپ BigQuery انتخاب کنید تا جزئیات را ببینید.
- ایجاد مجموعه داده را انتخاب کنید تا پانل ایجاد مجموعه داده باز شود.
- «firebase_recommendations_dataset» را برای شناسه مجموعه داده وارد کنید و ایجاد مجموعه داده را انتخاب کنید.
- مجموعه داده جدید در منوی سمت چپ زیر نام پروژه نمایش داده می شود. روی آن کلیک کنید.
- برای باز کردن پنل ایجاد جدول، Create table را انتخاب کنید.
- برای ایجاد جدول از «Google Cloud Storage» را انتخاب کنید.
- در قسمت انتخاب فایل از سطل GCS ، «gs://firebase-recommendations/recommendations-test/formatted_data_filtered.txt» را وارد کنید.
- "JSONL" را در قالب بازشوی File انتخاب کنید.
- 'recommendations_table' را برای نام جدول وارد کنید.
- کادر زیر Schema > Auto detect > Schema and input parameters را علامت بزنید
- ایجاد جدول را انتخاب کنید
در این مرحله، می توانید به صورت اختیاری طرحواره را کاوش کرده و پیش نمایش این مجموعه داده را مشاهده کنید.
- برای گسترش جداول موجود در منوی سمت چپ ، firebase-recommendations-dataset را انتخاب کنید.
- برای مشاهده طرح جدول ، جدول توصیه ها را انتخاب کنید.
- پیشنمایش را انتخاب کنید تا دادههای رویداد Analytics واقعی این جدول را ببینید.
اکنون، اعتبارنامههای حساب سرویس را در پروژه کنسول Google Cloud خود ایجاد میکنیم که میتوانیم از آن در محیط Colab در مرحله زیر برای دسترسی و بارگیری دادههای BigQuery خود استفاده کنیم.
- مطمئن شوید که صورتحساب برای پروژه Google Cloud شما فعال است.
- API های BigQuery و BigQuery Storage API را فعال کنید. < اینجا را کلیک کنید >
- به صفحه Create Service Account Key بروید.
- از لیست حساب سرویس ، حساب سرویس جدید را انتخاب کنید.
- در قسمت نام حساب سرویس ، یک نام وارد کنید.
- از فهرست نقش ، پروژه > مالک را انتخاب کنید.
- روی ایجاد کلیک کنید. یک فایل JSON که حاوی دانلودهای کلید شما در رایانه شما است.
در مرحله بعدی، از Google Colab برای پیش پردازش این داده ها و آموزش مدل توصیه های خود استفاده خواهیم کرد.
در این مرحله از یک نوت بوک Colab برای انجام مراحل زیر استفاده می کنیم:
- داده های BigQuery را به نوت بوک Colab وارد کنید
- داده ها را پیش پردازش کنید تا برای آموزش مدل آماده شوند
- آموزش مدل توصیهها بر روی دادههای تحلیلی
- مدل را به عنوان یک مدل TF lite صادر کنید
- مدل را در کنسول Firebase قرار دهید تا بتوانیم از آن در برنامه خود استفاده کنیم
قبل از راه اندازی نوت بوک آموزشی Colab، ابتدا API مدیریت مدل Firebase را فعال می کنیم تا Colab بتواند مدل آموزش دیده را در کنسول Firebase ما مستقر کند.
در کنسول Firebase خود، به Storage بروید و روی شروع کار کلیک کنید.
گفتگو را دنبال کنید تا سطل خود را راه اندازی کنید.
به صفحه Firebase ML API در Google Cloud Console بروید و روی Enable کلیک کنید.
دفترچه یادداشت colab را با استفاده از لینک زیر باز کنید و مراحل داخل را تکمیل کنید. پس از اتمام مراحل در نوت بوک Colab، یک فایل مدل TF lite در کنسول Firebase مستقر شده است که می توانیم آن را با برنامه خود همگام سازی کنیم.
در این مرحله، برنامه خود را تغییر میدهیم تا مدلی را که به تازگی آموزش دادهایم از Firebase Machine Learning بارگیری کند.
برای استفاده از مدلهای یادگیری ماشین Firebase در برنامه خود، وابستگی زیر مورد نیاز است. قبلاً باید اضافه شود (تأیید شود).
app/build.grade.kts
implementation("com.google.firebase:firebase-ml-modeldownloader:24.1.2")
کد زیر را در 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.")
}
}
زمان اجرا 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
}
}
برنامه خود را دوباره اجرا کنید. همانطور که چند فیلم را انتخاب می کنید، باید به طور خودکار مدل جدید را دانلود کرده و شروع به تولید توصیه کند!
شما با استفاده از TensorFlow Lite و Firebase یک ویژگی توصیه در برنامه خود ایجاد کرده اید. توجه داشته باشید که تکنیک ها و خط لوله نشان داده شده در این کد لبه را می توان تعمیم داد و برای ارائه انواع دیگر توصیه ها نیز استفاده کرد.
- Firebase ML
- تجزیه و تحلیل Firebase
- رویدادهای تجزیه و تحلیل را به BigQuery صادر کنید
- رویدادهای تجزیه و تحلیل پیش پردازش
- توصیه های قطار مدل TensorFlow
- صادر کردن مدل و استقرار به کنسول Firebase
- پیشنهادهای فیلم را در یک برنامه ارائه دهید
- توصیه های Firebase ML را در برنامه خود پیاده کنید.