Skip to main content
 首页 » 编程设计

python之TensorFlow 模型恢复 ValueError之至少两个变量具有相同的名称

2024年08月20日27mq0036

我已经保存了一个模型,现在我正在尝试恢复它,恢复后它第一次正常工作但是当我在同一个正在运行的程序上按下“测试”按钮来测试另一个图像时它给出了错误

ValueError:至少有两个变量同名: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})) 

请您参考如下方法:

您加载的图表已经包含推理所需的所有变量。您需要从保存的图中加载张量,例如 accuracy。在您的情况下,您在外部声明了相同的变量,这与图中的变量冲突。

在训练期间,如果您使用 name='accuracy' 命名您的张量 accuracy,那么您可以使用以下命令从图中加载它:get_tensor_by_name( '准确度:0')。在您的示例中,您还需要从图中加载输入张量 x 和 y 。你的代码应该是这样的:

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}))