[PYTHON] [TensorFlow] Ich hatte das Gefühl, dass ich mit Seq2Seq Nachrichten im Stil eines "posthumen Urteils" in Massenproduktion produzieren konnte.

Einführung

In einem früheren Artikel habe ich mit der Erstellung von "Christuszeichen" -ähnlichem Text unter Verwendung von zeichenbasiertem LSTM experimentiert. [\ TensorFlow ] Ich habe versucht, Nachrichten im "Post-Mortem-Urteil" -Stil mit LSTM - Qiita in Massenproduktion zu produzieren

Da verschiedene Probleme aufgetreten sind, möchte ich ein Modell ausprobieren, das den gesamten Satz als Eingabe verwendet. Am Ende wäre es schön, ein GAN-basiertes Generierungsmodell (wie SeqGAN [^ 1]) auszuprobieren, aber plötzlich scheint es frustrierend zu sein. Probieren Sie also zuerst das Seq2Seq-Modell aus und üben Sie gleichzeitig die Idee der Eingabe und Ausgabe in Satzeinheiten. Ich werde versuchen.

Überprüfungsumgebung

Dieses Mal ist das Lernen ohne eine GPU schwierig, daher werde ich es mit Google Colaboratory ausführen, das kostenlos verwendet werden kann.

Strategie

Verwenden wir das in der maschinellen Übersetzung verwendete Seq2Seq-Modell. Die Grundlagen basieren auf diesem Tutorial. Keras: Ex-Tutorials: Seq2Seq-Einführung in das Lernen - PyTorch Da es sich bei der Eingabe diesmal um ein Wort handelt, ändern Sie den Code unter "Wenn Sie ein Modell auf Wortebene mit einer Ganzzahlfolge verwenden möchten".

Beim Generieren von Sätzen mit Seq2Seq tritt ein Problem bei der Eingabe auf. Beachten Sie jedoch die in einem anderen Artikel beschriebene Methode.

--Geben Sie den ersten Satz ein und erhalten Sie die Ausgabe

Ich werde es auf diese Weise verwenden. Satzgenerierung mit Seq2Seq (Wikipedia-Daten werden für das Training verwendet) --Qiita

Die Erklärung des Encoder-Decoder-Modells einschließlich des Seq2Seq-Modells war leicht zu verstehen, deshalb habe ich alles herumgeworfen. Encoder-Decoder - Qiita mit PyTorch

Gemäß diesem Artikel wird jedes Wort in den Eingabedaten zuerst von der Einbettungsschicht in einen Vektor konvertiert und dann unter Verwendung dieser Folge von Vektordarstellungen trainiert. Ursprünglich sollte die Vektordarstellung jedes Wortes auch aus den Daten gelernt werden. Da jedoch nicht viele Daten vorhanden sind, werden wir das trainierte Word2Vec-Modell ersetzen.

Dieses Mal habe ich dieses Word2Vec-Modell verwendet. [^ w2v] shiroyagicorp/japanese-word2vec-model-builder: A tool for building gensim word2vec model for Japanese.

[^ w2v]: Es gibt verschiedene trainierte Word2Vec-Modelle auf Japanisch, daher sollten Sie in der Lage sein, andere zu verwenden, solange die Einheit der Morphologie (z. B. das Teilen des Flexionsende) mit den Trainingsdaten übereinstimmt. → Über das gelernte japanische Wort2vec und seine Bewertung - Blog von Hoxom Co., Ltd.

A trained word2vec model is available at: http://public.shiroyagi.s3.amazonaws.com/latest-ja-word2vec-gensim-model.zip

Es gibt also, laden Sie diese Zip-Datei herunter und verwenden Sie sie.

Dieses Modell enthält Daten, in denen etwa 330.000 Wörter durch 50-dimensionale Vektoren dargestellt werden. Mit diesem Modell kann jedes hier enthaltene Wort ausgegeben werden. Da es auf der Grundlage des Ausdrucks von Word2Vec gelernt wird, können Wörter mit ähnlichen Bedeutungen mit einer bestimmten Wahrscheinlichkeit erscheinen, auch wenn sie nicht in den Trainingsdaten enthalten sind. ** Ist "Versöhne dich mit der Katze" nicht ein Traum? ** ** **

Programm

Zunächst aus dem benötigten Modul import.

import tensorflow as tf
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Dense, Activation, LSTM, Embedding
from tensorflow.keras.optimizers import RMSprop
from tensorflow.keras.callbacks import ModelCheckpoint, ReduceLROnPlateau
import numpy as np
import random
import sys
import pickle
from gensim.models import Word2Vec

Datenaufbereitung

In gewissem Sinne die wichtigsten Daten.

