2016-02-17 19 views
5

Ho appena iniziato a giocare con TensorFlow e sto cercando di implementare un RNN molto semplice. Il RNN ha x come input, come output ed è costituito da un solo layer che prende x e il suo output precedente come input. Ecco una foto del genere di cose che ho in mente:Come costruire un semplice RNN con un ciclo nel grafico in TensorFlow?

A simple RNN

Il problema è, non riesco a vedere alcun modo attraverso il tensorflow API per costruire un grafico con un ciclo in esso. Ogni volta che definisco un Tensore, devo specificare quali sono gli input, il che significa che devo aver già definito i suoi input. Quindi c'è un problema di pollo e uova.

Non so nemmeno se abbia senso volere definire un grafico con un ciclo (cosa viene calcolato prima? Dovrei definire un valore iniziale del nodo softmax?). Ho giocato con l'idea di utilizzare una variabile per rappresentare l'output precedente e quindi di prendere manualmente il valore di e memorizzarlo nella variabile ogni volta dopo aver passato un campione di addestramento. Ma sarebbe molto lento a meno che non ci sia un modo per rappresentare questa procedura nel grafico stesso (?).

So che le esercitazioni di TensorFlow mostrano implementazioni di esempio di RNN, ma imbrogliano e estraggono un modulo LSTM dalla libreria che contiene già il ciclo. Nel complesso, le esercitazioni sono buone per guidarti attraverso come costruire certe cose, ma potrebbero fare un lavoro migliore per spiegare come funziona davvero questa bestia.

Quindi, esperti di TensorFlow, c'è un modo per costruire questa cosa? Come potrei fare per farlo?

+0

La tua idea variabile sembra una strada da percorrere, non dovrebbe essere lenta se usi le variabili TensorFlow/assegna ops –

+0

Ma non dovrei chiamare 'sess.run (y_prev.assign (y))' ed eseguire i campioni attraverso uno alla volta? O vuoi dire che dovrei combinare questo con la tattica di svolgimento descritta da @Ishamael? – Shum

risposta

2

In effetti, sia il passaggio avanti che quello indietro in tutti i framework di apprendimento automatico presuppongono che la rete non disponga di cicli. Un modo comune di implementare una rete ricorrente è srotolarlo in tempo per diversi passaggi (ad esempio 50), e quindi convertire una rete che ha loop in uno che non ne ha.

Per esempio, nella documentazione si fa riferimento a:

https://www.tensorflow.org/versions/r0.7/tutorials/recurrent/index.html

accennano

Al fine di rendere il processo di apprendimento trattabili, si tratta di una pratica comune per troncare i gradienti per backpropagation a un numero fisso (num_steps) di passi srotolati.

cosa significa efficacemente è che creeranno num_steps cellule LSTM, dove ognuno prende in ingresso il valore x per passo temporale corrente, e l'uscita del modulo LSTM precedente.

Il BasicLSTMCell che usano e che si pensa abbia un loop in effetti non ha un loop. Una cella LSTM è solo un'implementazione di un singolo passo LSTM (un blocco che ha due ingressi [ingresso e memoria] e due uscite [uscita e memoria] e utilizza porte per calcolare le uscite dagli ingressi), non l'intera rete LSTM.

Problemi correlati