Ich möchte den endgültigen Zustand meines LSTM speichern, so dass es bei der Wiederherstellung des Modells enthalten ist und für die Vorhersage verwendet werden kann. Wie unten erläutert, hat der Saver nur Kenntnis über den Endzustand, wenn ich tf.assign
verwende. Dies wirft jedoch einen Fehler auf (auch unten erläutert).Tensorflow speichern endgültigen Zustand von LSTM in dynamic_rnn für die Vorhersage
Während des Trainings füttere ich immer den endgültigen LSTM-Status zurück in das Netzwerk, wie in this post erläutert. Hier sind die wichtige Teile des Codes:
Wenn die Grafik Gebäude:
self.init_state = tf.placeholder(tf.float32, [
self.n_layers, 2, self.batch_size, self.n_hidden
])
state_per_layer_list = tf.unstack(self.init_state, axis=0)
rnn_tuple_state = tuple([
tf.contrib.rnn.LSTMStateTuple(state_per_layer_list[idx][0],
state_per_layer_list[idx][1])
for idx in range(self.n_layers)
])
outputs, self.final_state = tf.nn.dynamic_rnn(
cell, inputs=self.inputs, initial_state=rnn_tuple_state)
Und während des Trainings:
_current_state = np.zeros((self.n_layers, 2, self.batch_size,
self.n_hidden))
_train_step, _current_state, _loss, _acc, summary = self.sess.run(
[
self.train_step, self.final_state,
self.merged
],
feed_dict={self.inputs: _inputs,
self.labels:_labels,
self.init_state: _current_state})
Als ich später mein Modell von einem Kontrollpunkt wieder herzustellen, der Endzustand ist nicht wieder hergestellt. Wie in this post beschrieben, besteht das Problem darin, dass der Saver den neuen Zustand nicht kennt. Der Beitrag schlägt auch eine Lösung vor, basierend auf tf.assign
. Leider kann ich nicht verwenden, um die vorgeschlagene
assign_op = tf.assign(self.init_state, _current_state)
self.sess.run(assign_op)
weil self.init Zustand keine Variable ist, sondern ein Platzhalter. Ich erhalte die Fehler
Attribute: ‚Tensor‘ Objekt hat kein Attribut ‚zuweisen‘
ich versucht habe, für mehrere Stunden nun, dieses Problem zu lösen, aber ich kann es nicht zu arbeiten.
Jede Hilfe wird geschätzt!
EDIT:
Ich habe mich verändert self.init_state zu
self.init_state = tf.get_variable('saved_state', shape=
[self.n_layers, 2, self.batch_size, self.n_hidden])
state_per_layer_list = tf.unstack(self.init_state, axis=0)
rnn_tuple_state = tuple([
tf.contrib.rnn.LSTMStateTuple(state_per_layer_list[idx][0],
state_per_layer_list[idx][1])
for idx in range(self.n_layers)
])
outputs, self.final_state = tf.nn.dynamic_rnn(
cell, inputs=self.inputs, initial_state=rnn_tuple_state)
Und während des Trainings ich keinen Wert für self.init_state füttern:
_train_step, _current_state, _loss, _acc, summary = self.sess.run(
[
self.train_step, self.final_state,
self.merged
],
feed_dict={self.inputs: _inputs,
self.labels:_labels})
jedoch Ich kann den Auftrag noch immer nicht ausführen. Ich bekomme
Typeerror wissen: Erwartete float32 'Assign' übergeben für den Parameter 'Wert' von op, bekam (LSTMStateTuple (c = array ([[0,07291573, -,06366599, -,23425588, ..., 0,05307654,
Ihre Frage _really_ sieht aus wie ein Duplikat der Verknüpfung. Die akzeptierte Antwort schlägt Ihnen tatsächlich vor, den Platzhalter in eine tf.Variable umzuwandeln, damit Sie den Status im Netzwerk mit TensorFlow-Zuweisungsoperationen aktualisieren können. –
Ja, ich habe es versucht. Vielleicht mache ich einen Fehler, wenn ich es umwandele. Wie wandle ich es richtig in eine tf.Variable um? Die Verwendung von self.init_state = tf.Variable (self.init_state) löst einen Fehler bei der Initialisierung aller Variablen aus. – Lemon
Ich habe die ursprüngliche Frage geändert (siehe Bearbeiten). Es funktioniert immer noch nicht so, wie es in dem anderen Beitrag erklärt wurde. Fehle ich etwas? – Lemon