** Wir verwenden das Schild der "Bible Distribution Cooperation Association" und den Text (eine Kopie) des Plakats, das sie anbringen, wenn sie auf der Straße aktiv sind. (Genauso wie letztes Mal) **

text = """
Oh, hör auf die Worte des Weltgottes
Die Belohnung des Bösen ist der Tod
Ein gieriger Mensch erkennt Gott nicht
Derjenige, der das Böse sät, erntet das Unglück
Dein Gott ist der einzige
Machen Sie sich bereit, Ihren Hersteller zu treffen
Erinnere dich an deinen Schöpfer
Jesus Christus ist dein Schöpfer
Jesus Christus gibt ewige Hoffnung
Jesus Christus ist der einzige Sohn Gottes
Jesus Christus ist der Sohn Gottes
Jesus Christus ist der einzige Gott
Jesus Christus beurteilt die Welt richtig
Diejenigen, die Jesus Christus anrufen, werden gerettet
ewiges Leben
Quelle des ewigen Lebens
Ewiger Gott
Quelle der ewigen Erlösung
Hoffnung auf Ewigkeit
Steh in den letzten Tagen vor Gott
In den letzten Tagen steht der Mensch vor Gott
Der Tag, an dem Gott die Menschheit richten wird, ist nahe
Versöhne dich mit Gott
Bereue deine Sünden gegen Gott
Suche Gottes Reich und Gottes Gerechtigkeit
Suche das Reich Gottes und Gerechtigkeit
Das Reich Gottes nähert sich
Das Reich Gottes nähert sich, bereue
Diejenigen, die Gottes Wort ablehnen, bevorzugen den Tod
Gottes Gericht kommt plötzlich
Der Tag des gerechten Gerichts Gottes ist nahe
Jesus Christus, der einzige Sohn Gottes, ist der Erretter
Gott sagt, dass es hier keine Bedingung gibt, zu sterben
Gott sieht das Herz
Gott bestraft die Sünde
Gott sandte Christus, den einzigen Sohn, in die Welt
Gott sandte seinen Sohn Christus in die Welt
Gott ist der einzige
Gott hat die Weisheit der Welt getäuscht
Gott hat den Tag festgelegt, um die Welt zu richten
Bereue deine Haltung gegenüber Gott
Fürchte Gott
Fürchte Gott
Diejenigen, die sich von Gott entfernen, betreten den Weg des Bösen
Erkenne Gott an
Suche Gott
Denken Sie an Ihr Post-Mortem-Ziel
Heute ist der Tag der Erlösung
Es gibt kein anderes Heil als Christus
Der Tag, an dem Christus Menschen richtet, ist nahe
Christus ist der wahre Gott
Christus ist der Weg des Wahrheitslebens
Die Wiederkunft Christi ist nahe
Reinige die Blutsünde Christi
Das Blut Christi reinigt die Sünde
Das Blut Christi reinigt die Sünde
Das Blut Christi reinigt die Sünde
Das Blut Christi beseitigt die Sünde
Es gibt keinen Gott außer Christus
Die Auferstehung Christi ist eine Bestätigung der Erlösung
Christus gibt dir ewiges Leben
Christus rechtfertigt dich
Christus befreit dich von der Sünde
Christus gibt ewiges Leben
Christus ist der Sohn Gottes
Christus hat den Menschen am Kreuz gesündigt
Christus ist das Alter Ego des wahren Gottes
Christus wird bald kommen
Christus wird bald kommen
Christus hebt die Sünde auf und gibt Leben
Christus widerruft die Sünde
Christus vergibt die Sünde und gibt ewiges Leben
Christus ist aus dem Grab auferstanden
Christus ist aus dem Grab auferstanden
Christus hat im Namen des Menschen gesündigt
Christus wird wiederkommen und die Welt richten
Christus wird wiederkommen und die Welt richten
Christus wird wiederkommen
Christus wird wiederkommen
Christus wurde auferweckt
Christus ist der wahre Gott
Christus ist das Alter Ego des wahren Gottes
Christus hat an seiner Stelle gesündigt
Christus ist der Weg des Wahrheitslebens
Christus ist auferstanden und gibt ewiges Leben
Christus hat den Tod wiederbelebt und überwunden
Diejenigen, die an Christus glauben, werden gerettet
Diejenigen, die an Christus glauben, haben ewiges Leben
Diejenigen, die Christus anrufen, werden gerettet
Bereuen
Bereuen
Götzenanbetung ist eine Sünde
Zum Glück diejenigen, die ein reines Herz haben
Glaube an Gott von ganzem Herzen
Gott beurteilt die Sünden des Herzens
Entkomme dem unauslöschlichen Feuer der Hölle
Die Hölle ist ewiges Leiden
Die Hölle ist der zweite Tod
Es gibt ein Urteil nach dem Tod
Treffen Sie das Urteil nach dem Tod
Treffen Sie das Urteil nach dem Tod
Denken Sie an Ihr Ziel nach dem Tod
Denken Sie an Ihr Ziel nach dem Tod
Gott sieht das Privatleben
Es gibt einen Weg des Todes und einen Weg des Lebens
Der Tod ist der Lohn der Sünde
Die Rückkehr des Herrn Jesus Christus ist nahe
Die Auferstehung des Herrn Jesus Christus ist eine Bestätigung der Erlösung
Herr Jesus Christus ist der Schöpfer aller Dinge
Der Tag des Herrn kommt plötzlich
Das Leben ist kurz, der Himmel ist lang
Niemand hat recht
Glaube einfach daran
Glaube einfach daran
Die korrupte Gesellschaft erkennt Gott nicht an
Die Erde und der Mensch sind von Gott
Verehre keine "gemachten" Dinge
Zum Glück diejenigen, die von ihren Sünden gereinigt wurden
Zum Glück diejenigen, die von der Sünde gereinigt wurden
Aufklärung über Sünde, Gerechtigkeit und Gericht
Wenn du in Sünde stirbst, wirst du in die ewige Hölle gehen
Wenn du in Sünde stirbst, wirst du in die ewige Hölle gehen
Der Lohn der Sünde ist der Tod
Der Lohn der Sünde ist das Geschenk des Todesgottes, des ewigen Lebens
Der Lohn der Sünde ist das Geschenk des Todesgottes. Das Geschenk Gottes ist im ewigen Leben Christi
Vergebung der Sünde
Vergebung der Sünden
Suche nach Vergebung der Sünden
Gott bestraft die Sünde
Zum Glück diejenigen, die von ihren Sünden gereinigt wurden
Bereue deine Sünden
Bereue deine Sünden
Himmel oder Hölle oder dein Ziel
Der Himmel ist das ewige Leben Die Hölle ist das Meer des Feuers
Selbst wenn Himmel und Erde zugrunde gehen, werden meine Worte nicht zugrunde gehen
Der Schöpfer aller Dinge
Das Land des Himmels, die Hölle oder alle Menschen sind auferstanden
Das Himmelreich bereut nahe Sünden
Achten Sie auf Fälschungen
Am Anfang schuf Gott Himmel und Erde
Vom Menschen geschaffene Dinge sind keine Götter
Werde das menschliche Übel los
Die Sünde wohnt in Menschen
Die Sünde einer Person loswerden
Gott sieht die Wege und Taten der Menschen
Der Feuerteich ist der zweite Tod
Löse die Ungerechtigkeit ein
Gott beurteilt Unmoral und Geschlechtsverkehr
Gott beurteilt Untreue und Geschlechtsverkehr
Es gibt einen Weg des Todes und einen Weg des Lebens
Erkenne Gott nicht in der krummen Ära
Der wahre Gott liebt Menschen und beseitigt ihre Sünden
Glaube an den wahren Gott
Glaube an den wahren Gott
Michi Wahrheitsleben
Siehe, ich werde bald kommen
Die Welt und die Gier der Welt sterben
Das Ende der Welt ist nahe
Das Ende der Welt kommt plötzlich
Der auferstandene Christus gibt ewiges Leben
Beurteile die Welt richtig
Ist es eine Katastrophe? Eine Person, die das Böse gut nennt
Anbeter, die Götzen verehren
Wehe dem Helden des Trinkens
Ich frage mich, ob es eine Katastrophe sein wird
Ich bin die Art und Weise, wie die Wahrheit lebt
In meinen Worten liegt ewiges Leben
ich bin das Leben
Ich bin das Brot des Lebens
Ich bin das Brot des Lebens
Ich habe die Schlüssel zu Tod und Hölle
Ich bin die Wahrheit
Ich bin die Wahrheit
Ich bin das Licht der Welt
Diejenigen, die an mich glauben, haben ewiges Leben
Diejenigen, die an mich glauben, haben ewiges Leben
Diejenigen, die an mich glauben, haben ewiges Leben
Diejenigen, die an mich glauben, leben, auch wenn sie sterben
Ich bin die Wahrheit und das Leben
Erinnere dich an deinen Schöpfer
Es gibt keine andere Erlösung als Jesus Christus
Rufen Sie Gott an, bevor es zu spät ist
In den letzten Tagen steht der Mensch vor Gott
Christus beurteilt verborgene Dinge
Christus, der von Gott gesandt wurde, ist der Retter
Wenn Sie zu Gott zurückkehren, wird Gott Ihnen reichlich vergeben
Bereue deine Sünden gegen Gott
Das Reich Gottes nähert sich, bereue
Der Tag des Gerichts Gottes ist nahe
Das Geschenk Gottes ist das ewige Leben
Gott liebt Menschen und beseitigt ihre Sünden
Fürchte Gott und gehorche dem Wort
Erkenne Gott und habe Angst, die Sünde zu verlassen
Christus hat das Wort des ewigen Lebens
Nimm das Heil Christi an
Das Blut Christi reinigt die Sünde
Christus wird wiederkommen und die Welt richten
Christus hat den Menschen am Kreuz gesündigt
Christus rettet Sünder
Christus gibt dem Menschen ewiges Leben
Christus wurde für die Ersetzung des Menschen bestraft
Christus befreit die Menschen von der Sünde
Glaube an Christus und sei gerettet
Diejenigen, die Christus anrufen, werden gerettet
Bereue und glaube an das Evangelium
Bereuen
Sei neu von ganzem Herzen
Denken Sie an Ihr Ziel nach dem Tod
Zum Glück diejenigen, die von der Sünde gereinigt wurden
Der Lohn der Sünde ist der Tod
Bitte vergib mir meine Sünden
Die Sünde loswerden
Erkenne deine Sünden an und kehre zu Gott zurück
Christus wurde zum Wohle der menschlichen Gerechtigkeit auferweckt
Gott sieht die Herzen und Gedanken der Menschen
Menschen treffen nach dem Tod ein Urteil
Die Welt und die Gier der Welt sind verschwunden
Es gibt keinen anderen Gott als mich
Ich bin die Art und Weise, wie die Wahrheit lebt
Diejenigen, die an mich glauben, haben ewiges Leben
"""

