2016-08-01 217 views
1

我已经构建了一个与CIFAR10相同的iamge格式的卷积神经网络,目前正在尝试评估它,但是,我无法获得我的代码来评估文件中的所有图像,而且我只能阅读第一张图片。即使当我调用一个循环时,它只会一遍又一遍地打印结果。我也在单张图片上进行过测试。Tensorflow评估:评估所有图像

我的代码如下所示:

import tensorflow as tf 

import main 
import Process 
import Input 

eval_dir = "/Users/Zanhuang/Desktop/NNP/model.ckpt-250" 
checkpoint_dir = "/Users/Zanhuang/Desktop/NNP/checkpoint" 


def evaluate(): 
    with tf.Graph().as_default() as g: 
    images, labels = Process.eval_inputs() 
    forward_propgation_results = Process.forward_propagation(images) 
    init_op = tf.initialize_all_variables() 
    saver = tf.train.Saver() 
    for i in range(100): 
     top_k_op = tf.nn.in_top_k(forward_propgation_results, labels, 1) 

    with tf.Session(graph = g) as sess: 
    sess.run(init_op) 
    tf.train.start_queue_runners(sess=sess) 
    saver.restore(sess, eval_dir) 

    print(sess.run(top_k_op)) 

def main(argv = None): 
    evaluate() 

if __name__ == '__main__': 
    tf.app.run() 

下面那就是Process.Input()代码,也可以帮助有助于问题的解决。

def eval_inputs(): 
    data_dir = FLAGS.data_dir 
    images, labels = Input.eval_inputs(data_dir = data_dir, batch_size = 1) 
    return images, labels 
+0

你的循环代码是什么样的? – mrry

+0

[对]但打印了100次以上。这是不可能的。我认为它一遍又一遍地计算相同的标签。 –

+0

你可以在你的问题中包含循环代码吗? – mrry

回答

1

评价的所有图像,你必须把循环围绕sess.run()电话:

def evaluate(): 
    with tf.Graph().as_default() as g: 
    images, labels = Process.eval_inputs() 
    forward_propgation_results = Process.forward_propagation(images) 
    init_op = tf.initialize_all_variables() 
    saver = tf.train.Saver() 

    # Only create a single `top_k_op`. 
    top_k_op = tf.nn.in_top_k(forward_propgation_results, labels, 1) 

    with tf.Session(graph = g) as sess: 
    sess.run(init_op) 
    tf.train.start_queue_runners(sess=sess) 
    saver.restore(sess, eval_dir) 

    # Evaluate the first 100 images in the `eval_inputs()`. 
    for i in range(100): 
     print(sess.run(top_k_op)) 

在的问题,您创建相同的运算100倍。这相当于在相同的输入上调用同一个函数100次,这就解释了每次结果相同的原因。

eval_inputs()函数就像一个Python生成器,它在每次调用sess.run(top_k_op)时返回一个不同的评估输入示例。因此,如果您将sess.run(top_k_op)包装在一个循环中,您将获得不同示例的评估结果。

+0

非常感谢您的回复,但恐怕同样的错误仍在发生。统计上不可能的是,所有的100个例子最终都是准确的。另一个文件中的所有示例都是错误的。 –

+0

也许在Process.eval_inputs()函数中有一个错误,导致它每次都返回相同的示例。尝试在循环中执行print(sess.run([labels,top_k_op]))'来查看标签是否正在从一个示例更改为下一个示例。 – mrry

+0

好的。值是相同的。 –