2016-05-06 8 views
9

Was ist der richtige Weg, um mehr als einen großen Datensatz in den Tensorfluss zu laden?Lesen Sie große Zug-/Validierungs-/Testdatensätze in Tensorflow

Ich habe drei große Datensätze (Dateien), für Zug, Validierung und Test jeweils. Ich kann den Trainingssatz erfolgreich über tf.train.string_input_producer laden und in ein tf.train.shuffle_batch-Objekt eingeben. Dann kann ich iterativ Batch von Daten erhalten, um mein Modell zu optimieren.

Aber ich steckte fest, als ich versuchte, meinen Validierungssatz auf die gleiche Weise zu laden, das Programm sagte immer "OutOfRange Error", selbst wenn ich num_epochs nicht in string_input_producer gesetzt hatte.

Kann jemand Licht darauf werfen? Und außerdem denke ich darüber nach, was ist der richtige Ansatz für Training/Validierung im Tensorflow? Tatsächlich habe ich keine Beispiele gesehen (ich habe viel gesucht), die sowohl trainieren als auch auf einem großen Datensatz testen. Es ist so seltsam für mich ...

Code-Schnipsel unten.

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

Verursacht durch op u'batch‘, definiert unter:

Antwort

1

Dies ist vielleicht spät, aber ich hatte das gleiche Problem. In meinem Fall rief ich töricht sess.run nach Ich hatte Shop mit coord.request_stop(), coord.join_threads() geschlossen.

Vielleicht haben Sie etwas wie coord.request_stop(), das in Ihrem "train" -Code ausgeführt wird und die Warteschlangen beim Versuch, Ihre Validierungsdaten zu laden, schließt.

0

Ich versuche set num_epochs = None, es hat funktioniert.

Verwandte Themen