input_texts = [[w for w in s.split(" ")] for s in text.strip().split("\n")] * 10

Grundsätzlich wird hier das Ergebnis der Analyse des Originaltextes mit mecab -Owakati in text eingefügt. Ich korrigiere jedoch visuell, was das Analyseergebnis falsch ist, und lösche Satzzeichen und Symbole. Darüber hinaus wurden Wörter, die nicht im Word2Vec-Modell enthalten sind, aufgrund von Schwankungen und Verwendung der Notation geändert. Zum Beispiel

―― "Sorge" → "Katastrophe" ―― "Aganau" → "Erlösung" ―― "Takaburu" → "Takaburu" ―― "Ma" "Ta" → "Mama" "Just" ―― "Repent" → "Repent" ("Yo" ist ein zwingendes Ende, daher kann ich es ursprünglich nicht teilen, aber es war nicht in dem von "Repent" verwendeten Word2Vec-Modell enthalten.)

Es gab Muster wie (das ist nicht alles).

Außerdem wird angenommen, dass input_texts jeden Satz 10 Mal wiederholt. Wie wir später sehen werden, werden wir trainieren, zufällige Aussagen in diesen Daten zurückzugeben, wenn sie eingegeben werden. Bereiten Sie einen Datensatz vor, der ungefähr 10 Möglichkeiten von einer Eingabe ausgeben kann.

