Für diejenigen, die dies oder jenes für Deep-Learning-Modellierung ausprobieren möchten, aber nicht wissen, wie sie es implementieren sollen Verwendung der funktionalen API von keras als Framework, das relativ flexibel und angemessen abstrahiert ist Versuchen Sie, seq2seq, das mit sequentiellen Funktionen schwierig ist, so einfach wie möglich zu implementieren
Es stellt sich heraus, dass Keras verwendet werden können, um tiefes Lernen zu implementieren. Ich verstehe, dass tiefes Lernen eine Vorverarbeitung beinhaltet. Wie kann ich die Daten in ein Format konvertieren, das die Deep-Learning-Funktion von Keras nutzen kann? Die Hauptantwort ist das.
Wenn das Übersetzungsmodell das erste Wort eines Satzes ableitet, wird das Starttoken \
Um in das Modell des maschinellen Lernens einzugeben, müssen die geladenen Zeichenkettendaten auf irgendeine Weise quantifiziert werden. Wortsack und One-Hot-Codierung jedes Wortes sind berühmte Methoden. Dieses Mal möchte ich die Einbettungsschicht von Keras am Anfang des Netzwerks verwenden, also weise ich dem Wort eine Wort-ID zu und konvertiere sie in eine Spalte mit einer Wort-ID.
Einbettungsschicht https://keras.io/ja/layers/embeddings/
Wenn möglich, vereinheitlichen Sie die Länge der Wortzeichenfolge innerhalb des Datasets, um die Eingabe in das spätere LSTM zu erleichtern. Dieses Mal wird die Länge der Wortzeichenfolge durch Auffüllen angepasst, um der maximalen Länge im Datensatz zu entsprechen.
Beim Erlernen des seq2seq-Modells wird der Lehrer als Technik erzwungen. Ursprünglich verwendet der Decodierer das Schätzergebnis des vorherigen Wortes, um das nächste Wort zu schätzen. Da die richtigen Antwortdaten während des Lernens verwendet werden können, wird das nächste Wort unter Verwendung des vorherigen richtigen Antwortworts anstelle des vorherigen Schätzergebnisses geschätzt. In der Figur ist der Fluss wie folgt. Selbst wenn die Schlussfolgerungen von "das" und "dies" und "Stift" und "Bleistift" falsch sind, wird die nächste Eingabe auf die richtigen Antwortdaten korrigiert. Um dies zu erreichen, bereiten Sie eine Wortfolge vor, bei der nur ein Wort von der Zielwortfolge als Eingabe des Decoders verschoben ist.
Beispiel
Wenn das Schätzziel "Dies ist ein Stift. \
Der obige Fluss kann wie folgt zusammengefasst werden.
Wenn beispielsweise die obige Verarbeitung durchgeführt wird, wird eine solche Konvertierung durchgeführt. Datensatzwortzeichenfolge <start> i can 't tell who will arrive first . <end> ↓ Word ID-Spalte \ [2, 6, 42, 20, 151, 137, 30, 727, 234, 4, 3, 0, 0, 0, 0, 0, 0, 0](18 Elemente)
Definieren Sie die folgenden zwei Funktionen, lesen Sie Daten aus dem Datensatz für jede Zeile und geben Sie Start- / End-Token.
def preprocess_sentence(w):
w = w.rstrip().strip()
#Fügen Sie Start- und End-Token für Anweisungen hinzu
#Damit das Modell weiß, wann die Vorhersage gestartet und beendet werden soll
w = '<start> ' + w + ' <end>'
return w
def create_dataset(path, num_examples):
with open(path) as f:
word_pairs = f.readlines()
word_pairs = [preprocess_sentence(sentence) for sentence in word_pairs]
return word_pairs[:num_examples]
Obwohl es preprocess_sentence heißt, gibt es nur Start- / End-Token, was für eine Funktion kein sehr guter Name ist. Die Variable in create_dataset ist word_pairs, da der Beispielcode von TensorFlow, auf den ich verwiesen habe, noch vorhanden ist. Es sind überhaupt keine Paare, sondern es werden num_examples-Wortzeichenfolgen mit Start- / End-Token zurückgegeben.
Hier ist Keras 'keras.preprocessing.text.Tokenizer` sehr praktisch und Sie können eine Pause machen.
def tokenize(lang):
lang_tokenizer = keras.preprocessing.text.Tokenizer(filters='', oov_token='<unk>')
lang_tokenizer.fit_on_texts(lang)
tensor = lang_tokenizer.texts_to_sequences(lang)
tensor = keras.preprocessing.sequence.pad_sequences(tensor, padding='post')
return tensor, lang_tokenizer
Bestimmen Sie die Konvertierungsregel zwischen Wörtern und Wort-IDs aus der Liste der Wortzeichenfolgen, die mit der Methode fit_on_texts
eingegeben wurden.
Mit der Methode "text_to_sequences" können Sie die Liste der eingegebenen Wortzeichenfolgen in eine Liste der Wort-ID-Zeichenfolgen konvertieren.
Das Auffüllen von 0 erfolgt auch mit keras.preprocessing.sequence.pad_sequences
.
Eingabewort-ID-Zeichenfolge, die durch Verarbeiten von "input_tensor" mit der obigen Methode erhalten wird
Verarbeiten Sie target_tensor
als die richtige Wort-ID-Zeichenfolge, die von der obigen Methode wie folgt verarbeitet wird.
encoder_input_tensor = input_tensor
decoder_input_tensor = target_tensor[:,:-1]
decoder_target_tensor = target_tensor[:,1:] #Dies verwirklicht das Erzwingen von Lehrern
Sie haben jetzt die Daten, die im seq2seq-Modell verwendet werden sollen. Wir werden im nächsten Artikel modellieren und lernen.
Der Vorbehandlungsteil ist wie folgt Neuronale maschinelle Übersetzung mit Aufmerksamkeit https://www.tensorflow.org/tutorials/text/nmt_with_attention
Die Codebasis für den Lern- / Inferenzteil ist wie folgt Sequence to sequence example in Keras (character-level). https://keras.io/examples/lstm_seq2seq/
Die zum Lernen verwendeten Daten sind wie folgt https://github.com/odashi/small_parallel_enja
Das Repository mit dem Code für diesen Artikel https://github.com/nagiton/simple_NMT
Recommended Posts