2017-01-24 17 views
2

我对Tensorflow MNIST教程做了一点改动。 原始代码(fully_connected_feed.py,行194-202):Tensorflow中调用数据之间的数据更改

checkpoint_file = os.path.join(FLAGS.log_dir, 'model.ckpt') 
saver.save(sess, checkpoint_file, global_step=global_step) 
#Evaluate against the training set. 
print('Training Data Eval:') 
do_eval(sess, 
     eval_correct, 
     images_placeholder, 
     labels_placeholder, 
     data_sets.train) 

我只是增加了一个评价:

checkpoint_file = os.path.join(FLAGS.log_dir, 'model.ckpt') 
saver.save(sess, checkpoint_file, global_step=global_step) 
print('Something strange:') 
do_eval(sess, eval_correct, images_placeholder,labels_placeholder, 
     data_sets.train) 
#Evaluate against the training set. 
print('Training Data Eval:') 
do_eval(sess, 
     eval_correct, 
     images_placeholder, 
     labels_placeholder, 
     data_sets.train) 

此评价的结果接近,但不相同(数字变化从发射到发射):

Something strange: 
    Num examples: 55000 Num correct: 49218 Precision @ 1: 0.8949 
Training Data Eval: 
    Num examples: 55000 Num correct: 49324 Precision @ 1: 0.8968 

这怎么可能? UPD:加入连结tensorflow github上: https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/tutorials/mnist

+0

不知道张量流量,但这不应该发生一般。 do_eval是否有意想不到的副作用?你检查过文件吗? –

+0

我不知道那些副作用可能来自哪里。 do_eval代码只能调用mnist.py中的evaluate()方法,并且该方法不会更改任何张量。 –

+0

看起来很奇怪。我对tensorflow并不是很熟悉,但我没有看到这种方式可以被认为是理智的行为(我想do_eval应该只是转发样本,并在不改变网络的情况下计算精度)。 –

回答

3

实际上do_eval()函数确实有一个副作用,因为data_sets.trainstateful DataSet object包含当前_index_in_epoch构件,其上的每个呼叫前进到DataSet.next_batch()(即,在fill_feed_dict() )。

就其本身而言,这其实不应该足以给非确定性结果,但还有约DataSet.next_batch()导致非确定性另外两个细节:

  1. 每当一个新的时代已启动,示例为randomly shuffled

  2. 当数据集reaches the end of an epoch,数据集重置为开始和最后的num_examples % batch_size示例被丢弃。由于随机洗牌,每次随机丢弃一批实例,导致非确定性结果。

由于代码的结构(与DataSet训练和测试之间共享)的方式,它的棘手使代码确定性。 DataSet类的记录很少,但这种行为令人惊讶,所以我会考虑filing a GitHub issue这个问题。

+2

非常感谢!我发现了一种确定性计算的方法 - 只需将batch_size设置为等于数据集中示例的数量即可。因为它只用于调试。 –