1. 事前準備
在本程式碼研究室中,您會審查使用 TensorFlow 和 TensorFlow Lite Model Maker 建立的程式碼,以根據垃圾留言建立資料集的模型。Kaggle 會提供原始資料。系統會將該資料收集到單一 CSV 檔案,並透過清除毀損文字、標記、重複字詞等方式清除。這樣可以更容易聚焦於模型,而非文字。
這裡提供的程式碼是這裡提供的,但我們強烈建議您在 Colaboratory 中檢查程式碼。
必要條件
- 本程式碼研究室是專為經驗豐富的機器學習開發人員而撰寫,
- 本程式碼研究室是「Flutter 應用程式途徑中使用文字分類」的一環。如果您還沒完成之前的活動,請立即停止。
課程內容
- 如何使用 Colab 安裝 TensorFlow Lite 模型製作工具。
- 如何將資料從 Colab 伺服器下載到您的裝置。
- 如何使用資料載入器。
- 如何建構模型。
軟硬體需求
- 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. 下載資料
接下來,請將資料從 Colab 伺服器下載到您的裝置,並將 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)
模型製作工具可以透過簡單的 CSV 檔案訓練模型。您只需要指定哪些資料欄含有這些文字,以及哪些資料欄含有標籤,之後您將在此程式碼研究室中示範如何執行這些動作。
5. 內嵌式嵌入
一般來說,使用「模型製作工具」時,您無法從頭開始建立模型。您可使用根據需求自訂的現有模型。
和這種模型一樣,模型會使用預先學習的嵌入功能。嵌入背後的想法是將文字轉換為數值,每個字組中每個字都有一個數字。嵌入是一種用來判斷該字詞情緒的向量,可為字詞建立「方向」。例如,在垃圾評論訊息中經常使用的字詞,它的向量指向的方向是差不多的,而另一個點則不是向量的相反方向。
使用預先學習的嵌入功能時,您可以從語料庫 (或稱集合) 開始,已經從大量的內文中學習到字詞,因此更快上手。
「建築模型製作工具」提供多項預先學習過的嵌入功能,但最簡單且最快速的嵌入方式是 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
參數是您要為各個字詞建立向量所用的維度數量。根據研究的經驗法則,它是字詞數的第四根。例如,如果您使用 2,000 字,7 是一個好的起點。如果您變更了使用的字詞數目,也可以變更這項設定。
seq_len
參數
就輸入值而言,模型通常非常嚴謹。對語言模型而言,這代表語言模型可以分類特定靜態長度的句子。由 seq_len
參數或序列長度決定。
當您將字詞轉換為數字或符記時,語句就會成為這些符記的序列。在此模型中,您的模型已經過訓練,以 20 個符記分類及識別語句。如果句子過長,就會遭到截斷。如果名稱較短,就會補上。您可以在用於此內容的語料庫中查看專屬的 <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
。
您需要保留部分資料以測試模型。分割資料,其中 90% 用於訓練,另外 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 建立文字分類程式模型,並指定您要在第四個步驟中設定的訓練資料、第四步驟中設定的模型規格,以及幾個訓練週期,在本例中為 50 訓練週期。
機器學習的基本原則是,它是模式比對的一種形式。一開始,它會載入預先訓練的字的權重,並嘗試將字詞分組,並且預測哪些字詞在進行分組時,會標示出垃圾內容以及哪些不是。第一次,它可能只是平均分配,因為模型才剛開始。
接著,它會測量這訓練的訓練結果,並執行最佳化程式碼來調整預測,然後再試一次。這是訓練週期。因此,通過指定 epochs=50,它將通過“一個”。 50 次。
模型到達第 50 個訓練週期時,模型會回報更高的準確度。其中顯示 99%
!
驗證準確率數據通常比訓練準確率低很多,因為模型分類資料是模型先前未分類的資料。這項功能會使用你稍早設定的 10% 測試資料。
8. 匯出模型
- 執行這個儲存格來指定目錄並匯出模型:
model.export(export_dire='/mm_spam_savedmodel', export_format=[ExportFormat.LABEL, ExportFormat.VOCAB, ExportFormat.SAVED_MODEL])
- 壓縮
/mm_spam_savedmodel
的完整資料夾,並產生系統產生的mm_spam_savedmodel.zip
檔案 (下一個程式碼研究室需要用到該檔案)。
# Rename the SavedModel subfolder to a version number
!mv /mm_spam_savedmodel/saved_model /mm_spam_savedmodel/123
!zip -r mm_spam_savedmodel.zip /mm_spam_savedmodel/
9. 恭喜
此程式碼研究室引導您使用 Python 程式碼建構及匯出模型。現在您除了 SavedModel 以外,還有標籤和詞彙的結尾。在下一個程式碼研究室中,您將瞭解如何使用這個模型,以便將垃圾留言分類。