我正在构建一个 LSTM 模型来创建一个自动鼓作曲家。我正在关注这篇文章:LSTM Metallica
我已经建立了我的模型并完成了所有的编码,我能够模拟帖子中提出的网络的行为。事实上,如果我使用博客用户提供的数据集(Metallica 数据集),我的模型实际上会学习音乐小节的重复模式。
这是输入编码的示例:
0b010000000 0b010000000 0b000000000 0b010000000 0b010000000 0b000001000 0b000000000 0b000001000 0b010000000 0b010000000 0b000000000 0b010000000 0b010000000 0b000001000 0b000000000 0b000001000 BAR
0b010000000 0b010000000 0b000000000 0b010000000 0b010000000 0b000001000 0b000000000 0b000001000 0b010000000 0b000000000 0b000000000 0b000001000 0b000000000 0b000001000 0b000001000 0b000000000 BAR
0b100000001 0b000000000 0b000000000 0b000000000 0b010000001 0b000000000 0b000000000 0b000000000 0b100000001 0b000000000 0b000000000 0b000000000 0b010000001 0b000000000 0b000000000 0b000000000 BAR
0b100000001 0b000000000 0b000000000 0b000000000 0b010000001 0b000000000 0b000000000 0b000000000 0b100000001 0b000000000 0b000000000 0b000000000 0b010000001 0b000000000 0b000000000 0b000000000 BAR
0b100000001 0b000000000 0b000000000 0b000000000 0b010000001 0b000000000 0b000000000 0b000000000 0b100000001 0b000000000 0b000000000 0b000000000 0b010000001 0b000000000 0b000000000 0b000000000 BAR
其中0b100000001代表在鼓上演奏的音符,而BAR代表音乐小节的结尾。您可能会注意到,我们每个小节有 16 个事件/注释。
如果我在提供的数据集上训练网络,我会得到很好的结果,我的模型会学习插入BAR预测的每 16 个音符的模式/结构。
这是在某个点开始过度拟合的网络的典型行为。
我在我自己的歌曲数据集上尝试了相同的模型,我已经知道它不是那么好(有时音符模式没有太大意义,我们人工生成了鼓),但我们仍然BAR每 16 个音符就有一个。
我希望我的网络对鼓的生成学习不好,但至少要学习BAR. 例如,它生成完全随机的音符,但每 16 个音符生成一个BAR
不幸的是,这并没有发生,网络具有完全随机的行为,我尝试调整许多参数(输入长度、LSTM 大小。层 ecc ......)但没有任何成功。
我的网络训练也有一个奇怪的行为:
这些是模型在我的数据集上的损失(使用不同的参数),我可以清楚地注意到有问题,模型在原始数据集(Metallica,第一个图)上的行为在我看来更有意义。
也想到了欠拟合/过拟合问题,但是考虑到损失,它们都非常低,我不明白为什么,考虑到如此低的损失,我的模型根本没有从数据中学到任何东西。
模型如下:
model = Sequential()
model.add(LSTM(512, return_sequences=True, input_shape=(maxlen, num_chars)))
model.add(Dropout(0.2))
model.add(LSTM(512, return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(512, return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(num_chars))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam')
哪个可能是问题?我开始认为这是数据集,但我希望我的网络(至少)能够学习重复模式,BAR即使从音乐的角度来看音符没有多大意义。



