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: