web-dev-qa-db-fra.com

Tensorflow ValueError: aucune variable à enregistrer

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()
16
Zan Huang

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))
22
mrry

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()
...
3

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 finilizeinging votre graphique.

saver = tf.train.Saver(defer_build=True)
# build you graph here
saver.build()
graph.finalize()
# now entering training loop
2
P-Gn