14

Ich versuche, die seq2seq Modelle in seq2seq.py in tensorflow definiert zu verstehen. Ich verwende Codebits, die ich aus dem translate.py-Beispiel kopiert habe, das mit Tensorflow geliefert wird. Ich bekomme immer den gleichen Fehler und verstehe wirklich nicht, woher es kommt.Fehler beim seq2seq Modell mit tensorflow Aufbau

Ein minimales Codebeispiel der Fehler zu reproduzieren:

import tensorflow as tf 
from tensorflow.models.rnn import rnn_cell 
from tensorflow.models.rnn import seq2seq 

encoder_inputs = [] 
decoder_inputs = [] 
for i in xrange(350): 
    encoder_inputs.append(tf.placeholder(tf.int32, shape=[None], 
               name="encoder{0}".format(i))) 

for i in xrange(45): 
    decoder_inputs.append(tf.placeholder(tf.int32, shape=[None], 
             name="decoder{0}".format(i))) 

model = seq2seq.basic_rnn_seq2seq(encoder_inputs, 
            decoder_inputs,rnn_cell.BasicLSTMCell(512)) 

Der Fehler, den ich bekomme, wenn die letzte Zeile der Bewertung (ich es interaktiv in dem Python-Interpreter ausgewertet):

>>> Traceback (most recent call last): 
     File "<stdin>", line 1, in <module> 
     File "/tmp/py1053173el", line 12, in <module> 
     File "/usr/local/lib/python2.7/dist-packages/tensorflow/models/rnn/seq2seq.py", line 82, in basic_rnn_seq2seq 
     _, enc_states = rnn.rnn(cell, encoder_inputs, dtype=dtype) 
     File "/usr/local/lib/python2.7/dist-packages/tensorflow/models/rnn/rnn.py", line 85, in rnn 
     output_state = cell(input_, state) 
     File "/usr/local/lib/python2.7/dist-packages/tensorflow/models/rnn/rnn_cell.py", line 161, in __call__ 
     concat = linear.linear([inputs, h], 4 * self._num_units, True) 
     File "/usr/local/lib/python2.7/dist-packages/tensorflow/models/rnn/linear.py", line 32, in linear 
     raise ValueError("Linear is expecting 2D arguments: %s" % str(shapes)) 
    ValueError: Linear is expecting 2D arguments: [[None], [None, 512]] 

Ich vermute, die Fehler kommt von meiner Seite :) Auf einer Nebennote. Die Dokumentation und die Tutorials sind wirklich großartig, aber der Beispielcode für das Sequenz-zu-Sequenz-Modell (das Beispiel von Englisch nach Französisch) ist ziemlich dicht. Sie müssen auch viel zwischen den Dateien hin- und herspringen, um zu verstehen, was vor sich geht. Ich bin zumindest mehrmals im Code verloren gegangen.

Ein minimales Beispiel (vielleicht auf einige Spielzeug-Daten) von der Konstruktion und Ausbildung ein Grund seq2seq Modell hier sehr hilfreich sein würde. Jemand weiß, ob das schon irgendwo existiert?

EDIT Ich habe den Code oben nach @Ishamael Vorschlägen (das heißt, keine Fehler Returns) (siehe unten) festgelegt, aber es gibt noch einige Dinge in dieser festen Version nicht klar. Meine Eingabe ist eine Folge von Vektoren der Länge 2 von reellen Werten. Und meine Ausgabe ist eine Folge von binären Vektoren der Länge 22. Sollte mein tf.placeholder-Code nicht wie folgt aussehen? (EDIT ja)

tf.placeholder(tf.float32, shape=[None,2],name="encoder{0}".format(i)) 
tf.placeholder(tf.float32, shape=[None,22],name="encoder{0}".format(i)) 

musste ich auch oben tf.float32 ändern tf.int32. Da meine Ausgabe binär ist. Sollte das nicht für den Tf.Placeholder meines Decoders tf.int32 sein? Aber Tensorflow beschwert sich wieder, wenn ich das tue. Ich bin mir nicht sicher, was die Gründe dafür sind.