Word2Vec-Modell

Laden Sie das Word2Vec-Modell. Angenommen, das obige Modell wurde in das Verzeichnis latest-ja-word2vec-gensim-model extrahiert. Bitte ändern Sie den Pfad entsprechend. Ich denke, es ist praktisch, das Modell auf Google Drive zu platzieren, es zu mounten und es zu verwenden. Mounten Sie Google Colaboratory auf Google Drive und führen Sie Python aus. --Qiita

#Word2Vec-Modell der weißen Ziege
model = Word2Vec.load("latest-ja-word2vec-gensim-model/word2vec.gensim.model")
words = ["<PAD>"] + model.wv.index2word
mat_embedding = np.insert(model.wv.vectors, 0, 0, axis=0)
input_token_index = target_token_index = dict((w, i) for i, w in enumerate(words))
num_encoder_tokens = num_decoder_tokens = mat_embedding.shape[0] # for Masking
max_encoder_seq_length = max(len(txt) for txt in input_texts)
max_decoder_seq_length = max_encoder_seq_length + 1 # BOS/EOS
latent_dim = mat_embedding.shape[1]

Wenn Sie ein Modell mit gensim laden, erhalten Sie zwei Informationen: model.wv.index2word und model.wv.vectors.

-- model.wv.index2word enthält das im Modell enthaltene Vokabular (Wortliste). -- model.wv.vectors enthält eine Matrix ( ndarray), die die Vektordarstellungen jedes Wortes auflistet.

