我正在使用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,我也会接受它,但我认为这有点过分。
答案 0 :(得分:0)
在过去几个月与一些大学讨论后,我现在认为标准确实是使用TFRecords。在做了一些并了解如何使用它们之后,我发现了几个优点和使用音频时的一些缺点。
优点:
RAM
上加载的示例数量取决于您希望转到HD
的频率以及每次访问时要加载的信息量。缺点:
HD
。由于TFRecords具有直接馈送到您的网络的示例,因此它们不等同于原始音频文件,您无法删除它们。并且因为TFRecord中的一些示例是数据增强技术的产物,所以它们往往比原始文件大。 (最后一个可能只是使用大数据集的正常结果)。总而言之,我认为即使它们不是为音频量身打造的,它们起初并不是很容易实现,但它们非常方便实用。这可能就是为什么大多数使用大数据集并且我已经问过这个问题的人说他们使用它们的原因。