是否有一种标准方法可以在 tensorflow 中动态加载/处理(音频)数据?

And*_*oti 6 audio deep-learning tensorflow

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

这是一个音频数据集,我想对信号进行窗口化并生成更多示例来更改跃点大小,但是因为我没有无限量的数据,RAM所以在用完它之前我可以做的事情很少(我'我实际上只使用数据集的一个很小的子集,不要告诉谷歌我是怎么生活的)。

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

代码:

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))
Run Code Online (Sandbox Code Playgroud)

我想我可以只加载文件名,打乱它们,然后产生 X 加载的结果以获得更动态的方法,但在这种情况下,我仍然会在那些 X 加载的结果中使用所有不同的窗口来发出声音,给我一个非常好的随机化。

我还研究了TFRecords,但我认为这不会改善我在最后一段中提出的任何内容。

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

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

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

And*_*oti 0

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

优点:

  • 它们完全解决了所有排队问题,对 RAM 的压力最小。
  • 随机加载示例的解决方案。您加载的示例数量RAM取决于您访问的频率HD以及每次访问时要加载的信息量。
  • 它们很容易共享,并且(通常)已经合并了预处理​​。您可以让多个流程使用它们,也可以让多个人跨越不同的大陆,并确保你们都使用相同的数据。当使用原始音频并动态处理它时,情况并非如此,因为不同的软件可能会以不同的方式应用计算(即 stft 实现可能很快就会改变)。

缺点:

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

总而言之,我认为尽管它们不是为音频量身定制的,而且一开始也不太容易实现,但它们非常方便和有用。这可能就是为什么大多数使用大数据集的人以及我问过这个问题的人说他们使用它们的原因。