Zur Vereinfachung von später möchte ich ID: 0 für das Auffüllen (Ausfüllen des Fehlteils) reservieren, da ich Daten variabler Länge eingebe und sie daher mit dem folgenden Code auf ID: 0 dummstelle Fügt die Wort- und Vektordarstellung von ein. Dadurch wird die Wort-ID im Vergleich zum Word2Vec-Modell um eins verschoben.

words = ["<PAD>"] + model.wv.index2word
mat_embedding = np.insert(model.wv.vectors, 0, 0, axis=0)

Die Größe des in diesem Modell enthaltenen Vokabulars und die Anzahl der Dimensionen des Vektors bestimmen die Größe des zu lernenden Modells (mit Ausnahme der Anzahl der Dimensionen der verborgenen Schicht (interner Zustand) des LSTM). Die Größe jeder Variablen sollte wie folgt sein (Stand 01.05.2020).

Hier ist "max_decoder_seq_length" 1 größer als "max_encoder_seq_length", da beim Erlernen der Decoderseite am Anfang "" hinzugefügt werden muss. [^ 3]

num_encoder_tokens und num_decoder_tokens sind die Eingabe- / Ausgabevokabulargrößen (Worttypen). In Anbetracht der Übersetzungsaufgabe usw. entspricht num_encoder_tokens der Übersetzungsquelle und num_decoder_tokens der Vokabulargröße des Übersetzungsziels, sodass die beiden Werte im Allgemeinen unterschiedlich sind, diesmal jedoch die Eingabe und Ausgabe dieselbe Sprache sind Es ist ein Wert.

[^ 3]: Nur für den Fall, <BOS> und <PAD> sind unterschiedlich. <BOS> ist ein Symbol, das den Anfang eines Satzes darstellt und ein Lernziel ist, während <PAD> ein Symbol ist, um die Länge einer Wortfolge nach kurzen Daten bequem anzupassen. Es ist kein Lernziel.

Modelldefinition

hidden_dim = 64

# Embedding
layer_emb = Embedding(num_encoder_tokens, latent_dim, trainable=False, mask_zero=True)

# Encoder
encoder_inputs = Input(shape=(None,), dtype=tf.int32)
x = layer_emb(encoder_inputs)
_, state_h, state_c = LSTM(hidden_dim, return_sequences=True, return_state=True)(x)
encoder_states = [state_h, state_c]

# Decoder
decoder_inputs = Input(shape=(None,), dtype=tf.int32)
x = layer_emb(decoder_inputs)
x, _, _ = LSTM(hidden_dim, return_sequences=True, return_state=True)(x, initial_state=encoder_states)
decoder_outputs = Dense(num_decoder_tokens)(x)

def accuracy_masking(y_true, y_pred):
    return tf.keras.metrics.sparse_categorical_accuracy(tf.gather_nd(y_true, tf.where(y_pred._keras_mask)), tf.gather_nd(y_pred, tf.where(y_pred._keras_mask)))

model = Model([encoder_inputs, decoder_inputs], decoder_outputs)
opt = RMSprop(lr=0.01)
model.compile(optimizer=opt, loss=lambda y_true, y_pred: tf.nn.softmax_cross_entropy_with_logits(tf.one_hot(tf.cast(y_true, tf.int32), num_decoder_tokens), y_pred),
              metrics=[accuracy_masking])
# set embedding matrix
layer_emb.set_weights([mat_embedding])

Die eingegebene Wort-ID-Zeichenfolge wird in eine Vektordarstellung in der Ebene "Einbetten" konvertiert und an LSTM übergeben. Diese eingebettete Matrix (Vektordarstellung jedes Wortes) verwendet die Werte, die aus dem trainierten Word2Vec-Modell stammen, wie oben beschrieben [^ 2]. Verwenden Sie daher "trainable = False", um zu verhindern, dass die eingebettete Matrix während des Trainings aktualisiert wird. machen. Fügen Sie außerdem mask_zero = True hinzu, um ID: 0 als Auffüllung zu behandeln.

[^ 2]: Unmittelbar nach dem Erstellen der Ebene wird die Gewichtsmatrix nicht initialisiert und set_weights () kann nicht ausgeführt werden. Setzen Sie sie daher nach dem Erstellen des Modells.

Danach entspricht das Erstellen eines Modells fast dem Keras-Lernprogramm. Ich möchte das Label jedoch nach Wort-ID (und nicht nach einem One-Hot-Vektor) angeben, daher definiere ich die Verlustfunktion selbst. Ich möchte die Partitur manipulieren, um später leichter verschiedene Wörter zu erhalten. Deshalb habe ich beschlossen, Softmax nicht in die Ausgabeebene ( Dense) des Modells und `` tf.nn.sparse_softmax_cross_entropy_with_logits () zu setzen Berechnen Sie die Verlustfunktion mit . [^ 4]

