2017-06-11 2 views
0

Ich habe ein Tensorflow DNN-Modell in mit ich feed_dict verwenden, um den Eingang Training and Test Daten und die Etiketten, die zu ihnen gehört. diese Dinge einfach der wichtigste Teil des Codes zu halten:So verwenden Sie Tensorflow-Warteschlangen in realen Beispiel

def feed_dict(train): 
"""Make a TensorFlow feed_dict: maps data onto Tensor placeholders.""" 
if train == True : 
    xs,ys = next_Training_Batch() 
    drop_out_value = 0.9 
else: 
    #Run a test 
    xs,ys= Testing_Data,Testing_Labels 
    drop_out_value = 1 
return {x:xs,y_:ys,keep_prob:drop_out_value} 
for i in range(max_steps): 
    if i%5 ==0: # Record summarie and Test-set accruracy 
     summary, acc = sess.run([merged,accuracy], feed_dict=feed_dict(False)) 
     test_writer.add_summary(summary,i) 
     #print('Accuracy at steps%s: %s '%(i,acc)) 
    else:# Record train set summaries and train 
     if i%10==0: 
      run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE) 
      run_metadata = tf.RunMetadata() 
      summary, _ = sess.run([merged, train_steps], 
          feed_dict=feed_dict(True), 
          options=run_options, 
          run_metadata=run_metadata) 
      train_writer.add_run_metadata(run_metadata, 'step%03d' % i) 
      train_writer.add_summary(summary, i) 
     else: 
      summary,_ = sess.run([merged, train_steps], feed_dict=feed_dict(True)) 
      train_writer.add_summary(summary,i) 

Ich habe über die TF-Warteschlange zu lesen sind eine Möglichkeit, effizienter zu gestalten, habe ich haben große Schwierigkeiten bekommen sie laufen, hier ist das, was ich habe so weit:

import tensorflow as tf 

''' 
# Both Training.csv and Test.csv include the features values and the and labels as follows : 
Feature0 Feature1 Feature2 Feature3 Feature4 Feature5 ....... ClassID(Labels) onehot 
0.200985 1.000000 0.064534 0.415348 0.005391 1.000000    1000    1 
0.151232 1.000000 0.048849 0.312474 0.007160 1.000000    2001    2 
0.061576 1.000000 0.026125 0.127097 0.017450 1.000000    1000    3 
............................................................................... 
Each file has > 2500 rows 
''' 

fileNames = ["Training.csv","Test.csv"] 
BATCH_SIZE = 20 
number_OF_features = 450 

def batch_generator(fileNames): 
    fileNames_queue = tf.train.string_input_producer(fileNames) 
    reader = tf.TextLineReader(skip_header_lines=1) 
    key , values = reader.read(fileNames_queue) 
    record_defaults = [[1.0] for _ in range(number_OF_features)] 
    content = tf.decode_csv(values,record_defaults = record_defaults) 
    features = tf.stack(content[:-2]) 
    labels = content[-1] 
    min_after_dequeue =10 * BATCH_SIZE 
    capacity = 20*BATCH_SIZE 
    # suffle the data 
    data_batch, label_batch = tf.train.shuffle_batch([features, labels], batch_size=BATCH_SIZE, 
    capacity =capacity , min_after_dequeue = min_after_dequeue) 
    return data_batch , label_batch 

with tf.Session() as sess: 
    coord = tf.train.Coordinator() 
    threads = tf.train.start_queue_runners(coord=coord) 
    for _ in range(100): # generating 100 batch 
     sess.run(batch_generator(fileNames)) 
     # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
     # I just don'T get how to proceed from this point 
     # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
     coord.request_stop() 
     coord.join(threads) 

Meine Frage ist, wie kann ich Daten in Zug und Test "feed". Ich habe TF-Dokumente gelesen, aber es hat nicht geholfen.

Ref: Der Code, den ich schrieb basiert dieser auf great tutorials

Antwort

1

Was in Ihrem Code fehlt, ist, wie Sie die data_batch und label_batch Tensoren verwenden möchten. Diese Tensoren sind Form (BATCH_SIZE, number_OF_features) (bzw. (BATCH_SIZE, 1).) Nach Diesem Stück Code (unter der Annahme number_OF_features == len(content)-1):

features = tf.stack(content[:-2]) 
labels = content[-1] 
... 
data_batch, label_batch = tf.train.shuffle_batch([features, labels], batch_size=BATCH_SIZE,...) 

und die DOC von tf.train.shuffle_batch (siehe code):

Ein Eingang Tensor mit Form [x, y, z] wird ausgegeben als Tensor mit Form [batch_size, x, y, z].

Zum Beispiel könnten Sie eine Funktion implementieren, die als Argumente die data_batch und label_batch nehmen würde und schaffen und eine cross_entropy op zurückzukehren. Und dann könnten Sie dieses Op verwenden, um Ihr Modell mit einer GradientDescentOptimizer zu trainieren.

Ihre cross_entropy op und damit Ihre train_op auf Ihrer data_batch und label_batch abhängen. Wann immer Sie die Session anweisen, train_op auszuführen, wird es versuchen, einen neuen Stapel aus Ihrer Datenwarteschlange durch data_batch und label_batch zu entfernen.

Zum Beispiel:

# Let's create the batch op 
data_batch , label_batch = batch_generator(fileNames) 

# Let's use the batch op 
cross_entropy = get_cost_op(data_batch, label_batch) 
train_op = tf.train.GradientDescentOptimizer().minimize(cross_entropy) 


# We're done with the creation of our model so let's train it. 
# create NUM_THREADS to do enqueue 
qr = tf.train.QueueRunner(queue, [enqueue_op] * NUM_THREADS) 
with tf.Session() as sess: 
    # create a coordinator, launch the queue runner threads. 
    coord = tf.train.Coordinator() 
    threads = tf.train.start_queue_runners(coord=coord) 
    for step in xrange(100): # do to 100 iterations 
     if coord.should_stop(): 
      break 
     sess.run(train_op) 
    coord.request_stop() 
    coord.join(enqueue_threads) 
+0

1. Dank für die Beantwortung, aber wie separates Test und Training-Set, brauche ich zwei Warteschlangen? – Engine

+0

Es ist wirklich an Sie, aber die einfachste und 2 verschiedene Warteschlangen (telefonisch vom 'batch_generator' zweimal) verwenden könnte in der Tat sein, um Ihre Daten in zwei Listen von Dateien zu trennen (für die Zwecke Training und Test). – npf

+0

Siehe zum Beispiel Abschnitt Multiple Input-Pipelines von https://www.tensorflow.org/programmers_guide/reading_data – npf