Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用tensorflow.data.dataset api从大量wav文件创建数据集?_Python_Tensorflow_Audio_Wav_Tensorflow Datasets - Fatal编程技术网

Python 如何使用tensorflow.data.dataset api从大量wav文件创建数据集?

Python 如何使用tensorflow.data.dataset api从大量wav文件创建数据集?,python,tensorflow,audio,wav,tensorflow-datasets,Python,Tensorflow,Audio,Wav,Tensorflow Datasets,我有8742个wav文件(大约7.1GB),希望将原始数据放入tf.data.Dataset 我的第一次尝试如下。请注意,我使用了soundfile软件包,因为wav文件具有不同的比特率,有些是每个样本24位。据我所知,许多软件包不支持24位wav文件 import tensorflow as tf import soundfile filepaths = tf.gfile.Glob('michael/dataset/wav_filepaths/*.wav') #Get the files i

我有8742个wav文件(大约7.1GB),希望将原始数据放入
tf.data.Dataset

我的第一次尝试如下。请注意,我使用了
soundfile
软件包,因为wav文件具有不同的比特率,有些是每个样本24位。据我所知,许多软件包不支持24位wav文件

import tensorflow as tf
import soundfile

filepaths = tf.gfile.Glob('michael/dataset/wav_filepaths/*.wav') #Get the files into a list

labels = get_labels #pseudo function to obtain corresponding labels to audio

raw_audio = [] #List to hold raw audio lists. These are 2 channel wavs so this will be a 3D list

#Create a list were each element is raw audio data
for f in filepaths:
    try:
        data, sample_rate = soundfile.read(f) #2 channels
        raw_audio.append(data.tolist())
    except Exception as err: #Poor practice to catch all exceptions like this but it is just an example
        print ('Exception')
        print (f)

training_set = tf.data.Dataset.from_tensor_slices((raw_audio, labels))
这个解决方案的问题是,当soundfile读取所有原始数据并将其存储在一个列表中时,速度非常慢

我现在正在考虑一个解决方案,在这个解决方案中,我最初将文件名和相应的标签存储在
tf.data.Dataset
中。然后,我将创建一个映射函数,该函数调用
soundfile.read
,甚至可能在函数中使用
tensorflow.contrib.framework.python.ops.audio\u ops
,只返回原始音频和相应的标签。该函数将使用
tf.data.Dataset.map
函数调用,以便整个过程成为图形的一部分并被并行化

我对建议的解决方案的第一个担忧是,将文件名存储在数据集中,以便稍后由相应的数据替换,这并不理想,而且似乎有点“黑客”。我的第二个担忧是,我使用的GPU(1080Ti,11GB内存)可能会耗尽内存


请提供一种更好的方法(特别是它应该更快)将原始音频数据从一大组wav文件中获取到
tf.data.Dataset

虽然理论上您可以使用读取文件并使用解码,但这种情况下通常的方法是将数据转换为TFRecord格式,然后使用。显示了如何执行此操作的示例,在您的案例中,您需要一个脚本来读取每个WAV文件,对其进行解码并在文件中写入样本向量(我认为32位值是最简单的方法)。请注意,如果要将多个音频文件批处理为一个张量,则它们必须具有相同的大小,或者必须使用以形成适当的张量。

您可以尝试使用生成器函数将数据输入管道。看看

每个声音文件的采样数是否都相同?否则,我想如果您想在一个批处理中有多个wav文件,您需要添加填充?显然有,但一般来说,最简单的方法是先看后看。嗯,我认为它们都是立体的,所以样本数相同,但帧数不同。所以我一定会把它们填好,谢谢:)。如果可能的话,我最好避免使用tfrecord选项。我希望网络能够根据原始数据进行训练和推断。由于我必须为任何tf函数(包括“tf.contrib.ffmpeg.decode_audio”)提供张量,我是否应该使用文件名创建一个数据集并使用映射函数?对于TFRecords,您将在原始数据上进行训练,如果您将解码的WAV文件直接放入,它只是一种文件格式。无论如何,如果要使用,您必须给出文件列表(或使用)并用该函数映射它们。@jdehesa虽然这不是我想要的解决方案,但使用tfrecords似乎是处理太大而无法放入内存的数据的“tensorflowy”(可接受的tensorflow相当于“pythonic”:P?)方法。看来我遇到的问题是内存,而不是soundfile.read的速度。因此,这是一个可接受的解决方案。如果你把这个写进一个答案,那么我很乐意接受。谢谢,Michael。@jdehesa出于好奇,人们是否曾经使用文件名队列或类似的东西将数据读入tf.data.Dataset?这非常有效,我想大多数人都使用上面给我的tfRecord解决方案。但是我想tf.data.Dataset api还是很新的。谢谢你的回答,Michael.Np。顺便说一句根据您的用例,您甚至可以编写自己的tf数据读取器。文档相当隐蔽:)