web-dev-qa-db-ja.com

Tensorflowデータセット.map()API

これについてのいくつかの質問

Tensorflowで次のようなことをしたい場合(WAVファイルをロードしてトレーニング例を作成していると仮定します):

import tensorflow as tf 

def _some_audio_preprocessing_func(filename):
   # ... some logic here which mostly uses Tensorflow ops ...
   with tf.Session(graph=tf.Graph()) as sess:
        wav_filename_placeholder = tf.placeholder(tf.string, [])
        wav_loader = io_ops.read_file(wav_filename_placeholder)
        wav_decoder = contrib_audio.decode_wav(wav_loader, desired_channels=1)
        data = sess.run(
                [wav_decoder],
                feed_dict={wav_filename_placeholder: filename})
        return data

dataset = tf.data.Dataset.list_files('*.wav')
dataset = dataset.map(_some_preprocessing_func)
  1. テンソル演算を使用するparse_image()関数がある場合、これをメイングラフの一部にする必要がありますか?サンプルセット Google独自のオーディオTFチュートリアル に従うと、別のグラフが作成されているように見えます!これは、Tensorflowを使用して処理を高速化するポイントを台無しにしませんか?
  2. Tensorflowライブラリから1行がない場合はいつでも、tf.py_func()を使用しますか?繰り返しますが、パフォーマンスへの影響は何で、いつこれを使用する必要があるのでしょうか...

ありがとう!

5
lollercoaster

Dataset.map(map_func) を使用すると、TensorFlowは関数_map_func_で作成されたすべての操作のサブグラフを定義し、同じ場所で効率的に実行するように調整しますグラフの残りの部分としてのセッション。 _tf.Graph_内に_tf.Session_または_map_func_を作成する必要はほとんどありません。解析関数がTensorFlow opsで構成されている場合、これらのopsは、を定義するグラフに直接埋め込むことができます。入力パイプライン。

_tf.data_を使用したコードの変更バージョンは次のようになります。

_import tensorflow as tf 
from tensorflow.contrib.framework.python.ops import audio_ops as contrib_audio

def _some_audio_preprocessing_func(filename):
    wav_loader = tf.read_file(filename)
    return contrib_audio.decode_wav(wav_loader, desired_channels=1)

dataset = tf.data.Dataset.list_files('*.wav')
dataset = dataset.map(_some_preprocessing_func)
_

_map_func_に、各要素に適用するTensorFlow以外の操作が含まれている場合は、それらを tf.py_func() (または Dataset.from_generator() 、データ生成プロセスがPythonロジック)で定義されている場合。主なパフォーマンスへの影響は、 tf.py_func()はグローバルインタープリターロックの対象となるため、パフォーマンスが重要なものについては、ネイティブのTensorFlow実装を探すことをお勧めします。

9
mrry