2016-05-06 9 views
9

qual è il modo giusto per caricare più di un set di dati di grandi dimensioni nel flusso del tensore?Leggi big treno/validazione/set di dati di test in tensorflow

Ho tre grandi set di dati (file), per treno, convalidare e testare rispettivamente. Posso caricare con successo il training set su tf.train.string_input_producer, e inserirlo in un oggetto tf.train.shuffle_batch. Quindi posso ottenere iterativamente una serie di dati per ottimizzare il mio modello.

Ma, mi sono bloccato quando ho provato a caricare il mio set di validazione allo stesso modo, il programma continua a dire "Errore OutOfRange" anche se non ho impostato num_epochs in string_input_producer.

Qualcuno può farci delle luci? E oltre a questo, sto pensando anche qual è l'approccio giusto per fare training/validation in tensorflow? In realtà, non ho visto alcun esempio (ho cercato molto) che hanno entrambi allenato e testato su un grande set di dati. È così strano per me ...

Snippet di codice qui sotto.

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

Causato da op u'batch', definita a:

risposta

1

Questo è forse in ritardo ma ho avuto lo stesso problema. Nel mio caso stavo stupidamente chiamando sess.run dopo Avevo chiuso il negozio con coord.request_stop(), coord.join_threads().

Forse hai qualcosa come coord.request_stop() che viene eseguito nel tuo codice "treno", chiudendo le code quando provi a caricare i dati di convalida.

0

Ho provato a impostare num_epochs = Nessuno, ha funzionato.