该项目构建了一个用于音乐生成的循环神经网络(RNN)。该模型经过训练,可以学习 ABC 记谱法的原始乐谱中的模式,从而生成音乐。该数据集是从 kaggle 收集的,包含歌曲的 ABC 表示法。链接:https://www.kaggle.com/datasets/raj5287/abc-notation-of-tunes?datasetId=156963&sortBy=dateRun&tab=profile 数据集中的文本首先被矢量化以创建数字表示以维护查找表。我们将使用一些示例序列来训练具有确定序列长度的 RNN。还将有一个用于预测下一个字符的目标序列。这将使用批处理方法来实现,该方法会将字符索引流转换为所需大小的序列。我们创建的 RNN 模型将基于 LSTM 架构,并具有初始化器“glorot_uniform”和激活函数“sigmoid”,其中我们将使用状态向量来维护有关连续字符之间的时间关系的信息。然后,LSTM 的最终输出被输入到完全连接的密集层,在其中我们将输出词汇表中每个字符的 softmax,然后从此分布中进行采样以预测下一个字符。
第 1 层:嵌入层,将索引转换为固定嵌入大小的密集向量
第 2 层:具有 rnn_units 个单元的 LSTM。
第 3 层:密集(全连接)层,将 LSTM 输出转换为词汇量。
然后使用交叉熵损失(负对数似然损失)即稀疏_分类_交叉熵损失的形式来训练 RNN 模型,因为它利用整数目标来执行分类分类任务。我们希望使用真实目标(标签)和预测目标(逻辑)来计算损失。定义超参数用于设置和优化。 Adam优化器用作训练操作的优化器。该模型经过 3000 次迭代训练,批量大小为 10,序列长度为 100。当学习率设置为 1e-3 时,模型学习效果更好。为了生成音乐,模型遵循预测程序:
步骤 1:初始化“种子”起始字符串和 RNN 状态,并设置我们要生成的字符数。
步骤2:使用起始字符串和RNN状态来获得下一个预测字符的概率分布。
Step3:从多项分布中采样,计算预测字符的索引。然后将该预测的字符用作模型的下一个输入。
第 4 步:在每个时间步,更新后的 RNN 状态都会反馈到模型中,以便模型在进行下一次预测时拥有更多上下文。预测下一个字符后,更新的 RNN 状态再次反馈到模型中,这就是它学习数据中的序列依赖性的方式,因为它从之前的预测中获取了更多信息。
现在,该模型使用用户定义的“start_string”和“ Generation_length”生成歌曲。