如何使用tf.data.Dataset.from_generator读取音频文件

时间:2020-11-08 09:18:58

标签: tensorflow python-3.7 tf.keras

Tensorflow版本:2.1.0

使用tf.keras构建的模型

图形卡:Nvidia GTX 1660TI 6GB DDR6

CPU:英特尔i7第9代

Ram:16 GB DDR4

存储磁盘:SSD(NVME)

我编写了一个代码,使用tf.keras以多线程的方式批量读取音频文件。有多个工作程序的序列,但是该代码的问题是CPU在训练GPU时并没有同时读取下一组音频批次因此,GPU最多只能使用其最大容量的30%(一个纪元的训练时间约为25分钟)。

因此,我决定移至tf.data.Datasets.from_generator以使用现有的生成器功能以更有效的方式读取批处理。但是该输入管道的性能更差(训练一个纪元需要47分钟)。我已经附加了我用来阅读的代码,以创建输入管道。我已经从excel文件中读取了文件名及其类别,并将其提供给生成器并创建了管道。

即使在应用预取之后,管道的性能仍然非常糟糕。

由于这是我第一次使用tf.data API,因此请问是否有任何错误。

这是我生成批处理的代码。

# Function read the audio files
def get_x(file):

    data = []

    for i in file:
        audio, fs = sf.read(i, dtype="float32")
        data.append(audio[::2])

    data = np.array(data, dtype=np.float32)
    data = np.expand_dims(data, axis=-1)

return data


def data_generator(files, labels, batchsize):
    while True:
        start = 0
        end = batchsize

        while start  < len(files): 
        
            x = get_x(files[start:end])
            y = np.array(tf.keras.utils.to_categorical(labels[start:end], num_classes=2), dtype=np.float32)

        yield x, y

        start += batchsize
        end += batchsize


# Get the tensorflow data dataset object to generate batches
def tf_data_dataset(files, labels, batch_size):

    autotune = tf.data.experimental.AUTOTUNE

    dataset = tf.data.Dataset.from_generator(
                            data_generator,
                            output_types=(np.float32, np.float32),
                            output_shapes=(tf.TensorShape([None, 16000, 1]), 
                                tf.TensorShape([None, 2])),
                            args=(files, labels, batch_size))

    dataset = dataset.prefetch(buffer_size=autotune)

return dataset

0 个答案:

没有答案
相关问题