TensorFlow checkpoint guardar y leer

Tengo una neural network basada en TensorFlow y un conjunto de variables.

La función de entrenamiento es así:

def train(load = True, step) """ Defining the neural network is skipped here """ train_step = tf.train.AdamOptimizer(1e-4).minimize(mse) # Saver saver = tf.train.Saver() if not load: # Initalizing variables sess.run(tf.initialize_all_variables()) else: saver.restre(sess, 'Variables/map.ckpt') print 'Model Restored!' # Perform stochastic gradient descent for i in xrange(step): train_step.run(feed_dict = {x: train, y_: label}) # Save model save_path = saver.save(sess, 'Variables/map.ckpt') print 'Model saved in file: ', save_path print 'Training Done!' 

Estaba llamando a la función de entrenamiento así:

 # First train train(False, 1) # Following train for i in xrange(10): train(True, 10) 

Hice este tipo de entrenamiento porque necesitaba alimentar diferentes conjuntos de datos a mi modelo. Sin embargo, si llamo a la función de tren de esta manera, TensorFlow generará un mensaje de error que indica que no puede leer el modelo guardado desde el archivo.

Después de algunos experimentos descubrí que esto sucedió porque el ahorro en el punto de control fue lento. Antes de que el archivo se escribiera en el disco, la siguiente función de tren comenzaría a leer, por lo tanto generaría el error.

He intentado usar la función time.sleep () para hacer algún retraso entre cada llamada pero no funcionó.

¿Alguien sabe cómo resolver este tipo de error de escritura / lectura? ¡Muchas gracias!

Hay un problema sutil en su código: cada vez que llama a la función train() , se agregan más nodos al mismo gráfico TensorFlow, para todas las variables del modelo y el rest de la neural network. Esto significa que cada vez que construyas un tf.train.Saver() , incluye todas las variables para las llamadas anteriores a train() . Cada vez que _N a crear el modelo, las variables se crean con un sufijo adicional de _N para darles un nombre único:

  1. Saver construido con variables var_a , var_b .
  2. Ahorro construido con las variables var_a , var_b , var_a_1 , var_b_1 .
  3. Ahorro construido con las variables var_a , var_b , var_a_1 , var_b_1 , var_a_2 , var_b_2 .
  4. etc.

El comportamiento predeterminado para un tf.train.Saver es asociar cada variable con el nombre de la op correspondiente. Esto significa que var_a_1 no se inicializará desde var_a , ya que terminan con nombres diferentes.

La solución es crear un nuevo gráfico cada vez que llame a train() . La forma más sencilla de solucionarlo es cambiar su progtwig principal para crear un nuevo gráfico para cada llamada a train() siguiente manera:

 # First train with tf.Graph().as_default(): train(False, 1) # Following train for i in xrange(10): with tf.Graph().as_default(): train(True, 10) 

… o, de manera equivalente, puede mover el bloque with dentro de la función train() .