Modell zur Erkennung von Kommentar-Spam mit TensorFlow Lite Model Maker trainieren

1. Hinweis

In diesem Codelab sehen Sie sich Code an, der mit TensorFlow und TensorFlow Lite Model Maker erstellt wurde, um ein Modell mit einem Dataset zu erstellen, das auf Kommentar-Spam basiert. Die Originaldaten sind auf Kaggle verfügbar. Die Daten wurden in einer einzigen CSV-Datei zusammengefasst und bereinigt, indem unter anderem fehlerhafter Text, Markup und wiederholte Wörter entfernt wurden. So können Sie sich leichter auf das Modell anstatt auf den Text konzentrieren.

Der Code, den Sie sich ansehen, wird hier bereitgestellt. Es wird jedoch dringend empfohlen, den Code in Colaboratory zu verwenden.

Vorbereitung

Lerninhalte

  • So installieren Sie TensorFlow Lite Model Maker mit Colab.
  • So laden Sie die Daten vom Colab-Server auf Ihr Gerät herunter.
  • Verwendung eines Datenladeprogramms
  • So erstellen Sie das Modell.

Voraussetzungen

2. TensorFlow Lite Model Maker installieren

  • Colab öffnen In der ersten Zelle des Notebooks wird TensorFlow Lite Model Maker für Sie installiert:
!pip install -q tflite-model-maker

Wenn der Vorgang abgeschlossen ist, fahren Sie mit der nächsten Zelle fort.

3. Code importieren

Die nächste Zelle enthält eine Reihe von Importen, die für den Code im Notebook erforderlich sind:

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')

Dabei wird auch geprüft, ob Sie TensorFlow 2.x ausführen, was eine Voraussetzung für die Verwendung von Model Maker ist.

4. Daten herunterladen

Als Nächstes laden Sie die Daten vom Colab-Server auf Ihr Gerät herunter und legen die Variable data_file so fest, dass sie auf die lokale Datei verweist:

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)

Mit Model Maker können Modelle anhand einfacher CSV-Dateien wie dieser trainiert werden. Sie müssen nur angeben, in welchen Spalten sich der Text und in welchen die Labels befinden. Wie das geht, erfahren Sie später in diesem Codelab.

5. Vortrainierte Einbettungen

Normalerweise erstellen Sie mit Model Maker keine Modelle von Grund auf neu. Sie verwenden vorhandene Modelle, die Sie an Ihre Anforderungen anpassen.

Bei Sprachmodellen wie diesem werden vortrainierte Einbettungen verwendet. Die Idee hinter einem Embedding ist, dass Wörter in Zahlen umgewandelt werden, wobei jedem Wort in Ihrem gesamten Korpus eine Zahl zugewiesen wird. Eine Einbettung ist ein Vektor, der verwendet wird, um die Stimmung eines Wortes zu ermitteln, indem eine „Richtung“ für das Wort festgelegt wird. So weisen beispielsweise Wörter, die häufig in Kommentar-Spam-Nachrichten verwendet werden, Vektoren auf, die in eine ähnliche Richtung zeigen, während Vektoren von Wörtern, die nicht in Kommentar-Spam-Nachrichten verwendet werden, in die entgegengesetzte Richtung zeigen.

Wenn Sie vortrainierte Einbettungen verwenden, beginnen Sie mit einem Korpus oder einer Sammlung von Wörtern, deren Sentiment bereits anhand einer großen Menge an Text gelernt wurde. So gelangen Sie viel schneller zu einer Lösung, als wenn Sie von null anfangen.

Model Maker bietet mehrere vorab gelernte Einbettungen, die Sie verwenden können. Die einfachste und schnellste Option für den Anfang ist average_word_vec.

Hier ist der Code dafür:

spec = model_spec.get('average_word_vec')
spec.num_words = 2000
spec.seq_len = 20
spec.wordvec_dim = 7

Der Parameter num_words

Sie geben auch die Anzahl der Wörter an, die Ihr Modell verwenden soll.

Sie denken vielleicht, dass es besser ist, möglichst viele Keywords zu verwenden. In der Regel gibt es jedoch eine optimale Anzahl, die von der Häufigkeit abhängt, mit der die einzelnen Wörter verwendet werden. Wenn Sie jedes Wort im gesamten Korpus verwenden, könnte das Modell versuchen, die Richtung von Wörtern zu lernen und festzulegen, die nur einmal verwendet werden. In jedem Textkorpus werden viele Wörter nur ein- oder zweimal verwendet. Es lohnt sich daher nicht, sie in Ihr Modell aufzunehmen, da sie nur einen geringen Einfluss auf die Gesamtstimmung haben.

Mit dem Parameter num_words können Sie Ihr Modell anhand der gewünschten Anzahl von Wörtern optimieren. Eine kleinere Zahl kann zu einem kleineren und schnelleren Modell führen, das jedoch weniger genau ist, da es weniger Wörter erkennt. Eine größere Zahl kann hingegen zu einem größeren und langsameren Modell führen. Es ist wichtig, die richtige Balance zu finden.

Der Parameter wordvec_dim

Der Parameter wordved_dim ist die Anzahl der Dimensionen, die Sie für den Vektor für jedes Wort verwenden möchten. Die Faustregel, die aus der Forschung abgeleitet wurde, besagt, dass es sich um die vierte Wurzel der Anzahl der Wörter handelt. Wenn Sie beispielsweise 2.000 Wörter verwenden, ist 7 ein guter Ausgangspunkt. Wenn Sie die Anzahl der Wörter ändern, können Sie auch diese Zahl ändern.

