R N*_*hak 4 python deep-learning lstm keras tensorflow
我正在尝试创建在大型音乐数据集上训练的模型。MIDI 文件被转换为 numpy 数组。由于 LSTM 需要顺序数据,因此在转换为 LSTM 序列时数据集大小变得非常巨大。
我根据基调和持续时间将 MIDI 音符转换为索引,因此我得到了 6 个 C4 调的类别。同样,我从 C3 到 B5,总共 288 节课,包括休息时间的课。
单个 MIDI 的转换格式如下所示。
midi = [0,23,54,180,23,45,34,.....];
为了训练 LSTM,x 和 y 变为
x = [[0,23,54..45],[23,54,..,34],...];
y=[[34],[76],...]
x 和 y 中的值进一步转换为 one-hot 编码。因此,对于 60 个小型 mid 文件来说,数据大小就变得很大,但我有 1700 个文件。如何使用如此数量的文件训练模型。我检查了 ImageGenerator,但它要求数据位于单独的类目录中。如何实现这一目标?
您应该在训练期间动态生成训练数据。基于tf 文档,您可以编写自己的生成器用作训练数据,或继承Sequence。
第一个选项应该看起来像
def create_data_generator(your_files):
raw_midi_data = process_files(your_files)
seq_size = 32
def _my_generator():
i = 0
while True:
x = raw_midi_data[i:i + seq_size]
y = raw_midi_data[i + seq_size]
i = (i + 1) % (len(raw_midi_data) - seq_size)
yield x, y
return _my_generator()
Run Code Online (Sandbox Code Playgroud)
然后用(假设 tf >= 2.0)调用它
generator = create_data_generator(your_files)
model.fit(x=generator, ...)
Run Code Online (Sandbox Code Playgroud)
如果您使用的是Keras 团队本身不推荐的“旧”Keras(来自tensorflow 2.0之前的版本) ,您应该使用fit_generator:
model.fit_generator(generator, ...)
Run Code Online (Sandbox Code Playgroud)
使用此解决方案,您只需将数据存储在内存中一次,不会因重叠序列而产生重复。