Die Größe meiner verborgenen Schicht ist hier 512.

der komplette Festcode

import tensorflow as tf 
from tensorflow.models.rnn import rnn_cell 
from tensorflow.models.rnn import seq2seq 

encoder_inputs = [] 
decoder_inputs = [] 
for i in xrange(350): 
    encoder_inputs.append(tf.placeholder(tf.float32, shape=[None,512], 
              name="encoder{0}".format(i))) 

for i in xrange(45): 
    decoder_inputs.append(tf.placeholder(tf.float32, shape=[None,512], 
             name="decoder{0}".format(i))) 

model = seq2seq.basic_rnn_seq2seq(encoder_inputs, 
            decoder_inputs,rnn_cell.BasicLSTMCell(512)) 
+0

Ich versuche jetzt seq2seq in tf zu lernen. Ist 350 die Vocab-Größe Ihres Encoders und 45 die Vocab-Größe Ihres Decoders? – Soubriquet

Antwort

8

Die meisten Modelle (seq2seq ist keine Ausnahme) erwarten, dass ihre Eingabe in Chargen sein, so dass, wenn die Form des logischen Eingangs [n] ist, dann eine Form eines Tensor werden Sie als Eingang verwenden zu Ihrem Modell sollte [batch_size x n] sein. In der Praxis wird die erste Dimension der Form normalerweise als None ausgelassen und zur Laufzeit als Stapelgröße angenommen.

Da der logische Eingang zu seq2seq ein Vektor aus Zahlen ist, sollte die tatsächliche Tensorform [None, input_sequence_length] sein.So festen Code aussehen würde entlang der Linien von:

input_sequence_length = 2; # the length of one vector in your input sequence 

for i in xrange(350): 
    encoder_inputs.append(tf.placeholder(tf.int32, shape=[None, input_sequence_length], 
               name="encoder{0}".format(i))) 

(und dann das gleiche für den Decoder)

+0

danke, dass du mir geholfen hast! Ich habe meine Frage entsprechend deiner Vorschläge bearbeitet und einige zusätzliche Fragen hinzugefügt. 512 ist die Größe meiner versteckten Ebene. Ich nehme an, du meinst die Nummer in TF.Placeholder sollte die Größe meiner Eingabe und Ausgabe Vektor und nicht die Größe der versteckten Ebene? – user1782011

+0

Ja, ich vermutete, dass es nicht 512 sein sollte, aber die Fehlermeldung verwirrte mich :) Ich denke, ich habe es falsch gelesen. Die Art, wie Sie Ihren Code korrigiert haben, ist in der Tat richtig. Ich bin mir nicht sicher über das 'int32' vs' float' Problem, aber beachten Sie, dass 'basic_rnn_seq2seq' ein Argument' dtype' hat, das standardmäßig auf 'float32' steht. Versuchen Sie, es auf "int32" zu setzen und dann Ihre Eingabe in "int32" zu ändern - aber ich habe den Parameter nicht vollständig verstanden, also ist es nur eine Vermutung. – Ishamael

+0

Außerdem ist es in der Regel eine gute Methode, neue Fragen zu stellen, wenn Sie sich neuen Fragen gegenübersehen, anstatt die Frage zu bearbeiten, sodass die Antworten und Fragen einfach gehalten werden und ein einzelnes Problem behandelt wird. – Ishamael

1

Es ist eine Selbsttest-Methode in dem Modul übersetzen, das seine minimale Nutzung zeigt. [here]

Ich lief die Selbsttest-Methode.

python translate.py --self_test 1 
+0

Hey, der Selbsttest ist in der Tat hilfreich; Aber meine Hauptschmerzpunkte sind in seq2seq_model.py. Ich verstehe immer noch nicht, warum mein Beispielcode fehlschlägt :( – user1782011

Verwandte Themen