Der Parameter seq_len

Modelle sind in Bezug auf Eingabewerte in der Regel sehr starr. Für ein Sprachmodell bedeutet das, dass es Sätze einer bestimmten statischen Länge klassifizieren kann. Das wird durch den Parameter seq_len oder die Sequenzlänge bestimmt.

Wenn Sie Wörter in Zahlen oder Tokens umwandeln, wird ein Satz zu einer Folge dieser Tokens. In diesem Fall wird Ihr Modell so trainiert, dass es Sätze mit 20 Tokens klassifizieren und erkennen kann. Wenn der Satz länger ist, wird er abgeschnitten. Wenn sie kürzer ist, wird sie aufgefüllt. Im Corpus, der dafür verwendet wird, ist ein spezielles <PAD>-Token zu sehen.

6. Daten-Loader verwenden

Sie haben die CSV-Datei bereits heruntergeladen. Jetzt ist es an der Zeit, einen Daten-Loader zu verwenden, um daraus Trainingsdaten zu machen, die das Modell erkennen kann:

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)

Wenn Sie die CSV-Datei in einem Editor öffnen, sehen Sie, dass jede Zeile nur zwei Werte enthält, die in der ersten Zeile der Datei beschrieben werden. In der Regel wird jeder Eintrag dann als Spalte betrachtet.

Der Deskriptor für die erste Spalte ist commenttext und der erste Eintrag in jeder Zeile ist der Text des Kommentars. Der Deskriptor für die zweite Spalte ist spam. Der zweite Eintrag in jeder Zeile ist True oder False,, um anzugeben, ob der Text als Kommentar-Spam eingestuft wird oder nicht. Mit den anderen Attributen wird die Variable model_spec festgelegt, die Sie zuvor erstellt haben, sowie ein Trennzeichen, in diesem Fall ein Komma, da die Datei kommagetrennt ist. Sie verwenden diese Daten zum Trainieren des Modells. Daher wird is_Training auf True festgelegt.

Sie sollten einen Teil der Daten zurückhalten, um das Modell zu testen. Teilen Sie die Daten auf: 90% für das Training und 10% für Tests/die Bewertung. Da wir das tun, möchten wir sicherstellen, dass die Testdaten zufällig ausgewählt werden und nicht die unteren 10% des Datasets darstellen. Verwenden Sie daher shuffle=True beim Laden der Daten, um sie zu randomisieren.

7. Modell erstellen

In der nächsten Zelle wird das Modell erstellt. Das ist nur eine einzige Codezeile:

# Build the model
model = text_classifier.create(train_data, model_spec=spec, epochs=50, 
                               validation_data=test_data)

Mit diesem Code wird mit Model Maker ein Textklassifizierungsmodell erstellt. Sie geben die Trainingsdaten an, die Sie verwenden möchten (wie im vierten Schritt eingerichtet), die Modellspezifikation (wie im vierten Schritt eingerichtet) und eine Anzahl von Epochen, die in diesem Fall 50 beträgt.

Das Grundprinzip von ML ist, dass es sich um eine Form des Musterabgleichs handelt. Zuerst werden die vortrainierten Gewichte für die Wörter geladen und es wird versucht, sie zu gruppieren. Dabei wird vorhergesagt, welche Wörter in einer Gruppe Spam und welche nicht anzeigen. Beim ersten Mal ist die Wahrscheinlichkeit wahrscheinlich gleichmäßig verteilt, da das Modell noch am Anfang steht.

c42755151d511ce.png

Anschließend werden die Ergebnisse dieser Trainingsphase gemessen und Optimierungscode ausgeführt, um die Vorhersage zu optimieren. Dann wird es noch einmal versucht. Das ist eine Epoche. Wenn Sie also „epochs=50“ angeben, wird dieser „Loop“ 50 Mal durchlaufen.

7d0ee06a5246b58d.png

Nach 50 Epochen weist das Modell eine viel höhere Genauigkeit auf. In diesem Fall wird 99% angezeigt.

Die Validierungsgenauigkeit ist in der Regel etwas niedriger als die Trainingsgenauigkeit, da sie angibt, wie das Modell Daten klassifiziert, die es noch nicht gesehen hat. Dazu werden die 10% der Testdaten verwendet, die Sie zuvor zurückgestellt haben.

f063ff6e1d2add67.png

8. Modell exportieren

  1. Führen Sie diese Zelle aus, um ein Verzeichnis anzugeben und das Modell zu exportieren:
model.export(export_dire='/mm_spam_savedmodel', export_format=[ExportFormat.LABEL, ExportFormat.VOCAB, ExportFormat.SAVED_MODEL])
  1. Komprimieren Sie den gesamten Ordner /mm_spam_savedmodel und die generierte Datei mm_spam_savedmodel.zip, die Sie im nächsten Codelab benötigen.
# 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. Glückwunsch

In diesem Codelab haben Sie Python-Code zum Erstellen und Exportieren Ihres Modells kennengelernt. Jetzt haben Sie ein SavedModel mit den Labels und dem Vokabular am Ende. Im nächsten Codelab erfahren Sie, wie Sie dieses Modell verwenden, um Spamkommentare zu klassifizieren.

Weitere Informationen