2017-07-19 4 views
1

Ich versuche einige Regressionsmodelle auf GPU auszuführen. Während ich eine sehr niedrige GPU-Auslastung von bis zu 20% bekomme. Nach dem Durchlaufen des Codes,Numpy-Matrix in Batches im Tensorflow lesen

for i in range(epochs): 
    rand_index = np.random.choice(args.train_pr, 
     size=args.batch_size) 
    rand_x = X_train[rand_index] 
    rand_y = Y_train[rand_index] 

Ich verwende diese drei Zeilen für die Auswahl einer zufälligen Batch für jede Iteration. Also, ich wollte fragen, wann das Training läuft, kann ich noch einen Batch für die nächste Iteration vorbereiten?

Ich arbeite an einem Regressionsproblem und nicht an einem Klassifizierungsproblem. Ich habe bereits in Tensorflow Threading gesehen, aber die Beispiele nur für Bilder gefunden und es gibt kein Beispiel für eine große Matrix der Größe 100000X1000, die für das Training verwendet wird.

+0

Es ist ein Duplikat auf die Frage: https://stackoverflow.com/questions/45110098/tensorflow-next-batch-function-of-np-array/45110647#45110647 –

Antwort

0

Dies ist ein guter Anwendungsfall für Generatoren. Sie können eine Generatorfunktion einrichten, um Segmente Ihrer numpy Matrizen jeweils zu einem Zeitpunkt zu teilen. Wenn Sie ein Paket wie Keras verwenden, können Sie den Generator direkt an die train_on_batch-Funktion liefern. Wenn Sie es vorziehen Tensorflow direkt zu verwenden, können Sie verwenden:

sess = tf.Session() 
sess.run(init) 
batch_gen = generator(data) 
batch = batch_gen.next() 
sess.run([optimizer, loss, ...], feed_dict = {X: batch[0], y: batch[1]}) 

Hinweis: I Platzhalter für den Optimierer und Verlust verwende, müssen Sie sich mit Ihren Definitionen ersetzen. Beachten Sie, dass Ihr Generator ein (x, y) Tupel ergeben sollte. Wenn Sie mit Generator Ausdrücke nicht vertraut sind, gibt es viele Beispiele online, aber hier sind ein einfaches Beispiel aus der Keras Dokumentation, die zeigen, wie Sie in numpy Matrizen aus einer Datei in Chargen lesen:

def generate_arrays_from_file(path): 
    while 1: 
     f = open(path) 
     for line in f: 
      x, y = process_line(line) 
      yield (x, y) 
     f.close() 

aber auch grundsätzlichen , eine niedrige GPU-Auslastung ist nicht unbedingt ein Hinweis auf ein Problem beim Laden von Batches, sondern eher, dass Ihre Batch-Größe zu klein ist.

0

Sie haben ein großes numpy Array, das auf dem Host-Speicher liegt. Sie möchten es parallel auf der CPU bearbeiten und Chargen an das Gerät senden können. Dies ist ein gutes Szenario für die Verwendung von queues.

Hier ist ein einfaches Beispiel, das einfach wahllos Scheiben eines numpy Array extrahiert (wie Sie) und lassen Sie sich mit Ihren Lieblings-Tool in Python tun Vorverarbeitung:

import numpy as np 
import tensorflow as tf 

def make_batch(x, y, batch_size): 
    rand_index = np.random.choice(x.shape[0], size=batch_size) 
    x_batch, y_batch = x[rand_index], y[rand_index] 
    # Do all your pre-processing here 
    # ... 
    return (x_batch, y_batch) 

x = np.arange(10, dtype=np.float32) 
y = np.arange(10, dtype=np.int32) 
batch_size = 2 
tf_make_batch = tf.py_func(make_batch, [x,y,batch_size], (tf.float32, tf.int32)) 

queue = tf.FIFOQueue(capacity=1000, dtypes=(tf.float32, tf.int32)) 
enqueue_op = queue.enqueue(tf_make_batch) 
inputs = queue.dequeue() 
qr = tf.train.QueueRunner(queue, [enqueue_op] * 4) 
with tf.Session() as sess: 
    coord = tf.train.Coordinator() 
    enqueue_threads = qr.create_threads(sess, coord=coord, start=True) 
    for step in range(10): 
    print(sess.run(inputs)) 
    coord.request_stop() 
    coord.join(enqueue_threads) 

Es hat eine FIFOQueue da Stichproben verwendet bereits passiert in make_batch.

Natürlich, um Multithreading wirklich zu profitieren, sollte make_batch mehr als das Sampling tun. Sie sehen möglicherweise erhebliche Unterschiede, wenn Sie Ihrer Pipeline eine umfangreiche Vorverarbeitung hinzufügen.

+0

Mit dieser Methode kann ich Änderungen an x und y bei bestimmten Schritt? Nehmen wir an, ich verwende eine K-Kreuz-Validierung und ich muss nach einem bestimmten Schritt einige Samples mit einigen anderen Samples austauschen. Ist es möglich? Vielen Dank! –

+0

@ Deepak Ja! Ich habe meine Frage bearbeitet, um den Ort zu markieren, an dem die Vorverarbeitung stattfinden soll. – user1735003

+0

Ich glaube, es gibt einen Fehler im Scripts, da für tf.py_func tf.placeholder eher die Eingabe als ein Numpy-Array sein sollte. Können Sie dies beziehen: https://www.tensorflow.org/api_docs/python/tf/py_func –