เพิ่มคำแนะนำลงในแอปด้วย TensorFlow Lite และ Firebase - Android Codelab

1. ภาพรวม

ยินดีต้อนรับสู่คำแนะนำที่มี TensorFlow Lite และ Firebase Codelab ใน Codelab นี้ คุณจะได้เรียนรู้วิธีใช้ TensorFlow Lite และ Firebase เพื่อทำให้โมเดลคำแนะนำใช้งานได้ในแอป Codelab นี้อิงตามตัวอย่าง TensorFlow Lite นี้

คำแนะนำจะช่วยให้แอปใช้แมชชีนเลิร์นนิงเพื่อแสดงเนื้อหาที่เกี่ยวข้องที่สุดให้ผู้ใช้แต่ละรายได้อย่างชาญฉลาด โดยจะคำนึงถึงพฤติกรรมที่ผ่านมาของผู้ใช้เพื่อแนะนำเนื้อหาของแอปที่ผู้ใช้อาจต้องการโต้ตอบด้วยในอนาคต โดยใช้โมเดลที่ฝึกตามพฤติกรรมโดยรวมของผู้ใช้จำนวนมาก

บทแนะนํานี้จะแสดงวิธีรับข้อมูลจากผู้ใช้แอปด้วย Firebase Analytics, สร้างโมเดลแมชชีนเลิร์นนิงสําหรับคําแนะนําจากข้อมูลนั้น แล้วใช้รูปแบบนั้นในแอป Android เพื่อเรียกใช้การอนุมานและรับคําแนะนํา กล่าวอย่างเจาะจงคือ การแนะนำของเราจะแนะนำภาพยนตร์ที่ผู้ใช้น่าจะดูมากที่สุดจากรายชื่อภาพยนตร์ที่ผู้ใช้เคยชอบก่อนหน้านี้

สิ่งที่คุณจะได้เรียนรู้

  • ผสานรวม Firebase Analytics ในแอป Android เพื่อรวบรวมข้อมูลพฤติกรรมของผู้ใช้
  • ส่งออกข้อมูลนั้นไปยัง Google Big Query
  • ประมวลผลข้อมูลล่วงหน้าและฝึกโมเดลคำแนะนำของ TF Lite
  • ทำให้โมเดล TF Lite ใช้งานได้ใน Firebase ML และเข้าถึงได้จากแอปของคุณ
  • เรียกใช้การอนุมานของอุปกรณ์โดยใช้โมเดลเพื่อแนะนำคำแนะนำให้แก่ผู้ใช้

สิ่งที่คุณต้องมี

  • Android Studio เวอร์ชันล่าสุด
  • โค้ดตัวอย่าง
  • อุปกรณ์ทดสอบที่ใช้ Android 7 ขึ้นไปและบริการ Google Play 9.8 ขึ้นไป หรือโปรแกรมจำลองที่มีบริการ Google Play 9.8 ขึ้นไป
  • หากใช้อุปกรณ์ ให้ใช้สายเชื่อมต่อ

คุณจะใช้บทแนะนำนี้อย่างไร

อ่านเท่านั้น อ่านและทำแบบฝึกหัด

คุณจะให้คะแนนประสบการณ์ในการสร้างแอป Android ของคุณมากน้อยเพียงใด

มือใหม่ ระดับกลาง ผู้ชำนาญ

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. จากหน้าจอภาพรวมของโปรเจ็กต์ใหม่ ให้คลิกไอคอน Android เพื่อเปิดเวิร์กโฟลว์การตั้งค่า
  2. ป้อนชื่อแพ็กเกจของ Codelab: com.google.firebase.codelabs.recommendations
  3. เลือกลงทะเบียนแอป

เพิ่มไฟล์ google-services.json ในแอป

