0

Ich benutze Keras mit Tensorflow für Deep Learning. Ich arbeite mit etwas großen Datensätzen (Bildern), daher konnte ich nicht den gesamten Datensatz auf einmal laden, stattdessen lade ich Stapel von 8000 Bildern und benutze model.fit() für das Training (Code-Ausschnitt unten).Gibt es eine Möglichkeit, Daten parallel zu laden, wenn GPU Computing?

for epochs in range(50): # number of epochs 
    for i in range(num_batches): # 5 batches with 8000 images each 
     #### load the data here (train, val) 
     history_train = model.fit(train_image, train_gt, batch_size=16, epochs=1, verbose=1, shuffle=False, validation_data=(val_image,val_gt)) 
     if history_train.history['val_loss'][0] < total_val_loss: 
      model.save_weights(weights_file) 
      total_val_loss = history_train.history['val_loss'][0] 

Sicherlich kein effizienter Weg. Es braucht viel Zeit, um einen Stapel (von 8000 Bildern) zu laden, als die Zeit zu lernen (Laufzeit jeder Epoche). Gibt es einen besseren Weg, wie ich das machen könnte? oder eine andere Möglichkeit, es zu optimieren? Kann ich Daten (für die nächste Epoche) parallel laden, wenn die Berechnung (GPU) abgeschlossen ist, damit ich die Ladezeit sparen kann?

Antwort

0

Ja, können Sie dies tun, indem fit_generator statt fit Nutzung und Weitergabe der Argumente use_multiprocessing=True und workers=n (wobei n die Anzahl der Worker-Threads ist). Um Ihre Datenmenge zu laden, müssen Sie eine Generatormethode erstellen, die jede Datenmenge liefert. Es soll wie folgt aussehen (Ich gehe davon aus, dass Ihre Eingabe-Dataset ein 4D-Array von Form (NUM_IMAGES, Höhe, Breite, Kanäle), so anzupassen, je nach Bedarf):

def generator(dataset_x, dataset_y): 
    while True: 
     for i in range(num_batches): 
      yield dataset_x[i*8000:(i+1)*8000, :, :, :], dataset_y[i*8000:(i+1)*8000, :] 

Beachten Sie, dass diese Chargen zurück der Größe 8000 - Sie könnten es schneiden müssen mehr mit einer anderen Schleife nach unten, die Chargengrößen von, sagen wir, 16 Und für das Training des Modells zurück:

history_train = model.fit_generator(generator=generator, steps_per_epoch=5, epochs=50, use_multiprocessing=True, workers=16, validation_data=val_generator, validation_steps=5) 

vielleicht möchten Sie machen 2 Generatoren: eine für Trainingsdaten und eine für Validierungsdaten. Keras könnte Sie auch warnen, wenn Sie Multiprocessing mit mehreren Arbeitern verwenden möchten - Sie sollten Ihre Generatoren threadsicher machen, indem Sie sie kapseln oder keras.utils.Sequence verwenden (mehr dazu in der Keras-Dokumentation).

0

Ich habe einen Datensatz von 40 GB, so dass ich alle Bilder im Speicher laden kann. Daher muss ich chargenweise laden. Der Generator teilt hier den Datensatz in die 'N' Anzahl der Chargen auf, aber es müssen Bilder in den Speicher geladen werden.

Gibt es eine Methode in keras etwas ähnliches zu folgenden tensorflow Code zu tun:

path_queue = tf.train.string_input_producer(input_paths, shuffle= False) 
paths, contents = reader.read(path_queue) 
inputs = decode(contents) 
input_batch = tf.train.batch([inputs], batch_size=2) 

ich diese Methode bin mit Eingaben in tensorflow serialisiert, aber ich weiß nicht, wie diese Aufgabe in Keras zu erreichen.

Verwandte Themen