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)

Antworten auf die Frage(4)

Ihre Antwort auf die Frage