从数据集 map() 函数调用中生成的图形操作添加 Tensorboard 摘要
Adding Tensorboard summaries from graph ops generated inside Dataset map() function calls
我发现 Dataset.map() 功能非常适合设置管道以在将 image/audio 数据输入网络进行训练之前对其进行预处理,但我遇到的一个问题是访问原始数据在预处理之前发送到 tensorboard 作为摘要。
例如,假设我有一个函数可以加载音频数据、做一些框架、制作频谱图,然后 returns 这个。
import tensorflow as tf
def load_audio_examples(label, path):
# loads audio, converts to spectorgram
pcm = ... # this is what I'd like to put into tf.summmary.audio() !
# creates one-hot encoded labels, etc
return labels, examples
# create dataset
training = tf.data.Dataset.from_tensor_slices((
tf.constant(labels),
tf.constant(paths)
))
training = training.map(load_audio_examples, num_parallel_calls=4)
# create ops for training
train_step = # ...
accuracy = # ...
# create iterator
iterator = training.repeat().make_one_shot_iterator()
next_element = iterator.get_next()
# ready session
sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
train_writer = # ...
# iterator
test_iterator = testing.make_one_shot_iterator()
test_next_element = iterator.get_next()
# train loop
for i in range(100):
batch_ys, batch_xs, path = sess.run(next_element)
summary, train_acc, _ = sess.run([summaries, accuracy, train_step],
feed_dict={x: batch_xs, y: batch_ys})
train_writer.add_summary(summary, i)
似乎这并没有成为张量板 "Graph" 选项卡中绘制的图表的一部分(请参见下面的屏幕截图)。
如您所见,它只是 X(预处理 map() 函数的输出)。
- 我如何更好地构造它以将原始音频转换为
tf.summary.audio()
?现在,在我的训练循环中,无法将 map() 中的内容作为张量访问。
- 此外,为什么我的图表没有显示在 Tensorboard 上?担心我将无法导出我的模型或使用 Tensorflow Serving 将我的模型投入生产,因为我正在使用新的数据集 API - 也许我应该回去手动做事? (有队列等)。
我认为您对 Dataset API 的使用没有多大意义。事实上,您有 2 个断开连接的子图。一个用于读取数据,另一个用于 运行 您的训练步骤。
batch_ys, batch_xs, path = sess.run(next_element)
summary, train_acc, _ = sess.run([summaries, accuracy, train_step],
feed_dict={x: batch_xs, y: batch_ys})
上面代码的第一行运行会话并从中获取数据项。它将数据从 Tensorflow 后端传输到 Python.
下一行使用 feed_dict
输入数据,即 said to be inefficient。这次 TensorFlow 将数据从 Python 传输到运行时。
这会产生以下后果:
- 您的图表看起来不连贯
- TensorFlow 浪费时间在 Python 和 Python 之间进行不必要的数据传输。
要获得单个图(没有断开连接的子图),您需要在数据集 API 返回的张量之上构建模型。请注意,无需手动获取批次即可在训练和测试数据集之间切换(参见 Dataset guide)
如果要谈论 map_fn
中定义的摘要,我相信您可以从 SUMMARIES
集合(摘要的默认集合)中检索摘要。添加汇总操作时也可以传入自己的集合名称
我发现 Dataset.map() 功能非常适合设置管道以在将 image/audio 数据输入网络进行训练之前对其进行预处理,但我遇到的一个问题是访问原始数据在预处理之前发送到 tensorboard 作为摘要。
例如,假设我有一个函数可以加载音频数据、做一些框架、制作频谱图,然后 returns 这个。
import tensorflow as tf
def load_audio_examples(label, path):
# loads audio, converts to spectorgram
pcm = ... # this is what I'd like to put into tf.summmary.audio() !
# creates one-hot encoded labels, etc
return labels, examples
# create dataset
training = tf.data.Dataset.from_tensor_slices((
tf.constant(labels),
tf.constant(paths)
))
training = training.map(load_audio_examples, num_parallel_calls=4)
# create ops for training
train_step = # ...
accuracy = # ...
# create iterator
iterator = training.repeat().make_one_shot_iterator()
next_element = iterator.get_next()
# ready session
sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
train_writer = # ...
# iterator
test_iterator = testing.make_one_shot_iterator()
test_next_element = iterator.get_next()
# train loop
for i in range(100):
batch_ys, batch_xs, path = sess.run(next_element)
summary, train_acc, _ = sess.run([summaries, accuracy, train_step],
feed_dict={x: batch_xs, y: batch_ys})
train_writer.add_summary(summary, i)
似乎这并没有成为张量板 "Graph" 选项卡中绘制的图表的一部分(请参见下面的屏幕截图)。
如您所见,它只是 X(预处理 map() 函数的输出)。
- 我如何更好地构造它以将原始音频转换为
tf.summary.audio()
?现在,在我的训练循环中,无法将 map() 中的内容作为张量访问。 - 此外,为什么我的图表没有显示在 Tensorboard 上?担心我将无法导出我的模型或使用 Tensorflow Serving 将我的模型投入生产,因为我正在使用新的数据集 API - 也许我应该回去手动做事? (有队列等)。
我认为您对 Dataset API 的使用没有多大意义。事实上,您有 2 个断开连接的子图。一个用于读取数据,另一个用于 运行 您的训练步骤。
batch_ys, batch_xs, path = sess.run(next_element)
summary, train_acc, _ = sess.run([summaries, accuracy, train_step],
feed_dict={x: batch_xs, y: batch_ys})
上面代码的第一行运行会话并从中获取数据项。它将数据从 Tensorflow 后端传输到 Python.
下一行使用 feed_dict
输入数据,即 said to be inefficient。这次 TensorFlow 将数据从 Python 传输到运行时。
这会产生以下后果:
- 您的图表看起来不连贯
- TensorFlow 浪费时间在 Python 和 Python 之间进行不必要的数据传输。
要获得单个图(没有断开连接的子图),您需要在数据集 API 返回的张量之上构建模型。请注意,无需手动获取批次即可在训练和测试数据集之间切换(参见 Dataset guide)
如果要谈论 map_fn
中定义的摘要,我相信您可以从 SUMMARIES
集合(摘要的默认集合)中检索摘要。添加汇总操作时也可以传入自己的集合名称