透過 TensorFlow Lite 和 Firebase,將裝置端文字分類功能新增至應用程式 - Android 程式碼研究室

1. 總覽

text-classification-result.png

歡迎來到 TensorFlow Lite 和 Firebase 程式碼研究室:文字分類。在這個程式碼研究室中,您將瞭解如何使用 TensorFlow Lite 和 Firebase 訓練文字分類模型,並部署至應用程式。本程式碼研究室是以這個 TensorFlow Lite 範例為基礎。

文字分類是指根據內容指派標記或類別的過程。這是自然語言處理 (NLP) 的其中一項基本工作,而且用途廣泛,例如情緒分析、主題標籤、垃圾內容偵測和意圖偵測。

情緒分析是使用文字分析技巧,在文字資料中解釋情緒 (包括正面、負面和中立) 的解釋和分類。情緒分析可讓商家瞭解客戶對產品、品牌或服務在線上對話和意見回饋中的情緒。

本教學課程說明如何建構情緒分析的機器學習模型,特別是將文字分類為正面或負面。以上是二元分類 (二級) 的例子,這是一種重要且廣泛適用的機器學習問題。

課程內容

  • 使用 TF Lite Model Maker 訓練 TF Lite 情緒分析模型
  • 將 TF Lite 模型部署至 Firebase ML,並透過應用程式存取
  • 使用 TF Lite 工作程式庫將 TF Lite 情緒分析模型整合至應用程式

軟硬體需求

  • 最新版 Android Studio
  • 程式碼範例。
  • 搭載 Android 5.0 以上版本和 Google Play 服務 9.8 以上版本的測試裝置,或搭載 Google Play 服務 9.8 以上版本的模擬器
  • 如果使用裝置,則必須提供連接線。

您會如何使用這個教學課程?

僅供閱讀 閱讀並完成練習

你對建構 Android 應用程式的體驗有何評價?

新手 中級 還算容易

2. 取得程式碼範例

從指令列複製 GitHub 存放區。

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

如果您尚未安裝 Git,也可以從 GitHub 頁面或點選這個連結下載範例專案。

3. 匯入範例應用程式

在 Android Studio 中,從程式碼範例下載處選取 codelab-textclassification-android-master 目錄 (android_studio_folder.png) (「File」(檔案) >「Open」(開啟) > .../codelab-textclassification-android-master/start)。

現在,您應該已在 Android Studio 中開啟「Start」專案。

4. 執行範例應用程式

您已將專案匯入 Android Studio,現在可以開始執行應用程式了。連結 Android 裝置,然後按一下 Android Studio 工具列中的「Run」圖示 執行.png

應用程式應會在裝置上啟動。內容只有簡單的 UI,才能在後續步驟中整合及測試文字分類模型。這時,如果您嘗試預測情緒,應用程式只會傳回一些虛擬結果。

2fb4e69fafb2e3ed.png

5. 建立 Firebase 控制台專案

將 Firebase 新增至專案

  1. 前往 Firebase 控制台
  2. 選取「新增專案」
  3. 請選取或輸入專案名稱。
  4. 按照 Firebase 控制台中的其餘設定步驟操作,然後按一下「建立專案」(如果您使用現有的 Google 專案,請按一下「新增 Firebase」)。

6. 將 Firebase 新增至應用程式

  1. 在新專案的總覽畫面中,按一下 Android 圖示以啟動設定工作流程。
  2. 輸入程式碼研究室的套件名稱:org.tensorflow.lite.codelabs.textclassification

在應用程式中加入 google-services.json 檔案

新增套件名稱並選取「註冊」後,請點選「Download google-services.json」取得 Firebase Android 設定檔,然後將 google-services.json 檔案複製到專案的 *app* 目錄中。

在應用程式中加入 google-services 外掛程式

按照 Firebase 控制台的操作說明更新 build.gradle.kts 檔案,將 Firebase 新增至應用程式。

Google 服務外掛程式會使用 google-services.json 檔案,將您的應用程式設定為使用 Firebase。

將專案與 Gradle 檔案同步處理

為確保應用程式能夠使用所有依附元件,請在此時將專案與 Gradle 檔案同步處理。選取「檔案」>透過 Android Studio 工具列同步處理專案與 Gradle 檔案。