[^ 4]: Wenn Sie die Punktzahl nicht manipulieren müssen, können Sie loss = 'sparse_categorical_crossentropy' verwenden. Fügen Sie in diesem Fall Softmax in die Ausgabeebene des Modells ein.

In Bezug auf den während des Trainings angezeigten Genauigkeitswert werden auch die Daten, die als Auffüllung behandelt werden sollten (sollten ignoriert werden), in die Berechnung einbezogen. Daher habe ich meine eigenen "Metriken" erstellt, um sie zu korrigieren. Sie können die Maske erhalten, indem Sie auf die Eigenschaft _keras_mask von Tensor verweisen. Masking and padding with Keras | TensorFlow Core

Datenformung zum Lernen

# create data
encoder_input_data = np.zeros(
    (len(input_texts), max_encoder_seq_length),
    dtype='int32')
decoder_input_data = np.zeros(
    (len(input_texts), max_decoder_seq_length),
    dtype='int32')
decoder_target_data = np.zeros(
    (len(input_texts), max_decoder_seq_length),
    dtype='int32')

output_texts = list(input_texts)
random.shuffle(output_texts)
# input one text and randomly output another text
for i, (input_text, target_text) in enumerate(zip(input_texts, output_texts)):
    for t, w in enumerate(input_text):
        encoder_input_data[i, t] = input_token_index[w]

    decoder_input_data[i, 0] = target_token_index['@'] # BOS
    for t, w in enumerate(target_text):
        # decoder_target_data is ahead of decoder_input_data by one timestep
        decoder_input_data[i, t + 1] = target_token_index[w]
        decoder_target_data[i, t] = target_token_index[w]
    decoder_target_data[i, t + 1:] = target_token_index['。'] # EOS

Erstellen Sie drei ndarrays: encoder_input_data, decoder_input_data und decoder_target_data. Da alle als Wort-ID-Zeichenfolgen vorbereitet sind, wird dtype = 'int32' gesetzt.

Wie oben erwähnt, sind "Eingabetexte" Daten, bei denen eine Eingabezeichenfolge zehnmal wiederholt wird. Indem wir dies in output_texts mischen, erstellen wir Trainingsdaten, die zufällig eine Ausgabezeichenfolge für eine bestimmte Eingabezeichenfolge zurückgeben (bis zu 10 verschiedene Ausgabezeichenfolgen für dieselbe Eingabezeichenfolge). Wird assoziiert mit).

Stellen Sie beim Trainieren der Decoder-Seite mit dem Encoder-Decoder-Modell sicher, dass die Ausgabezeichenfolge ein Wort schneller ist als die Eingabezeichenfolge (Vektordarstellung). Wie oben erwähnt, beginnt der Satzanfang auf der Eingabeseite mit "", aber dieses Mal habe ich beschlossen, das Wort "@" zu verwenden, um den Satzanfang anzuzeigen (Ist es in Ordnung, dies zu tun?) .. Im Gegenteil, das Ende des Satzes auf der Ausgabeseite ist "". Es wird dargestellt durch '' '.

Lernen

Führen Sie einfach die Methode fit () aus und warten Sie eine Weile. In der GPU-Umgebung von Google Colab dauert es ungefähr 10 Minuten.

batch_size = 64  # Batch size for training.
epochs = 50  # Number of epochs to train for.

cp_cb = ModelCheckpoint(
    filepath="model.{epoch:02d}.hdf5",
    verbose=1,
    mode="auto")

reduce_cb = ReduceLROnPlateau()

# Run training
model.fit([encoder_input_data, decoder_input_data], decoder_target_data,
          batch_size=batch_size,
          epochs=epochs,
          validation_split=0.2,
          callbacks=[cp_cb, reduce_cb])

Das Lernen wird wie folgt fortgesetzt.

Epoch 1/50
28/28 [==============================] - ETA: 0s - loss: 2.7266 - accuracy_masking: 0.1383
Epoch 00001: saving model to model.01.hdf5
28/28 [==============================] - 11s 390ms/step - loss: 2.7266 - accuracy_masking: 0.1383 - val_loss: 1.9890 - val_accuracy_masking: 0.1918 - lr: 0.0100
(Weggelassen)
Epoch 50/50
28/28 [==============================] - ETA: 0s - loss: 0.2723 - accuracy_masking: 0.8259
Epoch 00050: saving model to model.50.hdf5
28/28 [==============================] - 9s 329ms/step - loss: 0.2723 - accuracy_masking: 0.8259 - val_loss: 0.4014 - val_accuracy_masking: 0.7609 - lr: 1.0000e-03

Inferenz

