Sto cercando di capire i modelli seq2seq definiti in seq2seq.py in tensorflow. Uso bit di codice che copio dall'esempio translate.py fornito con tensorflow. Continuo a ricevere lo stesso errore e davvero non capisco da dove viene.Errore durante la costruzione del modello seq2seq con tensorflow
Un esempio di codice minimo per riprodurre l'errore:
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))
L'errore che ottengo quando si valuta l'ultima riga (I è stato condotto in modo interattivo l'interprete python):
>>> 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]]
Ho il sospetto che errore viene dal mio lato :) Su un sidenote. La documentazione e le esercitazioni sono davvero fantastiche ma il codice di esempio per il modello sequenza-sequenza (l'esempio di traduzione dall'inglese al francese) è piuttosto denso. Devi anche saltare molto tra i file per capire cosa sta succedendo. Almeno mi sono perso diverse volte nel codice.
Un esempio minimo (forse su alcuni dati giocattolo) di costruzione e addestramento di un modello seq2seq di base sarebbe davvero utile qui. Qualcuno sa se questo esiste già da qualche parte?
EDIT ho fissato il codice di cui sopra, secondo i suggerimenti @Ishamael (significato, nessun errore rendimenti) (vedi sotto), ma ci sono ancora alcune cose che non chiare in questa versione fissa. Il mio input è una sequenza di vettori di lunghezza 2 di valori reali. E il mio risultato è una sequenza di vettori binari di lunghezza 22. Il mio codice tf.placeholder non dovrebbe essere il seguente? (EDIT sì)
tf.placeholder(tf.float32, shape=[None,2],name="encoder{0}".format(i))
tf.placeholder(tf.float32, shape=[None,22],name="encoder{0}".format(i))
ho anche dovuto cambiare tf.int32 a tf.float32 sopra. Dal momento che il mio output è binario. Questo non dovrebbe essere tf.int32 per il tf.placeholder del mio decodificatore? Ma tensorflow si lamenta di nuovo se lo faccio. Non sono sicuro di quale sia il ragionamento dietro a questo.
La dimensione del mio livello nascosto è 512 qui.
il codice fisso completo
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))
sto cercando di imparare seq2seq in tf momento. 350 sono le dimensioni del vocabol del tuo codificatore e 45 le dimensioni del vocabol del decodificatore? – Soubriquet