将Queue Ops与常规Python混合以进行数据加载

时间:2016-07-07 12:40:08

标签: python tensorflow

我正致力于音频的序列学习,需要加载我的音频数据。目前,我依靠tf.decode_csv将文件名和标签对加载到Tensorflow队列中。但是,我想实际读取该文件并使用其他Python库进行处理。然而,CSV解码器/出列操作总是返回张量操作,这使得与其他Python库的互操作性变得不可能。关于如何将TF的流媒体操作与外部库混合的任何想法?

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)

sound_path是dtype string的张量,但我无法将其转换/转换为Python字符串以与read_wav lib兼容。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

假设你的read_wav函数需要一个文件名(字符串)作为参数,并返回一个浮动值的numpy数组(解码文件)。

read_wav的计算发生在张量流图之外,在python中。您可以使用tf.py_func将Python代码封装在TensorFlow包装器中,而不是调用sess.run(sound_path),这将创建大量运行(每个文件名一个)。您需要指定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

答案 1 :(得分:0)

要提取张量的内容,您必须将其“运行”到会话中。

sound_path_value = sess.run(sound_path)