用于音乐生成的 LSTM 神经网络

数据挖掘 机器学习 Python 神经网络 喀拉斯
2021-10-01 23:55:03

我正在做一个项目,我必须训练 LSTM 神经网络来生成音乐。第一步当然是训练它。我在 Theano 之上使用 Keras 来完成这项任务,并使用 music21 从 MIDI 文件中提取特征。到目前为止,我从 MIDI 文件中提取的数据具有以下格式:

[[69, -7, 1, 0.75], [62, -1, 0, 0.25] ... ]

这些是我从文件中获取的 4 个功能。然后将它们放置在一个 3D numpy 数组中,其形状为 -(序列中的音符数,1(每个样本的时间步长),4(特征))。我创建另一个数组,每个时间步的预期输出是下一个时间步的数据。我已经建立了以下模型: http: //pastebin.com/AHCJj1wa

问题是当它开始训练模型时,我得到一些无意义的输出。首先,epochs 的输出如下所示:

Epoch 1/100
0s - loss: 15.2986 - acc: 0.9738
Epoch 2/100
0s - loss: -3.3534e+02 - acc: 0.8265
Epoch 3/100
0s - loss: -3.8183e+02 - acc: 0.8265
Epoch 4/100
0s - loss: -3.8218e+02 - acc: 0.8265
Epoch 5/100
0s - loss: -3.8256e+02 - acc: 0.8265

它似乎每个时期都取 0,损失变得越来越大或完全停止变化(在运行之间有所不同)。同样在训练周期结束时,当我调用 .predict 时,它会打印出类似的内容:

[[ 0.11846249 -0.13457553  0.08614471 -0.1007532 ]
 [ 0.14596225 -0.17533173  0.10007301 -0.08799653]
 [ 0.15234099 -0.19707087  0.10395571 -0.08419057]
 [ 0.14596225 -0.17533173  0.10007301 -0.08799653]
 [ 0.14340727 -0.1664145   0.0987886  -0.09037785]
 [ 0.14596225 -0.17533173  0.10007301 -0.08799653]
 [ 0.14340727 -0.1664145   0.0987886  -0.09037785]
 [ 0.14802463 -0.17770432  0.10296948 -0.08740482]
 ..... ]

我认为我的模型和/或数据表示存在根本性错误。关于我能做什么的任何想法,或者至少有一些关于我可以在哪里阅读的指针?

1个回答

这些是您可以尝试的一些建议:

  1. 只需使用 1 个 LSTM 层而不是 2 个,对于较浅的网络,梯度消失的问题可能会更少。事实上,密集层 4 是可选的,因为 return_sequences = True。

  2. 找到一种在 0 到 1 范围内标准化输入的方法。

  3. 尝试不同的优化器,例如 SGD 或 Adam。

  4. 降低你的学习率,对于输入维度 4,默认学习率可能太大。

  5. 损失不应该是 categorical_crossentropy,因为这是一个回归问题。损失应该是均方误差。

按重要性排序 4 > 5 > 3 > 1 > 2(即第 4 点最重要)