หลังจากเพิ่มชื่อแพ็กเกจและเลือก "ลงทะเบียน" แล้ว ให้คลิกดาวน์โหลด google-services.json เพื่อรับไฟล์การกำหนดค่า Firebase Android แล้วคัดลอกไฟล์ google-services.json ไปยังไดเรกทอรี app ในโปรเจ็กต์ของคุณ หลังจากดาวน์โหลดไฟล์แล้ว คุณจะข้ามขั้นตอนถัดไปที่แสดงในคอนโซลได้ (ดำเนินการให้คุณแล้วในโปรเจ็กต์บิลด์ Android-start)

เพิ่มปลั๊กอิน google-services ในแอป

ปลั๊กอิน 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

คุณควรซิงค์โปรเจ็กต์กับไฟล์ Gradle ในขั้นตอนนี้ เพื่อให้มั่นใจว่าทรัพยากร Dependency ทั้งหมดพร้อมใช้งานสำหรับแอป เลือก ไฟล์ > ซิงค์โปรเจ็กต์ด้วยไฟล์ Gradle จากแถบเครื่องมือของ Android Studio

6. เรียกใช้แอปเริ่มต้น

เมื่อนำเข้าโปรเจ็กต์ลงใน Android Studio และกำหนดค่าปลั๊กอิน google-services ด้วยไฟล์ JSON แล้ว คุณก็พร้อมที่จะเรียกใช้แอปเป็นครั้งแรก เชื่อมต่ออุปกรณ์ Android และคลิกเรียกใช้ ( ดำเนินการ.png) ในแถบเครื่องมือ Android Studio

แอปจะเปิดขึ้นในอุปกรณ์ ในตอนนี้ คุณจะเห็นแอปพลิเคชันที่ทำงานได้ซึ่งจะแสดงแท็บที่มีรายชื่อภาพยนตร์ แท็บภาพยนตร์ที่ชอบ และแท็บรายการแนะนำ คุณสามารถคลิกภาพยนตร์ในรายการภาพยนตร์เพื่อเพิ่มลงในรายการที่ชอบ หลังจากทำตามขั้นตอนที่เหลือของ Codelab แล้ว เราจะสร้างภาพยนตร์แนะนำได้ในแท็บคำแนะนำ

7. เพิ่ม Firebase Analytics ลงในแอป

ในขั้นตอนนี้ คุณจะต้องเพิ่ม Firebase Analytics ลงในแอปเพื่อบันทึกข้อมูลพฤติกรรมของผู้ใช้ (ในกรณีนี้ ซึ่งเป็นภาพยนตร์ที่ผู้ใช้ชอบ) ระบบจะนำข้อมูลนี้มาใช้ในภาพรวมในขั้นตอนต่อๆ ไปเพื่อฝึกโมเดลคำแนะนำ

เพิ่ม Bill of Materials ของ Firebase และทรัพยากร Dependency ของ Analytics

จำเป็นต้องใช้ทรัพยากร Dependency ต่อไปนี้เพื่อเพิ่ม 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 ในแอป

LikeMoviesViewModel มีฟังก์ชันในการจัดเก็บภาพยนตร์ที่ผู้ใช้ชอบ ทุกครั้งที่ผู้ใช้ชอบภาพยนตร์เรื่องใหม่ เราต้องการส่งเหตุการณ์ในบันทึกของ Analytics ออกไปด้วยเพื่อบันทึกช่วงเวลาดังกล่าว

เพิ่มฟังก์ชัน onMoviemovie พร้อมโค้ดด้านล่างเพื่อลงทะเบียนเหตุการณ์ Analytics เมื่อผู้ใช้คลิก เช่น ภาพยนตร์

ชอบMoviesViewModel.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 เมื่อมีการเพิ่มภาพยนตร์ลงในรายการที่ชอบของผู้ใช้

ชอบMoviesViewModel.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

เปิดใช้การบันทึกการแก้ไขข้อบกพร่องของ Analytics

Firebase Analytics ออกแบบมาเพื่อยืดอายุการใช้งานแบตเตอรี่ของผู้ใช้ให้ได้มากที่สุด และจะจัดกลุ่มเหตุการณ์ต่างๆ ในอุปกรณ์และส่งไปยัง Firebase เป็นครั้งคราวเท่านั้น สำหรับวัตถุประสงค์ในการแก้ไขข้อบกพร่อง เราสามารถปิดใช้ลักษณะการทำงานนี้เพื่อดูเหตุการณ์ในขณะที่บันทึกแบบเรียลไทม์โดยเรียกใช้คำสั่งต่อไปนี้ใน Shell

