[PYTHON] Probieren Sie das Buch "Einführung in die Entwicklung natürlicher Anwendungen in 15 Schritten" aus - Kapitel 3 Schritt 09 Memo "Identifier by Neural Network"

Inhalt

Dies ist ein Memo für mich, während ich Einführung in Anwendungen zur Verarbeitung natürlicher Sprache in 15 Schritten lese. Dieses Mal werde ich in Kapitel 3, Schritt 09 meine eigenen Punkte aufschreiben.

Vorbereitung

Kapitelübersicht

Lassen Sie uns einen Klassifikator für mehrere Klassen mithilfe des im vorherigen Kapitel beschriebenen mehrschichtigen Perzeptrons implementieren.

--softmax: Aktivierungsfunktion zur Mehrklassenidentifikation ⇄ Sigmoid (zur 2-Klassenidentifikation) --categorical_crossentropy: Verlustfunktion für die Identifizierung mehrerer Klassen ⇄ binary_crossentropy (für die Identifizierung 2 Klassen)

09.1 Mehrschichtiges Perzeptron, das ein Mehrklassenklassifikator ist

Die Anzahl der Einheiten in der Ausgabeebene unterscheidet sich zwischen dem Zwei-Klassen-Klassifikator und dem Mehrklassen-Klassifikator, und die Lehrerbezeichnung wird unterschiedlich angegeben.

Aktivierungsfunktion zur Mehrklassenidentifikation

Softmax wird oft verwendet.

Durch Durchlaufen von Softmax wird der Wert mit der Größendifferenz zwischen 0 und 1 eingestellt und nähert sich dann 0 oder 1, so dass das Größenverhältnis größer wird.

Zwei-Klassen-Klassifikation und Mehrklassen-Klassifikation

Wenn es log2N-Einheiten gibt, ist eine N-Klassen-Klassifizierung theoretisch möglich, indem diese Ausgänge 0 oder 1 kombiniert werden, so dass eine Zwei-Klassen-Klassifizierung mit dem Ausgang 0 oder 1 einer Einheit durchgeführt werden kann. Die untere Einheit muss jedoch in mehr als einer Klasse dieselbe 0 oder 1 lernen, was intuitiv unnatürlich erscheint und das Lernen nicht gut verläuft.

Verlustfunktion bei der Identifizierung mehrerer Klassen

Im Gegensatz zu binary_crossentropy für die Identifizierung in zwei Klassen wird categoryical_crossentropy für die Identifizierung in mehreren Klassen verwendet.

Verwenden Sie die Liste der Klassen-IDs als Lehrerdaten

Bei der Klassifizierung in die N-Klasse müssen N Neuronen in der Ausgabeschicht vorbereitet werden. Zu diesem Zeitpunkt muss das Ausgabeetikett angegeben werden, damit N Neuronen anstelle der Klassen-ID selbst den Wert 0 oder 1 zugewiesen werden können.

--Konvertieren Sie mit keras.util.to_categorical in einen One-Hot-Ausdruck

09.2 Auf Dialogag Agent anwenden

Implementierungsbeispiel

Montagemuster Punkt
Basic #Aufbau
・ Stellen Sie die Anzahl der Eingangsabmessungen des Modells separat ein
・ Stellen Sie die Anzahl der Ausgangsabmessungen des Modells separat ein
・ Während des Lernens
・ Lehrer beschriften eins-Müssen in heiße Darstellung konvertieren
・ Zum Zeitpunkt der Identifizierung
· Eins-Erfordert die Konvertierung von der Hot-Darstellung in die Klassen-ID

#Lauf
・ Während des Lernens
・ Vectorizer passen_Transformation ausführen
・ Passen Sie die Ausführung des Klassifikators an
・ Zum Zeitpunkt der Identifizierung
 ・vectorizerのTransformation ausführen
・ Vorhersage des Klassifikators ausführen
Keras Scikit-mit Lern-API
sklearn.pipeline.Einbindung in die Pipeline
#Aufbau
・ Stellen Sie die Anzahl der Eingangsabmessungen des Modells separat ein
・ Stellen Sie die Anzahl der Ausgangsabmessungen des Modells separat ein

#Lauf
・ Während des Lernens
 ・ Passen Sie die Ausführung des Vektorisierers an
・ Pipeline-Fit-Ausführung
・ Zum Zeitpunkt der Identifizierung
・ Ausführung der Pipeline-Vorhersage

In keras.wrappers.scikit_learn.KerasClassifier führt fit () den Prozess aus, der to_categorical entspricht, und Predict () führt den Prozess aus, der np.argmax entspricht. Durch die Verwendung von Pipeline können fit () und Predict () von Vektorisierer und Klassifizierer zusammen ausgeführt werden. Beachten Sie jedoch, dass nur fit () von Vektorisierer separat erforderlich ist, um die Eingabedimension beim Festlegen des Modells anzugeben.

