14

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

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

risposta

8

maggior parte dei modelli (seq2seq non è un'eccezione) aspettano il loro contributo sia in lotti, quindi se la forma del tuo ingresso logico è [n], allora la forma di un tensore si prevede di utilizzare come ingresso per il modello dovrebbe essere [batch_size x n]. In pratica, la prima dimensione della forma viene in genere lasciata fuori come None e viene considerata la dimensione del batch in fase di esecuzione.

Poiché l'input logico di seq2seq è un vettore di numeri, la forma del tensore reale deve essere [None, input_sequence_length].Così codice fisso apparirebbe lungo le linee di:

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

(e poi lo stesso per il decoder)

+0

grazie per avermi aiutato! Ho modificato la mia domanda sopra in base ai tuoi suggerimenti e ho aggiunto qualche domanda in più 512 è la dimensione del mio livello nascosto. in tf.placeholder dovrebbe riflettere la dimensione del mio vettore di input e output e non le dimensioni del livello nascosto? – user1782011

+0

Sì, ho il sospetto che non dovrebbe essere 512, ma il messaggio di errore mi ha confuso :) Immagino di averlo letto male. Il modo in cui hai corretto il tuo codice è in effetti corretto. Non sono sicuro del problema 'int32' vs' float', ma si noti che 'basic_rnn_seq2seq' ha un argomento' dtype' che di default 'float32'. Prova a impostarlo su 'int32' e poi a modificare l'input su' int32', ma non ho una piena comprensione di quel parametro, quindi è solo un'ipotesi. – Ishamael

+0

Inoltre, è generalmente una buona pratica porre nuove domande quando si affrontano nuovi problemi, anziché modificare la domanda, in modo che le risposte e le domande siano mantenute semplici e coprano un singolo problema quando le persone le cercano. – Ishamael

1

V'è un metodo di auto-test nel modulo tradurre che mostra il suo utilizzo minimo. [here]

Ho appena eseguito il metodo di autotest utilizzando.

python translate.py --self_test 1 
+0

Ehi, l'autotest è davvero utile; Ma i miei principali punti dolenti sono in seq2seq_model.py. Non riesco ancora a capire perché il mio esempio di codice precedente fallisce :( – user1782011