เทอร์มินัล

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 เข้ากับแอปเรียบร้อยแล้ว เมื่อผู้ใช้ใช้แอปของคุณและกดชอบภาพยนตร์ ระบบจะบันทึกการชอบของผู้ใช้แบบสรุปรวม เราจะใช้ข้อมูลรวมนี้ในส่วนที่เหลือของ Codelab นี้เพื่อฝึกโมเดลคำแนะนำของเรา ขั้นตอนต่อไปนี้เป็นขั้นตอนที่ไม่บังคับเพื่อดูเหตุการณ์ Analytics เดียวกันกับที่เห็นใน Logcat จะสตรีมในคอนโซล Firebase ด้วย คุณสามารถข้ามไปยังหน้าถัดไปได้

ไม่บังคับ: ยืนยันเหตุการณ์ Analytics ในคอนโซล Firebase

  1. ไปที่คอนโซล Firebase
  2. เลือก DebugView ใต้ Analytics
  3. ใน Android Studio ให้เลือกเรียกใช้เพื่อเปิดแอปและเพิ่มภาพยนตร์ลงในรายการที่ชอบ
  4. ใน DebugView ของคอนโซล Firebase ให้ยืนยันว่ากำลังบันทึกเหตุการณ์เหล่านี้ขณะเพิ่มภาพยนตร์ในแอป

9. ส่งออกข้อมูล Analytics ไปยัง BigQuery

Big Query เป็นผลิตภัณฑ์ของ Google Cloud ที่ช่วยให้คุณตรวจสอบและประมวลผลข้อมูลจำนวนมากได้ ในขั้นตอนนี้ คุณจะต้องเชื่อมต่อโปรเจ็กต์คอนโซล Firebase กับ Big Query เพื่อให้ข้อมูล Analytics ที่แอปของคุณสร้างขึ้นส่งออกไปยัง Big Query โดยอัตโนมัติ

เปิดใช้การส่งออก Big Query

  1. ไปที่คอนโซล Firebase
  2. เลือกไอคอนการตั้งค่ารูปเฟืองข้างภาพรวมโครงการ แล้วเลือกการตั้งค่าโครงการ
  3. เลือกแท็บ Integrations
  4. เลือกลิงก์ (หรือจัดการ) ภายในบล็อก BigQuery
  5. เลือกถัดไปในขั้นตอนเกี่ยวกับการลิงก์ Firebase กับ BigQuery
  6. ในส่วนกำหนดค่าการผสานรวม ให้คลิกสวิตช์เพื่อเปิดใช้การส่งข้อมูล Google Analytics และเลือกลิงก์กับ BigQuery

ตอนนี้คุณได้เปิดใช้โปรเจ็กต์คอนโซล Firebase เพื่อส่งข้อมูลเหตุการณ์ Firebase Analytics ไปยัง Big Query โดยอัตโนมัติแล้ว การดําเนินการนี้จะเกิดขึ้นโดยอัตโนมัติโดยไม่ต้องมีการโต้ตอบเพิ่มเติม อย่างไรก็ตาม การส่งออกครั้งแรกที่สร้างชุดข้อมูล Analytics ใน BigQuery อาจไม่เกิดขึ้นเป็นเวลา 24 ชั่วโมง หลังจากสร้างชุดข้อมูลแล้ว Firebase จะส่งออกเหตุการณ์ Analytics ใหม่ไปยัง 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/formatted_data_filtered.txt"
  10. เลือก "JSONL" ในเมนูแบบเลื่อนลงรูปแบบไฟล์
  11. ป้อน "recommendations_table" สำหรับชื่อตาราง
  12. เลือกช่องใต้สคีมา > ตรวจพบอัตโนมัติ > สคีมาและพารามิเตอร์อินพุต
  13. เลือกสร้างตาราง

