中間結果を1つ以上のスレッドを使用してTensorFlowからフェッチするカスタムI/Oパイプラインを作成し、任意のPythonロジックを適用し、その後の処理のためにキューにフィードします。結果として得られるプログラムはやや複雑になりますが、開始方法についてはthreading and queues HOWTOをご覧ください。
あなたinstall from source場合、これを簡単にするかもしれない実験機能があります。
すでにTensorFlowのOPSを使用して前処理パイプラインを構築している場合は、いくつかのカスタムPythonコードを追加する最も簡単な方法は、Tensor
オブジェクトのリストを取りtf.py_func()
オペレータ、および1つのまたは複数のnumpyのをマップするPythonの関数を使用することです配列を1つまたは複数のNumPy配列に変換します。
たとえば、あなたがこのようなパイプラインを持っているとしましょう:次のようにいくつかのカスタムnumpyの処理を適用するためにtf.py_func()
を使用することができます...
reader = tf.TFRecordReader(...)
image_t = tf.image.decode_png(tf.parse_single_example(reader.read(), ...))
を:
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'と' py_func'はシングルスレッドの 'memcpy'を使ってTFとPythonランタイム間でデータをコピーするので、ImageNetのようなデータセットのボトルネックにはならない2GB/sの転送速度が得られるかもしれません。カスタムプリプロセス段階で遅い可能性があります –