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])
'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 –