สำรวจชุดข้อมูลตัวอย่าง

ในจุดนี้ คุณจะสำรวจสคีมาและดูตัวอย่างชุดข้อมูลนี้ได้

  1. เลือก firebase-recommendations-dataset ในเมนูด้านซ้ายเพื่อขยายตารางที่มีอยู่
  2. เลือกตาราง recommendations-table เพื่อดูสคีมาของตาราง
  3. เลือกแสดงตัวอย่างเพื่อดูข้อมูลเหตุการณ์ Analytics จริงในตารางนี้

สร้างข้อมูลเข้าสู่ระบบของบัญชีบริการ

ตอนนี้ เราจะสร้างข้อมูลเข้าสู่ระบบของบัญชีบริการในโปรเจ็กต์ Google Cloud Console ที่เราสามารถใช้ในสภาพแวดล้อม 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 เพื่อให้เรานำไปใช้ในแอปได้

ก่อนที่เราจะเปิดตัวสมุดบันทึกการฝึกอบรม Colab เราจะเปิดใช้ Firebase Model Management API ก่อน เพื่อให้ Colab สามารถทำให้โมเดลที่ได้รับการฝึกใช้งานได้ในคอนโซล Firebase

เปิดใช้ Firebase Model Management API

สร้างที่เก็บข้อมูลเพื่อจัดเก็บโมเดล ML

ในคอนโซล Firebase ให้ไปที่พื้นที่เก็บข้อมูลแล้วคลิก "เริ่มต้นใช้งาน" fbbea78f0eb3dc9f.png

ทำตามกล่องโต้ตอบเพื่อตั้งค่าที่เก็บข้อมูล

19517c0d6d2aa14d.png

เปิดใช้ Firebase ML API

ไปที่หน้า Firebase ML API บน Google Cloud Console แล้วคลิกเปิดใช้

ใช้ Colab Notebook เพื่อฝึกและทำให้โมเดลใช้งานได้

เปิดสมุดบันทึก Colab โดยใช้ลิงก์ต่อไปนี้ แล้วทําตามขั้นตอนภายใน หลังจากทำตามขั้นตอนใน Colab Notebook เสร็จแล้ว คุณจะมีไฟล์โมเดล TF Lite ที่ทำให้ใช้งานได้ในคอนโซล Firebase ซึ่งเราซิงค์ข้อมูลลงในแอปได้

เปิดใน Colab

12. ดาวน์โหลดโมเดลในแอป

ในขั้นตอนนี้ เราจะแก้ไขแอปให้ดาวน์โหลดโมเดลที่เพิ่งฝึกจากแมชชีนเลิร์นนิงของ Firebase

เพิ่มทรัพยากร Dependency ของ Firebase ML

จำเป็นต้องมีทรัพยากร Dependency ต่อไปนี้เพื่อใช้โมเดลแมชชีนเลิร์นนิงของ Firebase ในแอป ข้อมูลนี้ควรได้รับการเพิ่มแล้ว (ยืนยัน)

app/build.Grade.kts

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

ดาวน์โหลดโมเดลด้วย 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 โปรดทราบว่าเทคนิคและไปป์ไลน์ที่แสดงใน Codelab นี้สามารถทำให้เป็นแบบทั่วไปและใช้เพื่อแสดงคำแนะนำประเภทอื่นๆ ได้เช่นกัน

สรุปประเด็นที่ได้พูดถึง

  • Firebase ML
  • Firebase Analytics
  • ส่งออกเหตุการณ์การวิเคราะห์ไปยัง BigQuery
  • ประมวลผลเหตุการณ์ Analytics ล่วงหน้า
  • ฝึกโมเดล TensorFlow ที่แนะนำ
  • ส่งออกโมเดลและทำให้ใช้งานได้ในคอนโซล Firebase
  • แสดงคำแนะนำภาพยนตร์ในแอป

ขั้นตอนถัดไป

  • ใช้คำแนะนำ Firebase ML ในแอป

ดูข้อมูลเพิ่มเติม

หากมีข้อสงสัย

รายงานปัญหา