2017-07-08 4 views
2

j'ai sauvé un modèle et maintenant je suis en train de restaurer, après la restauration fonctionne pour la première fois correctement mais quand j'appuyez sur la touche « TEST » sur le même programme en cours d'exécution pour tester une autre image, il donne l'erreurtensorflow Modèle Restauration ValueError - Au moins deux variables ont le même nom

ValueError: au moins deux variables ont le même nom: Variable_2/Adam

def train_neural_network(x): 
    prediction = neural_network_model(x)#logits 

    softMax=tf.nn.softmax_cross_entropy_with_logits(
      logits=prediction, labels=y)#prediction and original comapriosn 
    cost = tf.reduce_mean(softMax)#total loss 
    optimizer = tf.train.AdamOptimizer(learning_rate=0.001).minimize(cost)#learning_rate=0.01 
    hm_epochs = 20 

    new_saver = tf.train.Saver() 
    with tf.Session() as sess: 
     global s 
     s=sess 
     sess.run(tf.global_variables_initializer()) 
     new_saver = tf.train.import_meta_graph('../MY_MODELS/my_MNIST_Model_1.meta') 
     new_saver.restore(s, tf.train.latest_checkpoint('../MY_MODELS')) 

     correct = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1)) 

     accuracy = tf.reduce_mean(tf.cast(correct, 'float')) 

     print('Accuracy:', accuracy.eval(
      {x: mnist.test.images, y: mnist.test.labels})) 

Répondre

2

le graphique que vous avez chargé a déjà toutes les variables nécessaires à l'inférence . Vous devez charger les tenseurs comme accuracy du graphique enregistré. Dans votre cas, vous avez les mêmes variables déclarées à l'extérieur, ce qui est en conflit avec les variables du graphique.

Pendant l'entraînement, si vous avez nommé votre tenseur accuracy avec name='accuracy', vous pouvez le charger à partir du graphique en utilisant: get_tensor_by_name('accuracy:0'). Dans votre exemple, vous devez charger les tenseurs d'entrée x et y également à partir du graphique. Votre code devrait ressembler à:

def inference(): 
    loaded_graph = tf.Graph() 
    new_saver = tf.train.Saver() 
    with tf.Session(graph=loaded_graph) as sess: 
     new_saver = tf.train.import_meta_graph('../MY_MODELS/my_MNIST_Model_1.meta') 
     new_saver.restore(s, tf.train.latest_checkpoint('../MY_MODELS')) 

     #Get the tensors by their variable name 
     # Note: the names of the following tensors have to be declared in your train graph for this to work. So just name them appropriately. 
     _accuracy = loaded_graph.get_tensor_by_name('accuracy:0') 
     _x = loaded_graph.get_tensor_by_name('x:0') 
     _y = loaded_graph.get_tensor_by_name('y:0') 

     print('Accuracy:', _accuracy.eval(
     {_x: mnist.test.images, _y: mnist.test.labels})) 
+0

devrait fonction de formation (modèle d'économie) et la fonction d'essai (modèle restauration) différent? ne peuvent-ils être une même fonction? –

+0

Ils peuvent être même si votre formation et tester en même temps dans le même graphique. Mais ne faites pas un autre graphique quand vous faites cela. Dans votre code, supprimez tout le chargement du graphique et exécutez directement la précision pour la prédiction sur le graphique par défaut. –

+0

u peut voir la variable de prédiction, je ne suis pas en mesure de le sauvegarder dans le modèle, ce sont les logits que je dois utiliser, mais je ne peux pas les sauver, s'il vous plaît aider –