Ergänzungen / Änderungen gegenüber dem vorherigen Kapitel (Schritt 06)

  1. Aktivierungsfunktion der Ausgangsschicht: Sigmoid → Softmax
  2. Verlustfunktion: binary_crossentropy → categoryical_crossentropy
  3. Identifier: RandomForestClassifier → KerasClassifier
    def _build_mlp(self, input_dim, hidden_units, output_dim):
        mlp = Sequential()
        mlp.add(Dense(units=hidden_units,
                      input_dim=input_dim,
                      activation='relu'))
        mlp.add(Dense(units=output_dim, activation='softmax')) #1: Aktivierungsfunktion der Ausgabeschicht
        mlp.compile(loss='categorical_crossentropy', #2: Verlustfunktion
                    optimizer='adam')

        return mlp

    def train(self, texts, labels):
~~

        feature_dim = len(vectorizer.get_feature_names())
        n_labels = max(labels) + 1

        #3: Identifikator
        classifier = KerasClassifier(build_fn=self._build_mlp,
                                     input_dim=feature_dim,
                                     hidden_units=32,
                                     output_dim=n_labels)
~~

Ausführungsergebnis


# evaluate_dialogue_agent.Ändern Sie den Namen des py-Lademoduls nach Bedarf
from dialogue_agent_sklearn_pipeline import DialogueAgent

$ docker run -it -v $(pwd):/usr/src/app/ 15step:latest python evaluate_dialogue_agent.py
0.65957446

Normale Implementierung (Schritt 01): 37,2% Vorverarbeitung hinzugefügt (Schritt 02): 43,6% Änderung der Vorverarbeitung + Merkmalsextraktion (Schritt 04): 58,5% Vorverarbeitung + Änderung der Merkmalsextraktion + Änderung des Klassifikators (Schritt 06): 61,7% Vorverarbeitung + Änderung der Merkmalsextraktion + Änderung des Klassifikators (Schritt 09): 66,0%

Anwendungsprobleme

Hidden_units und classifier__epochs wurden zum Argument der Zugmethode der DialogueAgent-Klasse hinzugefügt.

dialogue_agent_sklearn_pipeline.py


    def train(self, texts, labels, hidden_units = 32, classifier__epochs = 100):
~~
        classifier = KerasClassifier(build_fn=self._build_mlp,
                                     input_dim=feature_dim,
                                     hidden_units=hidden_units,
                                     output_dim=n_labels)

~~
        pipeline.fit(texts, labels, classifier__epochs=classifier__epochs)
~~

Geben Sie beim Aufrufen der Zugmethode der DialogueAgent-Klasse hidden_units und classifier__epochs an.

evaluate_dialogue_agent.py


    HIDDEN_UNITS = 64
    CLASSIFIER_EPOCHS = 50

    # Training
    training_data = pd.read_csv(join(BASE_DIR, './training_data.csv'))

    dialogue_agent = DialogueAgent()
    dialogue_agent.train(training_data['text'], training_data['label'], HIDDEN_UNITS, CLASSIFIER_EPOCHS)

Ausführungsergebnis


Epoch 50/50
917/917 [==============================] - 0s 288us/step - loss: 0.0229

###Ich habe mir auch verschiedene Dinge angesehen###
# pprint.pprint(dialogue_agent.pipeline.steps)
[('vectorizer',
  TfidfVectorizer(analyzer='word', binary=False, decode_error='strict',
        dtype=<class 'numpy.int64'>, encoding='utf-8', input='content',
        lowercase=True, max_df=1.0, max_features=None, min_df=1,
        ngram_range=(1, 2), norm='l2', preprocessor=None, smooth_idf=True,
        stop_words=None, strip_accents=None, sublinear_tf=False,
        token_pattern='(?u)\\b\\w\\w+\\b',
        tokenizer=<bound method DialogueAgent._tokenize of <dialogue_agent_sklearn_pipeline.DialogueAgent object at 0x7f7fc81bd128>>,
        use_idf=True, vocabulary=None)),
 ('classifier',
  <keras.wrappers.scikit_learn.KerasClassifier object at 0x7f7fa4a6a320>)]

# pprint.pprint(dialogue_agent.pipeline.steps[1][1].get_params())
{'build_fn': <bound method DialogueAgent._build_mlp of <dialogue_agent_sklearn_pipeline.DialogueAgent object at 0x7f7fc81bd128>>,
 'hidden_units': 64,
 'input_dim': 3219,
 'output_dim': 49}

# print([len(v) for v in dialogue_agent.pipeline.steps[1][1].model.layers[0].get_weights()])
[3219, 64]

