2016-03-26 12 views
6

Sto addestrando una CNN con TensorFlow per applicazioni di immagini mediche.Il tempo di elaborazione aumenta dopo ogni iterazione (TensorFlow)

Dato che non ho molti dati, sto provando ad applicare modifiche casuali al mio gruppo di addestramento durante il ciclo di addestramento per aumentare artificialmente il mio set di dati di addestramento. Ho fatto la seguente funzione in uno script diverso e lo chiamo il mio lotto di formazione:

def randomly_modify_training_batch(images_train_batch, batch_size): 

    for i in range(batch_size): 
     image = images_train_batch[i] 
     image_tensor = tf.convert_to_tensor(image) 

     distorted_image = tf.image.random_flip_left_right(image_tensor) 
     distorted_image = tf.image.random_flip_up_down(distorted_image) 
     distorted_image = tf.image.random_brightness(distorted_image, max_delta=60) 
     distorted_image = tf.image.random_contrast(distorted_image, lower=0.2, upper=1.8) 

     with tf.Session(): 
      images_train_batch[i] = distorted_image.eval() # .eval() is used to reconvert the image from Tensor type to ndarray 

return images_train_batch 

Il codice funziona bene per l'applicazione di modifiche alle mie immagini.

Il problema è:

Dopo ogni iterazione del mio ciclo di formazione (+ feedfoward backpropagation), l'applicazione di questa stessa funzione per il mio prossimo gruppo di formazione in costante richiede 5 secondi in più rispetto all'ultima volta.

Ci vuole circa 1 secondo per elaborare e raggiungere oltre un minuto di elaborazione dopo un po 'più di 10 iterazioni.

Quali sono le cause di questo rallentamento? Come posso impedirlo?

(Sospetto qualcosa con "distorted_image.eval()" ma non ne sono del tutto sicuro. Sto aprendo una nuova sessione ogni volta? TensorFlow non è in grado di chiudere automaticamente la sessione mentre utilizzo in un "con tf .Session() "block?)

+0

Possibile duplicato di [TensorFlow: prestazioni lente quando si ottengono gradienti negli input] (http://stackoverflow.com/questions/36245481/tensorflow-slow-performance-when-getting-gradients-at-inputs) – etarion

risposta

6

Si chiama quel codice in ogni iterazione, quindi ogni iterazione si aggiunge queste operazioni al grafico. Tu non vuoi farlo. Si desidera creare il grafico all'inizio e nel ciclo di allenamento solo eseguirlo. Inoltre, perché hai bisogno di convertire nuovamente in ndimage in seguito, invece di mettere le cose nel tuo grafico TF una volta sola e usare solo i tensori fino in fondo?

+0

I convert back le mie immagini su ndarray per essere in grado di visualizzarle con matplotlib.pyplot. Forse sono troppo nuovo per TensorFlow, ma ho sentito che TensorBoard non è il modo più conveniente per visualizzare in modo selettivo i miei set di dati. – Julep

+1

@Julep Se necessario, puoi ancora ottenere l'immagine anche senza "spezzare la catena tensoriale" richiedendo il risultato del tensore dell'immagine nel tuo ciclo di allenamento (probabilmente hai qualcosa come sess.run ([train_op, loss ]) - se chiedi anche il batch di input, lo ottieni come narray e puoi visualizzarlo in quel punto. – etarion