7. 使用 Firebase 執行應用程式

您已經使用 JSON 檔案設定 google-services 外掛程式,現在可以使用 Firebase 執行應用程式了。連結 Android 裝置,然後按一下 Android Studio 工具列中的「Run」圖示 執行.png

應用程式應會在裝置上啟動。此時,您的應用程式應該仍可成功建構。

8. 訓練情緒分析模型

我們會使用 TensorFlow Lite Model Maker 訓練文字分類模型,藉此預測特定文字的情緒。

這個步驟會以 Python 筆記本的形式呈現,您可以在 Google Colab 中開啟。選擇「執行階段」>「執行階段 >全部執行:一次執行所有筆記本。

在 Colab 中開啟

完成這個步驟後,您會擁有 TensorFlow Lite 情緒分析模型,隨時可以部署至行動應用程式。

9. 將模型部署至 Firebase ML

將模型部署至 Firebase ML 有幾個主要原因:

  1. 我們可以縮減應用程式安裝大小,並只在有需要時才下載模型
  2. 模型可以定期更新,且發布週期與整個應用程式不同

這個模型可透過控制台或 Firebase Admin SDK 以程式輔助方式部署。在這個步驟中,我們會透過控制台部署。

首先,請開啟 Firebase 主控台,然後按一下左側導覽面板中的「機器學習」。按一下「開始使用」第一個輸入字詞接著前往「自訂」並點選「新增模式」按鈕。

當系統出現提示時,請將模型命名為 sentiment_analysis,並上傳在上一個步驟中從 Colab 下載的檔案。

3c3c50e6ef12b3b.png

10. 從 Firebase ML 下載模型

從 Firebase 將遠端模型下載至應用程式可能並不容易,因為 TFLite 模型的大小可能相對龐大。最理想的狀況是希望避免在應用程式啟動時立即載入模型,因為如果模型僅用於其中一項功能,且使用者從未使用該功能,我們就沒有理由下載大量資料。你也可以設定下載選項,例如只在連上 Wi-Fi 時擷取模型。如要確保模型在沒有網路連線的情況下也能使用,請務必將模型綁定做為備份使用。

為求簡單起見,在首次啟動時,我們會移除預設套裝組合模型,並一律從 Firebase 下載模型。這樣一來,執行情緒分析時,就能確保推論是以 Firebase 提供的模型執行。

app/build.gradle.kts 檔案中,新增 Firebase 機器學習依附元件。

app/build.gradle.kts

尋找這則留言:

// TODO 1: Add Firebase ML dependency

然後新增下列項目:

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

當 Android Studio 要求同步處理專案時,請選擇「Sync Now」

接著再加入一些程式碼,從 Firebase 下載模型。

MainActivity.java

尋找這則留言:

// TODO 2: Implement a method to download TFLite model from Firebase

然後新增下列項目:

  /** Download model from Firebase ML. */
  private synchronized void downloadModel(String modelName) {
      CustomModelDownloadConditions conditions = new CustomModelDownloadConditions.Builder()
            .requireWifi()
            .build();
      FirebaseModelDownloader.getInstance()
              .getModel("sentiment_analysis", DownloadType.LOCAL_MODEL, conditions)
              .addOnSuccessListener(model -> {
                  try {
                      // TODO 6: Initialize a TextClassifier with the downloaded model

                      predictButton.setEnabled(true);
                  } catch (IOException e) {
                      Log.e(TAG, "Failed to initialize the model. ", e);
                      Toast.makeText(
                              MainActivity.this,
                              "Model initialization failed.",
                              Toast.LENGTH_LONG)
                              .show();
                      predictButton.setEnabled(false);
                  }
              })
              .addOnFailureListener(e -> {
                      Log.e(TAG, "Failed to download the model. ", e);
                      Toast.makeText(
                              MainActivity.this,
                              "Model download failed, please check your connection.",
                              Toast.LENGTH_LONG)
                              .show();

                      }
              );

}

接著,在活動的 onCreate 方法中呼叫 downloadModel 方法。

MainActivity.java

尋找這則留言:

// TODO 3: Call the method to download TFLite model

然後新增下列項目:

