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