2016-05-06 13 views
9

Tensör akışına birden fazla büyük veri kümesini yerleştirmenin doğru yolu nedir?Tensorflow içindeki büyük tren/validasyon/test veri kümelerini okuyun

Sırasıyla tren, doğrulama ve test için üç büyük veri kümem (dosya) sahibim. Tf.train.string_input_producer ile antrenman setini başarıyla yükleyebilir ve tf.train.shuffle_batch nesnesine beslerim. Sonra, modelimi optimize etmek için yinelemeli olarak toplu veri alabilirim.

Ancak, doğrulama kümemi aynı şekilde yüklemeye çalışırken takılı kaldım, program "OutOfRange Error" deyip, string_input_producer içinde num_epoch'ları bile ayarlamadım.

Herhangi biri üzerinde ışık tutabilir mi? Ayrıca bunun yanı sıra tensorflow'da eğitim/doğrulama yapmak için doğru yaklaşımın ne olduğunu düşünüyorum. Aslında, büyük bir veri setinde hem tren hem de test yapan herhangi bir örnek görmedim (çok araştırdım). Benim için çok garip ...

Aşağıdaki kod pasajı. tanımlanmış op u'batch' Neden Olduğu

def extract_validationset(filename, batch_size): 
    with tf.device("/cpu:0"): 
    queue = tf.train.string_input_producer([filename]) 
    reader = tf.TextLineReader() 
    _, line = reader.read(queue) 

    line = tf.decode_csv(...) 
    label = line[0] 
    feature = tf.pack(list(line[1:])) 

    l, f = tf.train.batch([label, feature], batch_size=batch_size, num_threads=8) 
    return l, f 

def extract_trainset(train, batch_size): 
    with tf.device("/cpu:0"): 
    train_files = tf.train.string_input_producer([train]) 
    reader = tf.TextLineReader() 
    _, train_line = reader.read(train_files) 

    train_line = tf.decode_csv(...) 

    l, f = tf.train.shuffle_batch(..., 
    batch_size=batch_size, capacity=50000, min_after_dequeue=10000, num_threads=8) 
    return l, f 

.... 

label_batch, feature_batch = extract_trainset("train", batch_size) 
label_eval, feature_eval = extract_validationset("test", batch_size) 

with tf.Session() as sess: 
    tf.initialize_all_variables().run() 
    coord = tf.train.Coordinator() 
    threads = tf.train.start_queue_runners(coord=coord) 

    # Loop through training steps. 
    for step in xrange(int(num_epochs * train_size) // batch_size): 
    feature, label = sess.run([feature_batch, label_batch]) 
    feed_dict = {train_data_node: feature, train_labels_node: label} 

    _, l, predictions = sess.run([optimizer, loss, evaluation], feed_dict=feed_dict) 

    # after EVAL_FREQUENCY steps, do evaluation on whole test set 
    if step % EVAL_FREQUENCY == 0: 
     for step in xrange(steps_per_epoch): 
     f, l = sess.run([feature_eval, label_eval]) 
     true_count += sess.run(evaluation, feed_dict={train_data_node: f, train_labels_node: l}) 

    print('Precision @ 1: %0.04f' % true_count/num_examples) 

<!---- ERROR ----> 
tensorflow.python.framework.errors.OutOfRangeError: FIFOQueue '_5_batch/fifo_queue' is closed and has insufficient elements (requested 334, current size 0) 
[[Node: batch = QueueDequeueMany[component_types=[DT_FLOAT, DT_FLOAT], timeout_ms=-1, _device="/job:localhost/replica:0/task:0/cpu:0"](batch/fifo_queue, batch/n)]] 

:

cevap

1

Bu belki geç ama aynı problem vardı. Benim durumumda aptalca sonra oturum çağıran oldu. Ben coord.request_stop(), coord.join_threads() ile dükkanı kapalı vardı.

Belki de "tren" kodunuzda çalıştırılan coord.request_stop() gibi bir şey var, doğrulama verilerinizi yüklemeye çalıştığınız zaman için kuyrukları kapatabilirsiniz.

0

Ben num_epochs = deneyin deneyin, işe yaradı.