2017-07-08 6 views
2

モデルを保存しましたが、復元しようとしていますが、最初に正しく復元した後に同じものを 'TEST'別の画像をテストするためのプログラムを実行すると、エラーにTensorFlowモデルRestore ValueError - 少なくとも2つの変数が同じ名前を持っています

とValueErrorを与える:少なくとも2つの変数が同じ名前があります。Variable_2 /アダム

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

答えて

2

をすでにロードされているグラフは、推論のために必要なすべての変数を持っています。保存されたグラフからaccuracyのようなテンソルをロードする必要があります。あなたのケースでは、同じ変数が外側に宣言されています。これはグラフの変数と矛盾します。

トレーニング中に、テンソルaccuracyの名前をname='accuracy'とすると、get_tensor_by_name('accuracy:0')を使用してグラフからロードできます。あなたの例では、入力テンソルxyもグラフからロードする必要があります。あなたのコードは次のようになります:

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

トレーニング機能(保存モデル)とテスト機能(復元モデル)は異なるはずですか?彼らは同じ機能を持つことはできませんか? –

+0

トレーニングとテストを同じグラフで同じ時間に行うことができます。しかし、あなたがそれをしているときに別のグラフを作ってはいけません。あなたのコードでは、グラフのすべての読み込みを削除し、デフォルトのグラフの予測精度を直接実行します。 –

+0

私は予測変数を見ることができます、私はモデルでそれを保存することができません、これらは私が使用しなければならないlogitsですが、助けてください助けてください –

関連する問題