2016-01-22 45 views
6

Ho installato una CNN in Tensorflow dove ho letto i miei dati con TFRecordReader. Funziona bene, ma mi piacerebbe fare un po 'più di pre-elaborazione e incremento dei dati rispetto alle funzioni tf.image. Mi piacerebbe in particolare fare un ridimensionamento randomizzato.Preprocesso di un tensore Tensorflow in Numpy

È possibile elaborare un tensore Tensorflow in Numpy? O devo abbandonare TFRecordReader e preferisco eseguire tutte le operazioni di pre-elaborazione in Numpy e feed data utilizzando feed_dict? Sospetto che il metodo feed_dict sia lento durante l'allenamento sulle immagini, ma potrei sbagliarmi?

+0

'feed_dict' e' py_func' copia i dati tra il runtime TF e Python usando 'memcpy' a thread singolo, quindi potresti ottenere una velocità di trasferimento di 2 GB/s che non dovrebbe essere un collo di bottiglia per set di dati come ImageNet. È più probabile che la lentezza si verifichi nella fase di preelaborazione personalizzata –

risposta

11

Se è possibile creare una pipeline I/O personalizzata che recuperi i risultati intermedi da TensorFlow utilizzando uno o più thread, applica la logica Python arbitraria e quindi li inoltra in una coda per l'elaborazione successiva. Il programma risultante sarebbe un po 'più complicato, ma ti suggerisco di guardare lo threading and queues HOWTO per informazioni su come iniziare.


C'è un sperimentale caratteristica che potrebbe rendere questo più facile, se si install from source.

Se si è già costruito un oleodotto di pre-elaborazione utilizzando ops tensorflow, il modo più semplice per aggiungere un po 'di codice Python usanza è quella di utilizzare l'operatore tf.py_func(), che prende una lista di Tensor oggetti, e una funzione Python che mappa uno o più NumPy matrici su uno o più array NumPy.

Ad esempio, supponiamo che tu abbia una pipeline come questo:

reader = tf.TFRecordReader(...) 
image_t = tf.image.decode_png(tf.parse_single_example(reader.read(), ...)) 

... si potrebbe usare tf.py_func() di applicare alcuni di elaborazione personalizzata NumPy come segue:

from scipy import ndimage 
def preprocess(array): 
    # `array` is a NumPy array containing. 
    return ndimage.rotate(array, 45) 

image_t = tf.py_func(preprocess, [image_t], [tf.float32]) 
+0

Grazie! Solo per altri lettori: per poter eseguire ulteriori elaborazioni, ad esempio tramite 'tf.train.shuffle_batch', ho dovuto rimodellare i risultati di' tf.py_func', che ha senso. – burk

+0

Hmm, ora sto avendo qualche problema nell'estrarre i risultati della funzione. Lo chiamo come 'n1, n2, n3 = tf.py_func (get_triplet, [orig_tensor, truth_tensor], [tf.float32, tf.float32, tf.float32])', e ho controllato che entri nella funzione, e restituisce 3 array NumPy float32, tuttavia ottengo l'errore 'tensorflow/python/lib/core/py_func.cc: 299] Unimplemented: tipo numpy non supportato 17' prima che tf.py_func' finisca. Qualche idea? – burk

+0

Beh, penso di aver capito, avevo bisogno di restituire '[n1, n2, n3]' dalla mia funzione Python. – burk

Problemi correlati