# print([len(v) for v in dialogue_agent.pipeline.steps[1][1].model.layers[1].get_weights()])
[64, 49]

Es kann bestätigt werden, dass die Dimension der Eingabeebene 3219, die Dimension der verborgenen Ebene 64 und die Dimension der Ausgabeebene 49 beträgt. Es wurde bestätigt, dass es aus dem Format der Gewichtsliste der 0. Schicht und der 1. Schicht korrekt war. (Mit fortschreitendem Lernen wird diese Liste der Gewichte immer mehr aktualisiert.)

Recommended Posts

Probieren Sie das Buch "Einführung in die Entwicklung natürlicher Anwendungen in 15 Schritten" aus - Kapitel 3 Schritt 09 Memo "Identifier by Neural Network"
Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" aus - Kapitel 2 Schritt 06 Memo "Identifier"
Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" - Kapitel 3 Schritt 08 Memo "Einführung in neuronale Netze".
Probieren Sie das Buch "Einführung in die Entwicklung natürlicher Anwendungen in 15 Schritten" - Kapitel 3 Schritt 12 Memo "Convolutional Neural Networks".
Probieren Sie das Buch "Einführung in die Entwicklung natürlicher Anwendungen in 15 Schritten" aus - Kapitel 3 Schritt 13 Memo "Wiederkehrende neuronale Netze"
Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" aus - Kapitel 2 Schritt 02 Memo "Vorverarbeitung"
Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" aus - Kapitel 2 Schritt 07 Memo "Evaluation"
Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" - Kapitel 4 Schritt 14 Memo "Hyperparametersuche"
Probieren Sie das Buch "Einführung in die Entwicklung natürlicher Anwendungen in 15 Schritten" aus - Kapitel 2 Schritt 04 Memo "Feature Extraction"
Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" aus - Kapitel 4 Schritt 15 Memo "Datenerfassung"
Probieren Sie das Buch "Einführung in die Entwicklung natürlicher Anwendungen in 15 Schritten" aus - Kapitel 2 Schritt 05 Memo "Feature Quantity Conversion"
Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" aus - Kapitel 3 Schritt 11 Memo "Worteinbettungen"
Versuchen wir das Buch "Einführung in die Entwicklung natürlicher Anwendungen in 15 Schritten" - Kapitel 3 Schritt 10 Memo "Details und Verbesserung des neuronalen Netzes"
Probieren Sie das Buch "Einführung in die Entwicklung natürlicher Anwendungen in 15 Schritten" aus - Kapitel 2 Schritt 01 Memo "Erstellen eines Dialogagenten"
Versuchen Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" - Kapitel 2 Schritt 03 Memo "Morphologische Analyse und schriftliches Schreiben"
Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" - Kapitel 1 Memo "Vorkenntnisse vor Beginn der Übungen".
Modell unter Verwendung eines Faltungsnetzwerks in der Verarbeitung natürlicher Sprache
[Python] Versuchen Sie, Ramen-Shops durch Verarbeitung natürlicher Sprache zu klassifizieren
[Jobwechsel-Meeting] Versuchen Sie, Unternehmen zu klassifizieren, indem Sie Mundpropaganda in natürlicher Sprache mit word2vec verarbeiten
[Sprachverarbeitung 100 Schläge 2020] Kapitel 8: Neuronales Netz
[WIP] Vorverarbeiten von Notizen in der Verarbeitung natürlicher Sprache
Zusammenfassung von Anfang bis Kapitel 1 der Einführung in Entwurfsmuster, die in der Java-Sprache gelernt wurden
[Verarbeitung natürlicher Sprache / NLP] Einfache Rückübersetzung durch maschinelle Übersetzung mit Python
[Kapitel 5] Einführung in Python mit 100 Klopfen Sprachverarbeitung
[Kapitel 6] Einführung in Scicit-Learn mit 100 Klopfen Sprachverarbeitung
[Kapitel 3] Einführung in Python mit 100 Klopfen Sprachverarbeitung
[Kapitel 2] Einführung in Python mit 100 Klopfen Sprachverarbeitung
[Kapitel 4] Einführung in Python mit 100 Klopfen Sprachverarbeitung
[Verarbeitung natürlicher Sprache] Ich habe diese Woche versucht, die aktuellen Themen in der Slack-Community zu visualisieren
[Verarbeitung natürlicher Sprache] Ich habe versucht, die Bemerkungen jedes Mitglieds in der Slack-Community zu visualisieren
Verarbeitung natürlicher Sprache (Originaldaten) mit Word2Vec, entwickelt von US-amerikanischen Google-Forschern
[Deep Learning von Grund auf neu] Informationen zu den Ebenen, die für die Implementierung der Backpropagation-Verarbeitung in einem neuronalen Netzwerk erforderlich sind