2017-11-18 2 views
4

Ich versuche ein multivariates Zeitreihenvorhersagemodell zu erstellen. Ich folgte dem folgenden Tutorial zur Temperaturvorhersage. http://nbviewer.jupyter.org/github/addfor/tutorials/blob/master/machine_learning/ml16v04_forecasting_with_LSTM.ipynbLSTM kann nicht mit MultiRNNCell und dynamic_rnn gestapelt werden

Ich will sein Modell erweitern, indem Sie folgenden Code auf mehrschichtige LSTM Modell:

cell = tf.contrib.rnn.LSTMCell(hidden, state_is_tuple=True) 
cell = tf.contrib.rnn.MultiRNNCell([cell] * num_layers,state_is_tuple=True) 
output, _ = tf.nn.dynamic_rnn(cell=cell, inputs=features, dtype=tf.float32) 

aber ich habe einen Fehler zu sagen:

ValueError: Dimensions must be equal, but are 256 and 142 for 'rnn/while/rnn/multi_rnn_cell/cell_0/cell_0/lstm_cell/MatMul_1' (op: 'MatMul') with input shapes: [?,256], [142,512].

Als ich dies versucht:

cell = [] 
for i in range(num_layers): 
    cell.append(tf.contrib.rnn.LSTMCell(hidden, state_is_tuple=True)) 
cell = tf.contrib.rnn.MultiRNNCell(cell,state_is_tuple=True) 
output, _ = tf.nn.dynamic_rnn(cell=cell, inputs=features, dtype=tf.float32) 

Ich habe keinen solchen Fehler, aber die Vorhersage ist wirklich schlecht.

Ich definiere hidden=128.

features = tf.reshape(features, [-1, n_steps, n_input]) hat Form (?,1,14) für Einschichtgehäuse.

sehen meine Daten wie diese x.shape=(594,14), y.shape=(591,1)

Ich bin so verwirrt, wie LSTM Zelle in tensorflow zu stapeln. Meine Tensorflow-Version ist 0.14.

Antwort

4

Dies ist eine sehr interessante Frage. Anfänglich dachte ich, dass zwei Codes die gleiche Ausgabe erzeugen (, d. H. Stapeln von zwei LSTM-Zellen).

Code 1

cell = tf.contrib.rnn.LSTMCell(hidden, state_is_tuple=True) 
cell = tf.contrib.rnn.MultiRNNCell([cell] * num_layers,state_is_tuple=True) 
print(cell) 

Code 2

cell = [] 
for i in range(num_layers): 
    cell.append(tf.contrib.rnn.LSTMCell(hidden, state_is_tuple=True)) 
cell = tf.contrib.rnn.MultiRNNCell(cell,state_is_tuple=True) 
print(cell) 

jedoch Wenn Sie die Zelle in beiden Fällen erzeugen so etwas wie folgt zu drucken,

Code 1

[<tensorflow.python.ops.rnn_cell_impl.BasicLSTMCell object at 0x000000000D7084E0>, <tensorflow.python.ops.rnn_cell_impl.BasicLSTMCell object at 0x000000000D7084E0>] 

Code 2

[<tensorflow.python.ops.rnn_cell_impl.BasicLSTMCell object at 0x000000000D7084E0>, <tensorflow.python.ops.rnn_cell_impl.BasicLSTMCell object at 0x000000000D708B00>] 

Wenn Sie genau die Ergebnisse beobachten,

  • Für Code 1, druckt eine Liste von zwei LSTM Zellobjekte und ein Objekt ist die Kopie von anderen (seit den Zeigern von Die beiden Objekte sind gleich)
  • Für Code 2 druckt eine Liste von zwei verschiedenen LSTM-Zellobjekte (da die Zeiger von zwei Objekten unterschiedlich sind).

Stacking zwei LSTM Zellen ist so etwas wie unten,

enter image description here

Daher Wenn Sie sich über das große Bild denken (tatsächliche Tensorflow Betrieb kann anders sein), was sie tut, ist,

  1. ersten mAP Eingänge bis LSTM Zelle 1 versteckte Einheiten (in Ihrem Fall bis).
  2. Zweitens Karte versteckte Einheiten LSTM Zelle 1, um versteckte Einheiten LSTM Zelle 2 (in Ihrem Fall zu).

Wenn Sie also die beiden oben genannten Operationen auf die gleiche Kopie von LSTM Zelle (da die Abmessungen der Gewichtsmatrizen verschieden sind) zu tun versuchen, ist ein Fehler.

Wenn Sie jedoch verwenden, um die Anzahl der versteckt Einheiten als selber die Anzahl Eingang Einheiten (in Ihrem Fall eingegeben wird und versteckt ist) kein Fehler vorhanden ist (da die Abmessungen des Gewichts Matrizen sind die gleichen), obwohl Sie die gleiche LSTM Zelle verwenden.

Deshalb denke ich, dass Ihr zweiter Ansatz korrekt ist, wenn Sie denken, zwei LSTM-Zellen zu stapeln.

+0

Vielen Dank für Ihre Erklärung. Ich bin immer noch verwirrt: – zdarktknight

+0

worüber bist du verwirrt? –

+0

Warum ist die 1. Karte 14 (das ist die Dimension meiner Features) bis 256 (das ist meine Batch-Größe). – zdarktknight

Verwandte Themen