7

Ich versuche RNN auf einem multivariaten Sequenzklassifikationsproblem mit variabler Länge.In Tensorflow, wie über eine Sequenz von Eingaben in einem Tensor zu iterieren?

I folgende Funktion definiert die Ausgabe der Sequenz zu erhalten (d.h. die Ausgabe der RNN Zelle nach der letzten Eingabe von Sequenz zugeführt wird)

def get_sequence_output(x_sequence, initial_hidden_state): 
    previous_hidden_state = initial_hidden_state 
    for x_single in x_sequence: 
     hidden_state = gru_unit(previous_hidden_state, x_single) 
     previous_hidden_state = hidden_state 
    final_hidden_state = hidden_state 
    return final_hidden_state 

Hier x_sequence Tensor Form (?, ?, 10) wobei zuerst? ist für Losgröße und Sekunde? ist für Sequenz Länge und jedes Eingabeelement ist von Länge 10. gru Funktion nimmt einen vorherigen versteckten Zustand und aktuellen Eingang und spuckt nächsten versteckten Zustand (eine Standard-Gated wiederkehrende Einheit).

Ich erhalte einen Fehler: 'Tensor' object is not iterable. Wie iteriere ich über einen Tensor in der Reihenfolge Weise (das Lesen einzelner Elemente zu einer Zeit)?

Mein Ziel ist es, gru Funktion für jeden Eingang aus der Sequenz anzuwenden und den letzten versteckten Zustand zu erhalten.

Antwort

7

Sie können einen Tensor in eine Liste konvertieren, indem Sie die Funktion entpacken verwenden, die die erste Dimension in eine Liste umwandelt. Es gibt auch eine Split-Funktion, die etwas Ähnliches macht. Ich benutze die Entstapelung in einem RNN-Modell, an dem ich arbeite.

y = tf.unstack(tf.transpose(y, (1, 0, 2))) 

In diesem Fall beginnt mit y Form aus (batch_size, TIME_STEPS, 128) I transponiere es die Zeit, um die Außenabmessung Schritte und dann ausgepackt in eine Liste von Tensoren, einem pro Zeitschritt. Jetzt jedes Element in der y-Liste wenn Form (BATCH_SIZE, 128) und ich kann es in meine RNN einspeisen.

+1

Dies funktioniert nicht, wenn time_steps nicht vorhanden ist (variable Länge der Sequenz). – Cospel

10

In TF> = 1,0, tf.pack und tf.unpack werden tf.stack umbenannt und tf.unstack jeweils