2017-10-18 10 views
4

Für mein Projekt habe ich große Mengen von Daten, etwa 60 GB verteilt in NPY-Dateien, von denen jede etwa 1 GB, von denen jede etwa 750k Datensätze und Etiketten enthält.Wie behandelt man große Datenmengen im Tensorflow?

Jeder Datensatz ist ein 345 float32 und die Bezeichnungen sind 5 float32.

Ich lese die Tensorflow-Dataset-Dokumentation und die Queues/Threads-Dokumentation als auch, aber ich kann nicht herausfinden, wie man am besten mit der Eingabe für das Training umgehen und dann wie das Modell und Gewichte für zukünftige Vorhersage speichern.

Mein Modell nach vorne ziemlich gerade ist, sieht es wie folgt aus:

x = tf.placeholder(tf.float32, [None, 345], name='x') 
y = tf.placeholder(tf.float32, [None, 5], name='y') 
wi, bi = weight_and_bias(345, 2048) 
hidden_fc = tf.nn.sigmoid(tf.matmul(x, wi) + bi) 
wo, bo = weight_and_bias(2048, 5) 
out_fc = tf.nn.sigmoid(tf.matmul(hidden_fc, wo) + bo) 
loss = tf.reduce_mean(tf.squared_difference(y, out_fc)) 
train_op = tf.train.AdamOptimizer().minimize(loss) 

Die Art, wie ich mein neuronales Netz trainiere liest die man Dateien auf einmal in einer zufälligen Reihenfolge dann einen neu gemischt numpy Array zu indizieren Sie jede Datei und erstellen Sie jede Charge manuell, um die train_op mit feed_dict zu füttern. Von allem, was ich lese, ist das sehr ineffizient und ich sollte es irgendwie durch Datasets oder Queue und Threads ersetzen, aber wie gesagt, die Dokumentation half nicht.

Also, was ist der beste Weg, um große Datenmengen im Tensorflow zu behandeln?

Auch als Referenz, wurde meine Daten in eine numpy Datei in einem 2 Betriebsschritt gespeichert:

with open('datafile1.npy', 'wb') as fp: 
    np.save(data, fp) 
    np.save(labels, fp) 
+0

Dies ist wahrscheinlich genau das, was Sie suchen: [Daten importieren (mit der 'Dataset' API)] (https://www.tensorflow.org/programs_guide/datasets) –

+0

Mit großen Datensätzen sollten Sie nicht alle passieren es sofort. Verwenden Sie Mini-Batches, um das zu überwinden. Aber darüber hinaus sollten Sie nicht alles in Erinnerung bringen. Verwenden Sie Mini-Stapel. –

+0

Karhy, ich habe die Dataset-Dokumentation gelesen, aber das meiste scheint davon auszugehen, dass die Daten im Speicher vorgeladen sind. Paramdeep, verwende ich Mini-Chargen, das ist nur, wie ich die Daten aus den numpy Dateien laden, dann später mische ich die Daten und manuell Mini-Chargen zu füttern die x und y Platzhalter. Dies ist, was ich versuche, herauszufinden, wie man es effizienter macht. –

Antwort

0

Die Dienstprogramme für npy Dateien in der Tat das gesamte Array im Speicher zuweisen. Ich würde Ihnen empfehlen, alle Ihre numpy Arrays in TFRecords format zu konvertieren und diese Dateien im Training zu verwenden. Dies ist eine der effizientesten Möglichkeiten, große Datenmengen in Tensorflow zu lesen.

Umrechnen in TFRecords

def array_to_tfrecords(X, y, output_file): 
    feature = { 
    'X': tf.train.Feature(float_list=tf.train.FloatList(value=X.flatten())), 
    'y': tf.train.Feature(float_list=tf.train.FloatList(value=y.flatten())) 
    } 
    example = tf.train.Example(features=tf.train.Features(feature=feature)) 
    serialized = example.SerializeToString() 

    writer = tf.python_io.TFRecordWriter(output_file) 
    writer.write(serialized) 
    writer.close() 

Ein vollständiges Beispiel, das mit Bildern beschäftigt found here sein kann.

lesen TFRecordDataset

def parse_proto(example_proto): 
    features = { 
    'X': tf.FixedLenFeature((345,), tf.float32), 
    'y': tf.FixedLenFeature((5,), tf.float32), 
    } 
    parsed_features = tf.parse_single_example(example_proto, features) 
    return parsed_features['X'], parsed_features['y'] 

def read_tfrecords(file_names=("file1.tfrecord", "file2.tfrecord", "file3.tfrecord"), 
        buffer_size=10000, 
        batch_size=100): 
    dataset = tf.contrib.data.TFRecordDataset(file_names) 
    dataset = dataset.map(parse_proto) 
    dataset = dataset.shuffle(buffer_size) 
    dataset = dataset.repeat() 
    dataset = dataset.batch(batch_size) 
    return tf.contrib.data.Iterator.from_structure(dataset.output_types, dataset.output_shapes) 

Das Datenhandbuch found here sein kann.

Verwandte Themen