有没有一种标准的方法来在tensorflow中动态加载/处理(音频)数据?

时间:2017-12-19 14:22:22

标签: audio tensorflow deep-learning

我正在使用the Nsynth dataset构建网络。它有大约22 Gb的数据。现在我将所有内容加载到RAM中,但这会出现一些(明显的)问题。

这是一个音频数据集,我想窗口信号并产生更多例子来改变跳跃大小,但是因为我没有无限量的RAM所以我能做的事情很少在我用完它之前做的事情(我实际上只使用数据集的一小部分don't tell google how I live)。

这是我现在正在使用的一些代码:

代码:

def generate_audio_input(audio_signal, window_size):
    audio_without_silence_at_beginning_and_end = trim_silence(audio_signal, frame_length=window_size)
    splited_audio = windower(audio_without_silence_at_beginning_and_end, window_size, hop_size=2048)
    return splited_audio

start = time.time()

audios = StrechableNumpyArray()

window_size = 5120
pathToDatasetFolder = 'audio/test'
time_per_loaded = []
time_to_HD = []

for file_name in os.listdir(pathToDatasetFolder):
    if file_name.endswith('.wav'):
        now = time.time()
        audio, sr = librosa.load(pathToDatasetFolder + '/' + file_name, sr=None)
        time_to_HD.append(time.time()-now)
        output = generate_audio_input(audio, window_size)
        audios.append(np.reshape(output, (-1)))
        time_per_loaded.append(time.time()-now)
audios = audios.finalize()
audios = np.reshape(audios, (-1, window_size))
np.random.shuffle(audios)
end = time.time()-start
print("wow, that took", end, "seconds... might want to change that to mins :)")
print("On average, it took", np.average(time_per_loaded), "per loaded file")
print("With an standard deviation of", np.std(time_per_loaded))

我认为我只能加载文件名,对其进行随机播放然后产生X加载的结果以获得更动态的方法,但在这种情况下,我仍然会在X加载的结果中拥有所有不同的窗口以获得声音,给我一个非常好的随机化。

我也调查了TFRecords,但我认为这不会改善我在上一段中提出的建议。

所以,对于一个明确的问题:是否有一种在张量流中动态加载/处理(音频)数据的标准方法?

如果响应是针对我在开始培训之前预处理我的数据集的特定问题而定制的,我将不胜感激。

如果答案是预处理数据并将其保存到TFRecord然后加载TFRecord,我也会接受它,但我认为这有点过分。

1 个答案:

答案 0 :(得分:0)

在过去几个月与一些大学讨论后,我现在认为标准确实是使用TFRecords。在做了一些并了解如何使用它们之后,我发现了几个优点和使用音频时的一些缺点。

优点:

  • 他们完全将所有问题排在队列中,并且RAM上的压力最小。
  • solutions to load examples randomly。您在RAM上加载的示例数量取决于您希望转到HD的频率以及每次访问时要加载的信息量。
  • 它们易于共享,预处理(通常)已经合并。您可以使用它们的几个进程或跨不同大洲的几个人确定您使用的是相同的数据。在处理原始音频并动态处理时,情况并非如此,因为不同的软件可能会以不同的方式应用计算(即stft实现may change soon)。

缺点:

  • 他们太静了。如果要以任何方式更改数据集,则需要创建新数据集。无法修改每个或任何示例。例如,在几次迭代之后,我决定丢弃具有低振幅的张量。我可以在加载批次后在代码中处理它,但唯一合理的方法是每次发现异常值时丢弃整批产品。
  • 创建它们是一个麻烦而缓慢的过程。在完成TFRecord之前,无法开始使用TFRecord。此外,如果您决定更改张量或数据类型的大小,您将不得不对代码进行额外更改并测试它们,因为某些错误(例如数据类型)只是默默地传递。
  • HD。由于TFRecords具有直接馈送到您的网络的示例,因此它们不等同于原始音频文件,您无法删除它们。并且因为TFRecord中的一些示例是数据增强技术的产物,所以它们往往比原始文件大。 (最后一个可能只是使用大数据集的正常结果)。

总而言之,我认为即使它们不是为音频量身打造的,它们起初并不是很容易实现,但它们非常方便实用。这可能就是为什么大多数使用大数据集并且我已经问过这个问题的人说他们使用它们的原因。