1. 事前準備
在本程式碼研究室中,您將審查使用 TensorFlow 和 TensorFlow Lite Model Maker 建立的程式碼,使用含有垃圾留言的資料集建立模型。原始資料可透過 kaggle 取得。系統已將該註解收集成單一 CSV 檔案,並移除損壞的文字、標記、重複字詞等項目來清理。這樣會比較容易聚焦於模型,而非文字。
這裡會列出您要查看的程式碼,但我們強烈建議您一併遵循 Google Colab 中的程式碼。
必要條件
- 本程式碼研究室的適用對象為剛接觸機器學習的資深開發人員,
- 這個程式碼研究室是「開始使用行動裝置文字分類」課程的一部分。如果您尚未完成之前的活動,請立即停止報名。
課程內容
- 如何使用 Google Colab 安裝 TensorFlow Lite Model Maker
- 如何將雲端伺服器中的資料下載到裝置
- 如何使用資料載入器
- 如何建構模型
軟硬體需求
- 存取 Google Colab
2. 安裝 TensorFlow Lite Model Maker
開啟 Colab。筆記本中的第一個儲存格會為你安裝 TensorFLow Lite Model Maker:
!pip install -q tflite-model-maker
完成後,再前往下一個儲存格。
3. 匯入程式碼
下一個儲存格中有多項匯入項目,筆記本中的程式碼需要使用:
import numpy as np
import os
from tflite_model_maker import configs
from tflite_model_maker import ExportFormat
from tflite_model_maker import model_spec
from tflite_model_maker import text_classifier
from tflite_model_maker.text_classifier import DataLoader
import tensorflow as tf
assert tf.__version__.startswith('2')
tf.get_logger().setLevel('ERROR')
系統也會檢查您是否執行的是 TensorFlow 2.x,這是使用 Model Maker 的必要條件。
4. 下載資料
接著,請將 Cloud 伺服器中的資料下載至裝置,並將 data_file
設為指向本機檔案:
data_file = tf.keras.utils.get_file(fname='comment-spam.csv',
origin='https://storage.googleapis.com/laurencemoroney-blog.appspot.com/lmblog_comments.csv',
extract=False)
Model Maker 可以運用這類簡單的 CSV 檔案訓練模型。您只需指定包含文字的欄,並指定要保留標籤的資料欄。我們稍後會在程式碼研究室中說明如何執行這項操作。
5. 預先學習的嵌入
一般來說,使用 Model Maker 時,您無法從零開始建構模型,您可以使用可依需求自訂的現有模型,
像這樣的語言模型需要採用預先學習的嵌入。嵌入背後的概念就是將字詞轉換為數字,整體語料庫中的每個字詞都有一個數字。嵌入是一種向量,可以建立「方向」來判定字詞情緒。舉例來說,垃圾留言訊息中經常出現的字詞,會將向量指向類似的方向,反之亦然。
透過使用預先學習的嵌入,您必須先從大型語料庫中開始訓練出某些字詞的語料庫或集合,如此一來,您將能更快取得解決方案,而不必從零開始。
模型製作工具提供多種預先學習的嵌入,但最簡單的入門方式是 average_word_vec
。
程式碼如下:
spec = model_spec.get('average_word_vec')
spec.num_words = 2000
spec.seq_len = 20
spec.wordvec_dim = 7
num_words 參數
也可以指定您希望模型使用的字詞數量。
你可能想「越多越好」但通常根據每個字詞的使用頻率,制定最適當的數字如果使用整個語料庫中的每個字詞,模型可能會試圖學習,以及只使用一次的字詞方向。許多文字語料庫中只會出現一或兩次的字詞,在模型中使用這些字詞對整體情緒的影響微乎其微,因此通常不值得。您可以使用 num_words
參數,針對指定的字詞數量調整模型。
這個數字越小,模型越短越好,但因為辨識出較少的字詞,精確度可能會降低。這裡的數字越大,模型越大、速度越慢。找出最佳平衡點是關鍵!
wordvec_dim 參數
wordved_dim
參數是指您要為每個字詞向量使用的維度數量。根據研究判斷,原則是字詞數量的第四根。假設您輸入 2000 個字,一開始可以採用 7 個字。如果您變更了使用的字數,也可以進行變更。
seq_len 參數
關於輸入值,模型通常都相當嚴謹。對語言模型而言,這表示語言模型可分類特定、靜態長度的語句。此決定取決於 seq_len
參數或 sequence 長度。
當您將字詞轉換為數字 (或符記) 時,一個句子會成為這些符記的序列。因此,您的模型經過訓練 (在本範例中),分類及辨識含有 20 個符記的句子。如果句子長超過此長度,將遭到截斷。如果片長短於 15 分鐘,系統會將其填補。您會在語料庫中看到用於此的 <PAD>
專用權杖。
6. 使用資料載入器
您先前下載了 CSV 檔案。接著請使用資料載入器,將上述值轉換為模型可辨識的訓練資料:
data = DataLoader.from_csv(
filename=data_file,
text_column='commenttext',
label_column='spam',
model_spec=spec,
delimiter=',',
shuffle=True,
is_training=True)
train_data, test_data = data.split(0.9)
在編輯器中開啟 CSV 檔案時,您會發現每一行都有兩個值,而這些項目的第一行將以文字描述。一般而言,每個項目都會視為資料欄。
您會看到第一欄的描述元是 commenttext
,而每一行的第一個項目就是註解的文字。同樣地,第二欄的描述元是 spam
,您會看到每一行的第二個項目是 True
或 False,
,表示該文字是否被視為垃圾評論。其他屬性會設定您先前建立的 model_spec
,以及分隔符號字元,在本範例中為以半形逗號分隔檔案。您將使用此資料訓練模型,因此 is_Training
設定為 True
。
建議您保留一部分資料來測試模型。分割資料,其餘 10% 用於訓練,另外 10% 則用於測試/評估。因為我們需要確保測試資料是隨機選擇,而不是「底部」10% 的資料集,因此在載入資料時使用 shuffle=True
。
7. 建構模型
下一個儲存格只是建構模型,只需要一行程式碼:
# Build the model
model = text_classifier.create(train_data, model_spec=spec, epochs=50,
validation_data=test_data)
這項操作會使用 Model Maker 建立文字分類器模型,並指定要使用的訓練資料 (如步驟 4 所設定)、模型規格 (如步驟 4 中的設定),以及多個訓練週期 (本例為 50)。
機器學習的基本原則是模式比對的形式。一開始,它會載入字詞的預先訓練權重,然後嘗試將這些字詞與預測結果分組,以表示垃圾字詞,哪些則沒有。第一次使用這種模型時,可能將近 50:50 模型,因為這個模型才剛開始。
接著,工具會評估這項結果,並執行最佳化程式碼來調整預測結果,然後再試一次。這是一個週期只要指定 epochs=50,就會進入「迴圈」50 次。
當達到第 50 個週期時,模型的準確度就會大幅提升。在本例中是 99%!
右側會顯示驗證準確度數據。這類偏誤通常會比訓練準確率略低,因為表示模型如何對先前從未「看過」的資料進行分類。並使用我們稍早設定的 10% 測試資料。
8. 匯出模型
訓練完成後,即可匯出模型。
TensorFlow 會以自己的格式訓練模型,因此必須轉換成 TFLITE 格式,才能在行動應用程式中使用。模型製作工具可為您處理這種複雜性。
只要匯出模型並指定目錄即可:
model.export(export_dir='/mm_spam')
您會在該目錄中看到 model.tflite
檔案。那就趕快下載,在下一個程式碼研究室中,您會需要用到這項資訊,因此請將其新增至 Android 應用程式!
iOS 注意事項
您剛剛匯出的 .tflite 模型適用於 Android,因為模型中繼資料嵌入於其中,而 Android Studio 可以讀取該中繼資料。
這項中繼資料相當重要,因為其中包含代表字詞的符記字典,方便模型辨識。之前還記得,您知道字詞會成為符記時,這些符記可以獲得情緒分析嗎?您的行動應用程式將需要知道這些權杖。舉例來說,如果您搜尋的是「狗」符記化為 42,使用者輸入「dog」就必須將「dog」轉換為句子以便模型理解內容Android 開發人員擁有「TensorFlow Lite 工作程式庫」雖然更容易上手,但在 iOS 裝置上則需要處理詞彙,所以你必須支援詞彙。但可以指定 export_format
參數,由模型製作工具匯出此內容。因此,如要取得模型的標籤和詞彙,您可以使用下列程式碼:
model.export(export_dir='/mm_spam/',
export_format=[ExportFormat.LABEL, ExportFormat.VOCAB])
9. 恭喜
本程式碼研究室將逐步引導您完成 Python 程式碼,以建構並匯出模型。結尾會顯示 .tflite 檔案。
在下一個程式碼研究室中,您將瞭解如何編輯 Android 應用程式以使用此模型,以便開始分類垃圾留言。