Tensorflow 数据集 .map() API
Tensorflow Dataset .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)
- 如果我有一个使用张量操作的 parse_image() 函数 - 应该
这是主图的一部分?按照示例集 in Google's own audio TF tutorial,看起来他们创建了一个单独的图形!这不会破坏使用 Tensorflow 使事情变得更快的意义吗?
- 只要任何一行不是来自 tensorflow 库,我都可以使用 tf.py_func() 吗?同样,我想知道性能影响是什么以及何时应该使用它...
谢谢!
当您使用 Dataset.map(map_func)
时,TensorFlow 为函数 map_func
中创建的所有操作定义了一个子图,并安排在与图的其余部分相同的会话中高效地执行它。几乎不需要在 map_func
中创建 tf.Graph
或 tf.Session
:如果您的解析函数由 TensorFlow 操作组成,这些操作可以直接嵌入到定义输入管道。
使用 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
包含您要应用于每个元素的 non-TensorFlow 操作,您应该将它们包装在 tf.py_func()
(or Dataset.from_generator()
中,如果数据生成过程定义在 Python逻辑)。主要的性能影响是 tf.py_func()
中的任何代码 运行 都受制于全局解释器锁,因此我通常建议尝试为任何对性能至关重要的内容寻找原生的 TensorFlow 实现。
关于这个的几个问题
当我想在 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)
- 如果我有一个使用张量操作的 parse_image() 函数 - 应该 这是主图的一部分?按照示例集 in Google's own audio TF tutorial,看起来他们创建了一个单独的图形!这不会破坏使用 Tensorflow 使事情变得更快的意义吗?
- 只要任何一行不是来自 tensorflow 库,我都可以使用 tf.py_func() 吗?同样,我想知道性能影响是什么以及何时应该使用它...
谢谢!
当您使用 Dataset.map(map_func)
时,TensorFlow 为函数 map_func
中创建的所有操作定义了一个子图,并安排在与图的其余部分相同的会话中高效地执行它。几乎不需要在 map_func
中创建 tf.Graph
或 tf.Session
:如果您的解析函数由 TensorFlow 操作组成,这些操作可以直接嵌入到定义输入管道。
使用 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
包含您要应用于每个元素的 non-TensorFlow 操作,您应该将它们包装在 tf.py_func()
(or Dataset.from_generator()
中,如果数据生成过程定义在 Python逻辑)。主要的性能影响是 tf.py_func()
中的任何代码 运行 都受制于全局解释器锁,因此我通常建议尝试为任何对性能至关重要的内容寻找原生的 TensorFlow 实现。