Es ist eine Vorbereitung für die tatsächliche Erzeugung von Sätzen unter Verwendung des erlernten Modells.

encoder_model = Model(encoder_inputs, encoder_states)

decoder_lstm = model.layers[4]
decoder_dense = model.layers[5]

decoder_state_input_h = Input(shape=(hidden_dim,))
decoder_state_input_c = Input(shape=(hidden_dim,))
decoder_states_inputs = [decoder_state_input_h, decoder_state_input_c]
decoder_outputs, state_h, state_c = decoder_lstm(
    layer_emb(decoder_inputs), initial_state=decoder_states_inputs)
decoder_states = [state_h, state_c]
decoder_outputs = decoder_dense(decoder_outputs)
decoder_model = Model(
    [decoder_inputs] + decoder_states_inputs,
    [decoder_outputs] + decoder_states)

Erstellen Sie Encoder und Decoder separat. Die Encoderseite nimmt eine Wortfolge als Eingabe und gibt den Status aus, nachdem die Eingabe abgeschlossen ist. Die Decoderseite verwendet die Wortzeichenfolge und den Status als Eingabe (obwohl Sie jeweils nur ein Wort eingeben können) und gibt die Ausgabezeichenfolge und den neuen Status aus.

def decode_sequence(input_seq):
    # Encode the input as state vectors.
    states_value = encoder_model.predict([input_seq])
    # Generate empty target sequence of length 1. (batch x sample x time)
    target_seq = np.zeros((1, 1, 1), dtype=np.int32)
    # Populate the first character of target sequence with the start character.
    target_seq[0, 0, 0] = target_token_index['@']

    # Sampling loop for a batch of sequences
    # (to simplify, here we assume a batch of size 1).
    stop_condition = False
    decoded_sentence = []
    temperature = 1.2
    while not stop_condition:
        output_tokens, h, c = decoder_model.predict(
            [target_seq] + states_value)

        # Sample a token (with temperature)
        logits = output_tokens[0, 0, :]
        prob = np.exp(logits / temperature)
        prob /= (prob.sum() * 1.00001)
        sampled_token_index = np.argmax(np.random.multinomial(1, prob))
        sampled_word = words[sampled_token_index]
        decoded_sentence.append(sampled_word)

        # Exit condition: either hit max length
        # or find stop character.
        if (sampled_word == '。' or
           len(decoded_sentence) > max_decoder_seq_length):
            stop_condition = True

        # Update the target sequence (of length 1).
        target_seq[0, 0, 0] = sampled_token_index

        # Update states
        states_value = [h, c]

    return decoded_sentence

Wir werden die Eingabezeichenfolge mit dem Encoder und Decoder zur Inferenz verarbeiten. States_value entspricht dem Status des Encoders, wenn die Eingabespalte in den Encoder eingegeben wird. Geben Sie dem Decoder diesen Status und das erste "BOS" -Wort "@". Das Eingabewort wird auf target_seq gesetzt, aber die Form ist (1, 1, 1), da das Modell eine Batch-Eingabe annimmt und ein Sample und ein Wort der Reihe nach ausgibt. ).

Der Decoder gibt die Punktzahl des Ausgabeworts (die Ausgabe der Schicht "Dense") für das eingegebene Wort und den vorherigen Zustand zurück. Sie können dies mit Softmax in Wahrscheinlichkeit umwandeln. Um jedoch das Erhalten von Wörtern mit niedrigen Punktzahlen zu vereinfachen, ändern Sie die Punktzahl, die durch die konstante "Temperatur" geteilt und dann in Softmax eingegeben wird. Ein Wort wird gemäß der erhaltenen Wahrscheinlichkeit abgetastet und als Ausgabe verwendet. Dieses Ausgabewort ist das Ende des Satzes "". '`` wird die Schleife brechen.

Machen wir das!

Ich bin endlich bereit. Generieren Sie so viel wie Sie wollen! Entscheide den ersten Satz angemessen.

s = ["Katze", "Wann", "Siedlung", "Seyo"]
for i in range(50):
    gen = decode_sequence([input_token_index[w] for w in s])
    print("".join(gen))
    s = gen

50 Sätze werden so ausgegeben.

