使用 TensorFlow Lite Model Maker 訓練垃圾留言偵測模型

1. 事前準備

在本程式碼研究室中,您會審查使用 TensorFlow 和 TensorFlow Lite Model Maker 建立的程式碼,以根據垃圾留言建立資料集的模型。Kaggle 會提供原始資料。系統會將該資料收集到單一 CSV 檔案,並透過清除毀損文字、標記、重複字詞等方式清除。這樣可以更容易聚焦於模型,而非文字。

這裡提供的程式碼是這裡提供的,但我們強烈建議您在 Colaboratory 中檢查程式碼

必要條件

課程內容

  • 如何使用 Colab 安裝 TensorFlow Lite 模型製作工具。
  • 如何將資料從 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,而您會在每一行的第二個項目是 TrueFalse,,表示該文字是否為垃圾留言。其他屬性會設定您先前建立的 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 訓練週期。

機器學習的基本原則是,它是模式比對的一種形式。一開始,它會載入預先訓練的字的權重,並嘗試將字詞分組,並且預測哪些字詞在進行分組時,會標示出垃圾內容以及哪些不是。第一次,它可能只是平均分配,因為模型才剛開始。

c42755151d511ce.png

接著,它會測量這訓練的訓練結果,並執行最佳化程式碼來調整預測,然後再試一次。這是訓練週期。因此,通過指定 epochs=50,它將通過“一個”。 50 次。

7d0ee06a5246b58d.png

模型到達第 50 個訓練週期時,模型會回報更高的準確度。其中顯示 99%

驗證準確率數據通常比訓練準確率低很多,因為模型分類資料是模型先前未分類的資料。這項功能會使用你稍早設定的 10% 測試資料。

f063ff6e1d2add67.png

8. 匯出模型

  1. 執行這個儲存格來指定目錄並匯出模型:
model.export(export_dire='/mm_spam_savedmodel', export_format=[ExportFormat.LABEL, ExportFormat.VOCAB, ExportFormat.SAVED_MODEL])
  1. 壓縮 /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 以外,還有標籤和詞彙的結尾。在下一個程式碼研究室中,您將瞭解如何使用這個模型,以便將垃圾留言分類。

瞭解詳情