6

Ich möchte ein Spielzeug LSTM-Modell für die Regression zu bauen. This nettes Tutorial ist schon zu kompliziert für einen Anfänger.TensorFlow dynamic_rnn Regressor: ValueError Dimension nicht übereinstimmen

Bei einer gegebenen Sequenz der Länge time_steps den nächsten Wert vorhersagen. Betrachten time_steps=3 und die Sequenzen:

array([ 
    [[ 1.], 
    [ 2.], 
    [ 3.]], 

    [[ 2.], 
    [ 3.], 
    [ 4.]], 
    ... 

die Zielwerte sollten:

array([ 4., 5., ... 

ich folgendes Modell definieren:

# Network Parameters 
time_steps = 3 
num_neurons= 64 #(arbitrary) 
n_features = 1 

# tf Graph input 
x = tf.placeholder("float", [None, time_steps, n_features]) 
y = tf.placeholder("float", [None, 1]) 

# Define weights 
weights = { 
    'out': tf.Variable(tf.random_normal([n_hidden, 1])) 
} 
biases = { 
    'out': tf.Variable(tf.random_normal([1])) 
} 

#LSTM model 
def lstm_model(X, weights, biases, learning_rate=0.01, optimizer='Adagrad'): 

    # Prepare data shape to match `rnn` function requirements 
    # Current data input shape: (batch_size, time_steps, n_features) 
    # Required shape: 'time_steps' tensors list of shape (batch_size, n_features) 
    # Permuting batch_size and time_steps 
    input dimension: Tensor("Placeholder_:0", shape=(?, 3, 1), dtype=float32) 

    X = tf.transpose(X, [1, 0, 2]) 
    transposed dimension: Tensor("transpose_41:0", shape=(3, ?, 1), dtype=float32) 

    # Reshaping to (time_steps*batch_size, n_features) 
    X = tf.reshape(X, [-1, n_features]) 
    reshaped dimension: Tensor("Reshape_:0", shape=(?, 1), dtype=float32) 

    # Split to get a list of 'time_steps' tensors of shape (batch_size, n_features) 
    X = tf.split(0, time_steps, X) 
    splitted dimension: [<tf.Tensor 'split_:0' shape=(?, 1) dtype=float32>, <tf.Tensor 'split_:1' shape=(?, 1) dtype=float32>, <tf.Tensor 'split_:2' shape=(?, 1) dtype=float32>] 

    # LSTM cell 
    cell = tf.nn.rnn_cell.LSTMCell(num_neurons) #Or GRUCell(num_neurons) 

    output, state = tf.nn.dynamic_rnn(cell=cell, inputs=X, dtype=tf.float32) 

    output = tf.transpose(output, [1, 0, 2]) 
    last = tf.gather(output, int(output.get_shape()[0]) - 1) 


    return tf.matmul(last, weights['out']) + biases['out'] 

Wir mit pred = lstm_model(x, weights, biases) das LSTM Modell instanziieren ich die folgende :

---> output, state = tf.nn.dynamic_rnn(cell=cell, inputs=X, dtype=tf.float32) 
ValueError: Dimension must be 2 but is 3 for 'transpose_42' (op: 'Transpose') with input shapes: [?,1], [3] 

1) Weißt du, was das Problem ist?

2) Multiplizieren die LSTM-Ausgabe mit den Gewichtungen die Regression?

+0

Können Sie den gesamten Stack-Trace für den Fehler freigeben? Aus der Fehlermeldung wird ersichtlich, dass einige 'tf.transpose() 'op auf einen 2-D Tensor angewendet wird, aber die Dimensionspermutation (zweites Argument) hat drei Werte. Ich denke, es kommt von [dieser Zeile] (https://github.com/tensorflow/tensorflow/blob/dc7293fe0f8084af1f608a5f0d4e93acd9f597f6/tensorflow/python/ops/rnn.py#L488), und das Problem ist, dass tf.nn .dynamic_rnn() 'erwartet, dass alle Zeitschritte in einem einzigen Tensor zusammengefasst werden. Versuchen Sie, 'tf.split()' zu entfernen und den ursprünglichen 'X'-Wert an' tf.nn.dynamic_rnn() 'zu übergeben. – mrry

+0

@mrry Ich glaube, dass die Eingabedimension für dynamic_rdd() (Batch_size, time_steps, n_features) sein sollte. Daher sollten die "Vorverarbeitungsschritte", die ich dort mache, nicht erforderlich sein. – mastro

+0

Richtig. Ich denke, das ist eine schlechte Fehlermeldung. Sie übergeben eine Liste von 'time_steps' 2-D-Tensoren, aber die korrekte Eingabe wäre ein einzelner 3-D-Tensor (und die erste Dimension sollte 'batch_size' anstatt 'time_steps' sein, sodass die Transponierung nicht notwendig sein sollte entweder). – mrry

Antwort

8

Wie in den Kommentaren diskutiert, die tf.nn.dynamic_rnn(cell, inputs, ...) Funktion erwartet eine Liste von dreidimensionalen Tensoren * als inputs Argument, wobei die Abmessungen standardmäßig interpretiert werden als batch_size x num_timesteps x num_features. (Wenn Sie time_major=True übergeben, werden sie als num_timesteps x x num_features interpretiert.) Daher ist die Vorverarbeitung, die Sie in dem ursprünglichen Platzhalter ausgeführt haben, nicht erforderlich, und Sie können den Wert X direkt an tf.nn.dynamic_rnn() übergeben.


* Technisch kann es kompliziert verschachtelte Strukturen zusätzlich zu Listen akzeptieren, aber die Blattelemente müssen dreidimensionale Tensor sein. **

** Untersuchung stellte sich dabei um einen Fehler bei der Umsetzung von tf.nn.dynamic_rnn() auf. Im Prinzip sollte es ausreichend sein, dass die Eingänge mindestens zwei Dimensionen haben, aber der Pfad time_major=False nimmt an, dass sie genau drei Dimensionen haben, wenn sie die Eingabe in das Zeit-Haupt-Format umsetzt, und es war die Fehlermeldung, dass dieser Fehler versehentlich auftritt Ursachen, die in Ihrem Programm aufgetaucht sind. Wir arbeiten daran, das behoben zu bekommen.

+0

Wenn nicht Führen Sie die Vorverarbeitung auf X durch und übergeben Sie sie direkt. Dann wird der Fehler ausgegeben: ValueError: Keine Werte werden nicht unterstützt. @ outputs, _, _ = tf.nn.bidirektionale_dynamische_rnn (lstm_fw_cell_m, lstm_bw_cell_m, x, dtype = tf.float32) – neel

Verwandte Themen