Christus gibt dir das Leben Christi.
Bereue deine Sünden gegen Gott.
Götzenanbetung ist eine Sünde.
Ich war des Ziels Christi schuldig.
Es gibt keinen Gott außer Christus.
Bereue deine Sünden.
Christus ist in deiner Nähe.
Eine korrupte Gesellschaft erkennt Gott nicht an.
Bereue und glaube an das Evangelium.
Die Sünde loswerden.
Götzenanbetung ist eine Sünde.
Der Himmel ist ein ewiges Leben Das Geschenk der Hölle.
Das Geschenk Gottes ist das ewige Leben.
Christus wurde auferweckt, damit der Mensch gerechtfertigt wird.
Gott sündigt das lokale globale Prinzip.
Am Anfang hat Gott himmlische Dinge.
Herr von Evians Sünden.
Feuer gibt den Weg und das ewige Leben.
Bereue und glaube an das Evangelium.
Der Tag, an dem Mogura geschlagen wird, kommt plötzlich.
Die verborgene Ära ist nahe.
Selbst wenn Himmel und Erde zugrunde gehen, geht die Hölle des Menschen nicht zugrunde.
Christus ist aus dem Grab auferstanden.
Zum Glück sind diejenigen, die sauber sind, falsch.
Gott ist der einzige.
Christus wird wiederkommen.
Ein lustvoller Mensch erkennt Gott nicht.
Gott ist der einzige.
Christus ist der wahre Gott.
Denken Sie an Ihr Ziel nach dem Tod.
Es gibt einen Weg der Anastasia und einen Weg des Lebens.
Ich habe die Schlüssel zu Tod und Hölle.
Gott ist der einzige.
Gott sieht das Herz.
Gott sandte seinen Sohn Christus in die Welt.
Himmel oder Hölle oder wohin gehst du?
Beurteile die Welt richtig.
Heute ist der Tag der Erlösung.
Gott ist der einzige.
Christus rettet Sünder.
Eine Person, die ein Idol verehrt.
Treffen Sie das Urteil nach dem Tod.
Christus ist auferstanden.
Gott bestraft die Sünde.
Werde das menschliche Übel los.
Christus ist der einzige Gott.
Glaube an den wahren Gott.
Gib das Blut Christi.
Es gibt keinen Gott außer Christus.
Der Grund des Himmels und der Erde nennt Montagabend den Gott des Todes.

Es gibt eine Menge Ausgabe ähnlich dem Originaltext, aber ** einige Wörter sind nicht in den Trainingsdaten ** enthalten. ** "Der Tag, an dem Mogura getroffen wird, kommt plötzlich" ** lachte. ** "Selbst wenn Himmel und Erde zugrunde gehen, geht die Hölle des Menschen nicht zugrunde" ** kann nicht gerettet werden. ** "Der Grund des Himmels und der Erde nennt den Gott des Todes Montagabend" ** Ist es ein Komiker oder eine Geschichte von jemandem?

Da die Ausgabezeichenfolge der Trainingsdaten nur der Wortlaut des Schilds ist, fühlt es sich ehrlich gesagt so an, als ob ** egal was Sie eingeben, der Wortlaut wird herauskommen **. ** Der Anfangswert ist nahezu irrelevant. Vielleicht. ** Das mag in Ordnung sein (ich denke nicht, dass es die ursprüngliche Verwendung von Seq2Seq ist, aber es ist okay).

Zusammenfassung

Obwohl es mehr Variationen als beim letzten Mal gibt, gibt es immer noch einige Ausgaben, die als Japanisch zusammengebrochen sind, und ähnliche Sätze wurden oft gemacht. Trotzdem kann gesagt werden, dass es wie beabsichtigt ist, dass die empörenden Worte erscheinen und zu Ihnen kommen.

Mit diesem Gefühl hoffe ich, auch in Zukunft verschiedene Modelle genießen zu können. Weil es ein langer Urlaub ist. Es ist ziemlich schwierig, auf einem Laptop zu lernen, aber Colab hat eine kostenlose GPU, so dass Sie es einfach als Hobby ausprobieren können. Wirklich fett. image.png Auferstehung des Christuszeichengenerators (v2)

Recommended Posts

[TensorFlow] Ich hatte das Gefühl, dass ich mit Seq2Seq Nachrichten im Stil eines "posthumen Urteils" in Massenproduktion produzieren konnte.
[TensorFlow] Ich habe versucht, mit LSTM eine Nachricht wie "Treffen Sie das Urteil nach dem Tod" in Massenproduktion zu produzieren
Ich habe versucht, Text mit TensorFlow zu klassifizieren
Python: Ich konnte in Lambda rekursieren
[Ich möchte Bilder mit Tensorflow klassifizieren] (2) Lassen Sie uns Bilder klassifizieren
Ich habe ein ○ ✕ Spiel mit TensorFlow gemacht
Ich habe versucht, die Syntax zu bewerten, die mit der COTOHA-API zu humorvoll und humorvoll war.
Eine Geschichte, von der ich bei np.where süchtig war
Ich hatte das Gefühl, dass ich den Python-Code nach C ++ 98 portiert habe.
Python: Kann in Lambda wiederholt werden
Wovon ich süchtig war, als ich Python Tornado benutzte