2016-01-22 15 views
6

TFRecordReaderでデータを読み込むTensorflowにCNNを設定しました。それはうまく動作しますが、私はtf.image関数よりも前処理とデータ拡張をいくつか行いたいと思っています。私は特にランダム化されたスケーリングをやりたいNumpyでTensorflowテンソルを前処理する

NumpyでTensorflowテンソルを処理することは可能ですか?または、TFRecordReaderを削除して、Numpyですべての前処理を行い、feed_dictを使用してデータをフィードする必要がありますか?私はfeed_dictメソッドが画像上で訓練するときに遅いと思うが、間違っているかもしれない?

+0

'feed_dict'と' py_func'はシングルスレッドの 'memcpy'を使ってTFとPythonランタイム間でデータをコピーするので、ImageNetのようなデータセットのボトルネックにはならない2GB/sの転送速度が得られるかもしれません。カスタムプリプロセス段階で遅い可能性があります –

答えて

11

中間結果を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]) 
+0

ありがとう!他の読者のために:例えば 'tf.train.shuffle_batch'を通してさらに処理することができるようにするためには、' tf.py_func'の結果を再構成しなければなりませんでした。 – burk

+0

ええと、今私は機能の結果を抽出するいくつかの問題を抱えています。私は 'n1、n2、n3 = tf.py_func(get_triplet、[orig_tensor、truth_tensor]、[tf.float32、tf.float32、tf.float32])'のように呼びます。 3 float32 NumPy配列を返しますが、 'tf.py_func'が終了する前に' tensorflow/python/lib/core/py_func.cc:299] Unimplemented:サポートされていないnumpy型17'というエラーが出ます。何か案は? – burk

+0

さて、私はそれを理解したと思う、私はPythonの関数から '[n1、n2、n3]'を返す必要があった。 – burk

関連する問題