Tensorflow ValueError: No hay variables para guardar desde

He escrito un tensorflow CNN y ya está entrenado. Deseo restaurarlo para ejecutarlo en algunas muestras, pero desafortunadamente está escupiendo:

ValueError: No hay variables para guardar

Mi código de evaluación se puede encontrar aquí:

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

El tf.train.Saver debe crearse después de las variables que desea restaurar (o guardar). Además, debe crearse en el mismo gráfico que esas variables.

Suponiendo que Process.forward_propagation(…) también crea las variables en su modelo, agregar la creación de protector después de esta línea debería funcionar:

 forward_propgation_results = Process.forward_propagation(images) 

Además, debe pasar el nuevo tf.Graph que creó al constructor tf.Session por lo que deberá mover la creación de sess dentro de ese bloque también.

La función resultante será algo como:

 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.restre(sess, eval_dir) print(sess.run(top_k_op)) 

Tenga en cuenta que desde TF 0.11, hace mucho tiempo todavía después de la respuesta actualmente aceptada, tf.train.Saver obtuvo un argumento defer_build en su constructor que le permite definir variables después de que se haya construido. Sin embargo, ahora debe llamar a su función de build miembros cuando se hayan agregado todas las variables, por lo general justo antes de finilize su gráfica.

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

Simplemente, debe haber al menos una variable tf. Que esté definida antes de crear su objeto de ahorro.

Puede ejecutar el código anterior agregando la siguiente línea de código antes de la definición del objeto de ahorro.

El código que necesita agregar se encuentra entre los dos ###.

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