2016-04-17 3 views
2

Ich versuche die Schaffung eines wiederkehrenden neuronalen Netzwerks im Tensor-Fluss. Die Eingabe in das Netzwerk ist eine Folge von Vektoren. Die Sequenzlänge ist für alle Eingaben unterschiedlich. Ich möchte dies mit Batch von Eingaben tun.Wie kann man ein rekurrentes neuronales Netzwerk im Tensorfluss für variable Sequenzlängen erzeugen?

Kann mir jemand helfen, wie genau das geht? Ich habe die Tutorials auf der Tensorflow Seite durchgesehen, aber es ist mir immer noch nicht klar.

+0

Dieses https://github.com/tensorflow/tensorflow/tree/master/tensorflow/models/rnn Modell tut, was Sie (für BERSETZUNG in diesem Fall) – Ashish

+0

Hallo Ashish wollen, habe ich versucht, durch diesen Code zu gehen bevor Sie diese Frage stellen. Aber ich konnte nicht genau herausfinden, wie es geht. Würde es Ihnen etwas ausmachen, auf den richtigen Platz im Code zu zeigen? Vielen Dank – akshaybetala

Antwort

1

Sie können die Funktion RNN here

Eines der Argumente ist es nimmt sequence_length definiert verwenden

sequence_length: Spezifiziert die Länge jeder Sequenz in Eingänge. Eine Int32- oder Int64-Vektorgröße (Tensor) [Stapelgröße]. Werte in [0, T).

Hier ist, wie komplette Schleife implementieren

# x, state, sequence_length are placeholders 
outputs, final_state = tf.nn.rnn(lstm_cell, x, state, sequence_length = sequence_lengths) 
# add softmax layer, define loss, training method, etc 
... 

# code for one epoch 
iterations = total_data_length/batch_size 
max_sequence_length = max(all_possible_sequence_lengths) 
cur_state = initial_state 

for i in range(iterations): 
    # x is of dimension [max_sequence_length, batch_size, input_size] 
    # sequence_lengths is of dimension [batch_size] 
    x_data, sequence_data, y_data = mini_batch(batch_size) 

    feed_dict = {k: v for k, v in zip(x, x_data)} 
    feed_dict.append(sequence_lengths: sequence_data, ...) 
    outs, cur_state, _ = session.run([outputs, final_state, train], feed_dict) 

Diese Methode mir etwas verwirrend für ein paar Gründe war:

[sequence_length, batch_size, input_size] und nicht
  1. Eingabeform ist [Stapelgröße, Sequenzlänge, Eingabegröße] Dies ist jedoch völlig sinnvoll, wenn Sie den Code durchlaufen und sehen, wie rnn() implementiert wird. Dies bedeutet auch, dass Sie Ihre Ausgänge (mit den gleichen Abmessungen wie die Eingänge) umformen müssen, um sie zum Beispiel an Matmul und dann an Softmax zu übergeben.
  2. Parametereingaben in der Funktion rnn() ist eine Python-Liste. Und Sie können dies nicht in feed_dict als {x: x_data} übergeben, Sie erhalten einen Fehler mit der Meldung "Hash-Typ nicht möglich: 'list'". Sehen Sie stattdessen, wie ich oben im Code das Verständnis verwendet habe.
0

Es auf Ihrem Datensatz abhängt, aber Sie tun können:

  1. Verwenden Sie die maximale Länge in Ihrem Datensatz oder
  2. eine vernünftige Größe (zB 256) und teilt die Eingangsdaten nach oben verwenden zu die Größe, wenn sie länger als die Größe sind.
Verwandte Themen