SensorFlow: LSTM-Status für die nächste Charge speichern (stateful LSTM)
Gegeben ein trainiertes LSTM-Modell möchte ich Inferenz für einzelne Zeitschritte durchführen, d. H.seq_length = 1
im folgenden Beispiel. Nach jedem Zeitschritt müssen die internen LSTM-Zustände (Speicher und ausgeblendete Zustände) für den nächsten "Stapel" gespeichert werden. Für den Beginn der Inferenz gibt das interne LSTM @ ainit_c, init_h
werden bei der Eingabe berechnet. Diese werden dann in einem @ gespeicheLSTMStateTuple
Objekt, das an den LSTM übergeben wird. Während des Trainings wird dieser Status bei jedem Zeitschritt aktualisiert. Zum Schluss möchte ich jedoch dasstate
, um zwischen Chargen gespeichert zu werden, d. h. die Anfangszustände müssen nur zu Beginn berechnet werden, und danach sollten die LSTM-Zustände nach jeder "Charge" gespeichert werden (n = 1).
Ich fand diese verwandte StackOverflow-Frage: Sensorflow, der beste Weg, um den Status in RNNs zu speichern?. Dies funktioniert jedoch nur, wennstate_is_tuple=False
, aber dieses Verhalten wird bald von TensorFlow verworfen (siehe rnn_cell.py). Keras scheint einen netten Wrapper zu haben, um @ zu machStaatsbürgerlic LSTMs möglich, aber ich weiß nicht, wie ich dies in TensorFlow am besten erreichen kann. Dieses Problem auf dem TensorFlow GitHub hängt auch mit meiner Frage zusammen:https: //github.com/tensorflow/tensorflow/issues/283
Werden gute Vorschläge zum Aufbau eines Stateful-LSTM-Modells gemacht?
inputs = tf.placeholder(tf.float32, shape=[None, seq_length, 84, 84], name="inputs")
targets = tf.placeholder(tf.float32, shape=[None, seq_length], name="targets")
num_lstm_layers = 2
with tf.variable_scope("LSTM") as scope:
lstm_cell = tf.nn.rnn_cell.LSTMCell(512, initializer=initializer, state_is_tuple=True)
self.lstm = tf.nn.rnn_cell.MultiRNNCell([lstm_cell] * num_lstm_layers, state_is_tuple=True)
init_c = # compute initial LSTM memory state using contents in placeholder 'inputs'
init_h = # compute initial LSTM hidden state using contents in placeholder 'inputs'
self.state = [tf.nn.rnn_cell.LSTMStateTuple(init_c, init_h)] * num_lstm_layers
outputs = []
for step in range(seq_length):
if step != 0:
scope.reuse_variables()
# CNN features, as input for LSTM
x_t = # ...
# LSTM step through time
output, self.state = self.lstm(x_t, self.state)
outputs.append(output)