J'ai écrit un CNN tensorflow et il est déjà formé. Je souhaite le restaurer pour l'exécuter sur quelques échantillons mais malheureusement son crachat:
ValueError: Aucune variable à enregistrer
Mon code eval peut être trouvé ici:
import tensorflow as tf
import main
import Process
import Input
eval_dir = "/Users/Zanhuang/Desktop/NNP/model.ckpt-30"
checkpoint_dir = "/Users/Zanhuang/Desktop/NNP/checkpoint"
init_op = tf.initialize_all_variables()
saver = tf.train.Saver()
def evaluate():
with tf.Graph().as_default() as g:
sess.run(init_op)
ckpt = tf.train.get_checkpoint_state(checkpoint_dir)
saver.restore(sess, eval_dir)
images, labels = Process.eval_inputs(eval_data = eval_data)
forward_propgation_results = Process.forward_propagation(images)
top_k_op = tf.nn.in_top_k(forward_propgation_results, labels, 1)
print(top_k_op)
def main(argv=None):
evaluate()
if __name__ == '__main__':
tf.app.run()
Le tf.train.Saver
Doit être créé après les variables que vous souhaitez restaurer (ou enregistrer). De plus, il doit être créé dans le même graphique que ces variables.
En supposant que Process.forward_propagation(…)
crée également les variables dans votre modèle, l'ajout de la création de l'économiseur après cette ligne devrait fonctionner:
forward_propgation_results = Process.forward_propagation(images)
De plus, vous devez passer le nouveau tf.Graph
Que vous avez créé au constructeur tf.Session
, Vous devrez donc déplacer la création de sess
à l'intérieur de ce with
bloquer aussi.
La fonction résultante sera quelque chose comme:
def evaluate():
with tf.Graph().as_default() as g:
images, labels = Process.eval_inputs(eval_data = eval_data)
forward_propgation_results = Process.forward_propagation(images)
init_op = tf.initialize_all_variables()
saver = tf.train.Saver()
top_k_op = tf.nn.in_top_k(forward_propgation_results, labels, 1)
with tf.Session(graph=g) as sess:
sess.run(init_op)
saver.restore(sess, eval_dir)
print(sess.run(top_k_op))
Simplement, il devrait y avoir au moins une variable tf. qui est définie avant de créer votre objet économiseur.
Vous pouvez exécuter le code ci-dessus en ajoutant la ligne de code suivante avant la définition de l'objet économiseur.
Le code que vous devez ajouter est venu entre les deux ###.
import tensorflow as tf
import main
import Process
import Input
eval_dir = "/Users/Zanhuang/Desktop/NNP/model.ckpt-30"
checkpoint_dir = "/Users/Zanhuang/Desktop/NNP/checkpoint"
init_op = tf.initialize_all_variables()
### Here Comes the fake variable that makes defining a saver object possible.
_ = tf.Variable(initial_value='fake_variable')
###
saver = tf.train.Saver()
...
Notez que depuis TF 0.11 - il y a longtemps encore après la réponse actuellement acceptée - tf.train.Saver
a gagné defer_build
argument dans son constructeur qui vous permet de définir des variables après sa construction. Cependant, vous devez maintenant appeler sa fonction membre build
lorsque toutes les variables ont été ajoutées, généralement juste avant finilize
inging votre graphique.
saver = tf.train.Saver(defer_build=True)
# build you graph here
saver.build()
graph.finalize()
# now entering training loop