2016-07-07 4 views
0

私はオーディオのシーケンス学習に取り組んでおり、オーディオデータをロードする必要があります。現在私はtf.decode_csvに依存して、ファイル名とラベルのペアをTensorflowキューにロードしています。しかし、私は実際にファイルを読んで、他のPythonライブラリでそれを処理したいと思います。しかし、CSVデコーダ/デキュー操作は常に他のPythonライブラリとの相互運用性を不可能にするテンソル操作を返します。 TFのストリーミング操作を外部のライブラリとどのように組み合わせるかについてのアイデアはありますか? sound_pathデータローディングのために通常のPythonとキュー操作を混在させる

file_path = tf.train.string_input_producer([csv_path]) 
reader = tf.TextLineReader() 
_, csv_content = reader.read(file_path) 

decode_op = tf.decode_csv(csv_content, record_defaults=[[""], [0]]) 
enqueue_ops.append(examples_queue.enqueue(decode_op)) 

tf.train.queue_runner.add_queue_runner(
    tf.train.queue_runner.QueueRunner(examples_queue, enqueue_ops)) 
... 
sound_path, label_index = examples_queue.dequeue() <--- !!!! 
data = read_wav(sound_path) 

は、DTYPE stringのテンソルであるが、私は実際に/キャストread_wav LIBとの互換性のためのPython文字列に変換することができません。

アイデア?

答えて

3

のは、あなたのread_wav関数は、引数としてファイル名(文字列)を期待して、float値(復号されたファイル)のnumpyの配列を返すと仮定しましょう。

read_wavの計算は、テンソルフローグラフの外側で、Pythonで行われます。 sess.run(sound_path)を呼び出すのではなく、たくさんの実行(ファイル名ごとに1つずつ)を呼び出す代わりに、tf.py_funcを使用してPythonコードをTensorFlowラッパーにカプセル化することができます。出力のタイプをtf.py_funcに指定する必要があります。

sound_path, label_index = examples_queue.dequeue() 
data = tf.py_func(your_function, [sound_path], [tf.float32]) 

あなたの関数は、入力としてnumpy配列を取る必要があり、numpy配列を返します。

def your_function(sound_path): 
    sound_path = sound_path[0] 
    data = read_wav(sound_path) # should be a numpy array 
    return data 
+0

私は 'tf.py_func'を知りませんでした:O優れた答え、+1 – nessuno

+0

ええ、それはカスタム操作を追加するもっとも簡単な方法ですが、CPU上でのみ計算されるので(GPUからデータを転送する必要がありますそれ) –

+0

私は関数を 'tf.py_func'としてラップしましたが、入力引数はまだCSVDecode Tensorです。どのように文字列にキャストできますか?操作/機能定義の時点では、セッションはまだ開始されていません。つまり、入力引数はnumpyデータ型ではありません。 – Tom

0

テンソルの内容を抽出するには、セッションに「実行する」必要があります。

sound_path_value = sess.run(sound_path)

+0

私が理解できないのは、上記の呼び出しが行われるまでにまだ実行されていない理由です。次のように私のセットアップは次のとおりです。 は、データローダー定義 - >コンバージョン層への入力として設定 - >オプティマイザにモデルを追加 - > 'sess.run(オプティマイザ)' を今、データローダーは、その最初のものですが定義される。純粋なテンソル演算を使用すると、 'sess.run'がメインのトレーニングループで評価され、すべてが正常になるまでプレースホルダとして機能します。 つまり、データローダーは、モデル、オプティマイザ、またはセッションがインスタンス化される前に定義されています。 – Tom

関連する問題