downloadModel("sentiment_analysis");

11. 將模型整合至應用程式中

只要使用 Tensorflow Lite 工作程式庫,您只需要加入幾行程式碼,就能將 TensorFlow Lite 模型整合至應用程式。我們會使用從 Firebase 下載的 TensorFlow Lite 模型,初始化 NLClassifier 執行個體。之後,我們會使用它來分類應用程式使用者輸入的文字,並在 UI 中顯示結果。

新增依附元件

前往應用程式的 Gradle 檔案,然後在應用程式的依附元件中新增 TensorFlow Lite 工作程式庫 (文字)。

app/build.gradle

尋找這則留言:

// TODO 4: Add TFLite Task API (Text) dependency

然後新增下列項目:

implementation("org.tensorflow:tensorflow-lite-task-text:0.3.0")

當 Android Studio 要求同步處理專案時,請選擇「Sync Now」

初始化文字分類器

接著,系統會使用工作資料庫的 NLClassifier,載入從 Firebase 下載的情緒分析模型。

MainActivity.java

我們宣告 NLClassifier 例項變數。尋找這則留言:

// TODO 5: Define a NLClassifier variable

然後新增下列項目:

private NLClassifier textClassifier;

使用從 Firebase 下載的情緒分析模型,初始化 textClassifier 變數。尋找這則留言:

// TODO 6: Initialize a TextClassifier with the downloaded model

然後新增下列項目:

textClassifier = NLClassifier.createFromFile(model.getFile());

分類文字

設定好 textClassifier 執行個體後,即可透過單一方法呼叫執行情緒分析。

MainActivity.java

尋找這則留言:

// TODO 7: Run sentiment analysis on the input text

然後新增下列項目:

List<Category> results = textClassifier.classify(text);

實作後續處理

最後,我們會將模型的輸出內容轉換為描述性文字,以顯示在螢幕上。

MainActivity.java

尋找這則留言:

// TODO 8: Convert the result to a human-readable text

移除產生虛擬結果文字的程式碼:

String textToShow = "Dummy classification result.\n";

然後新增下列項目:

String textToShow = "Input: " + text + "\nOutput:\n";
for (int i = 0; i < results.size(); i++) {
  Category result = results.get(i);
  textToShow += String.format("    %s: %s\n", result.getLabel(),
                              result.getScore());
}
textToShow += "---------\n";

12. 執行最終的應用程式

您已將情緒分析模型整合至應用程式,因此我們要進行測試。連結 Android 裝置,然後按一下 Android Studio 工具列中的「Run」圖示 執行.png

應用程式應能正確預測您輸入的電影評論情緒。

img/text-classification-result.png

13. 運用更多 Firebase 功能,提升應用程式成效

除了託管 TFLite 模型之外,Firebase 還提供多項其他功能,方便您用於機器學習用途:

  • Firebase 效能監控功能,可評估使用者的模型推論速度裝置。
  • Firebase 數據分析會評估使用者反應,藉此評估模型在正式環境中的成效。
  • Firebase A/B 測試,用於測試多個模型版本
  • 您是否曾記得我們先前訓練了兩個版本的 TFLite 模型?A/B 測試很適合用來瞭解哪個版本在實際工作環境中的表現較佳!

如要進一步瞭解如何在應用程式中運用這些功能,請參閱下方的程式碼研究室:

14. 恭喜!

在本程式碼研究室中,您學到瞭如何訓練情緒分析 TFLite 模型,並使用 Firebase 將模型部署到行動應用程式。如要進一步瞭解 TFLite 和 Firebase,請參閱其他 TFLite 範例和 Firebase 入門指南

涵蓋內容

  • TensorFlow Lite
  • Firebase ML

後續步驟

  • 透過 Firebase Performance Monitoring 評估模型推論速度。
  • 透過 Firebase ML Model Management API,將 Colab 中的模型直接部署至 Firebase。
  • 新增允許使用者對預測結果提供意見回饋的機制,並運用 Firebase 數據分析追蹤使用者的意見回饋。
  • 使用 Firebase A/B 測試,針對平均 Word Vector 模型和 MobileBERT 模型進行 A/B 版本測試。

瞭解詳情

有任何疑問嗎?

回報問題