我正致力于音频的序列学习,需要加载我的音频数据。目前,我依靠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兼容。
有什么想法吗?
答案 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)