透過 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 中開啟起始專案。

4. 執行範例應用程式

將專案匯入 Android Studio 後,即可首次執行應用程式。連線至 Android 裝置,然後按一下 Android Studio 工具列中的「Run」 ( execute.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 檔案新增至應用程式

加入套件名稱並選取「註冊」後,按一下「下載 google-services.json」**取得 Firebase Android 設定檔,然後將 google-services.json 檔案複製到專案的 *app* 目錄中。

在應用程式中新增 google-services 外掛程式

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

google-services 外掛程式會使用 google-services.json 檔案,將應用程式設為使用 Firebase。

將專案與 Gradle 檔案同步

為確保應用程式可使用所有依附元件,您應在此時將專案與 Gradle 檔案同步處理。在 Android Studio 工具列中,依序選取「File」>「Sync Project with Gradle Files」

7. 使用 Firebase 執行應用程式

使用 JSON 檔案設定 google-services 外掛程式後,即可執行 Firebase 應用程式。連線至 Android 裝置,然後按一下 Android Studio 工具列中的「Run」 ( execute.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 下載模型

由於 TFLite 模型可能會變得相當大,因此選擇何時從 Firebase 將遠端模型下載到應用程式中,可能是一項棘手的任務。理想情況下,我們希望避免在應用程式啟動時立即載入模型,因為如果模型只用於一項功能,而使用者從未使用該功能,我們就會無故下載大量資料。我們也可以設定下載選項,例如只在連上 Wi-Fi 時擷取模型。如要確保即使沒有網路連線也能使用模型,請務必將模型與應用程式分開打包,做為備份。

為求簡化,我們會移除預設的隨附模型,並在應用程式首次啟動時,一律從 Firebase 下載模型。這樣一來,執行情緒分析時,您就能確保推論作業是使用 Firebase 提供的模型。

app/build.gradle.kts 檔案中,新增 Firebase ML 依附元件。

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 要求同步處理專案時,請選擇「立即同步」

接著,我們來新增一些程式碼,從 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 Task Library (Text)。

app/build.gradle

找出這則註解:

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

然後新增:

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

Android Studio 要求同步處理專案時,請選擇「立即同步」

初始化文字分類器

接著,我們會使用 Task Library 的 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」 ( execute.png)。

應用程式應能正確預測你輸入的電影評論所表達的情緒。

img/text-classification-result.png

13. 運用更多 Firebase 功能強化應用程式

除了代管 TFLite 模型,Firebase 還提供多項功能,可強化機器學習用途:

  • Firebase Performance Monitoring,用於評估在使用者裝置上執行的模型推論速度。
  • Firebase Analytics 可評估使用者反應,藉此衡量模型在正式環境中的成效。
  • Firebase A/B 測試,可測試多個版本的模型
  • 還記得我們稍早訓練了兩個版本的 TFLite 模型嗎?A/B 測試是找出實際工作環境中成效較佳版本的好方法!

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

14. 恭喜!

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

涵蓋內容

  • TensorFlow Lite
  • Firebase ML

後續步驟

  • 使用 Firebase Performance Monitoring 評估模型推論速度。
  • 透過 Firebase ML 模型管理 API,直接從 Colab 將模型部署至 Firebase。
  • 新增機制,讓使用者針對預測結果提供意見回饋,並使用 Firebase Analytics 追蹤使用者意見回饋。
  • 使用 Firebase A/B 測試,對 Average Word Vector 模型和 MobileBERT 模型進行 A/B 測試。

瞭解詳情

有任何疑問嗎?

回報問題