ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Magenta Melody RNN 实战指南:基于 LSTM 的旋律生成模型配置、训练与推理全解析

Magenta Melody RNN 实战指南:基于 LSTM 的旋律生成模型配置、训练与推理全解析 人工智能深度学习音频媒体生成计算机视觉【免费下载链接】magentaMagenta: Music and Art Generation with Machine Intelligence项目地址https://gitcode.com/gh_mirrors/ma/magenta点击查看免费下载Melody RNN 是 Magenta 项目中最经典的旋律生成模型之一它将自然语言处理中的**语言建模language modeling**思想应用到单声部旋律生成把一段旋律视为事件序列用 LSTM 网络逐事件预测下一个音符。本文以 magenta/models/melody_rnn/README.md 为主线结合仓库源码与命令行实现完整讲解四种内置配置的差异、预训练模型的使用、从 MIDI 数据到可部署.magbundle 文件的端到端训练流程以及每个核心参数的底层含义。读完本文你将能独立完成数据准备 → 数据集生成 → 训练/评估 → 旋律生成 → 模型打包的完整闭环。模型原理把旋律当作语言来建模Melody RNN 的核心思路是把一段单声部旋律抽象成一个事件序列event sequence事件类型包括音符开note-on、音符关note-off与休止no event再交给一个多层 LSTM 网络学习事件之间的转移规律。模型训练的目标是最大化给定前序事件时当前事件的概率即标准的语言建模目标生成时则从 primer种子旋律出发逐步采样后续事件最终还原成可播放的 MIDI 旋律。在 Magenta 中这一思路被封装为通用的事件序列 RNN框架MelodyRnnModel继承自 EventSequenceRnnModel底层通过 events_rnn_graph.py 中的get_build_graph_fn构建训练、评估与生成三种模式的 TensorFlow 计算图。图中 RNN 单元由make_rnn_cell按超参数组装每一层是BasicLSTMCell可叠加AttentionCellWrapper注意力包装器、ResidualWrapper残差连接和DropoutWrapperDropout最终组合成MultiRNNCell参见 events_rnn_graph.py。四种内置配置Configurations配置文件集中定义在 melody_rnn_model.py 的default_configs字典中melody_rnn_model.py每种配置由三要素决定编码器/解码器encoder_decoder、音域min_note/max_note与超参数hparams。basic_rnn基线配置作为旋律生成的基线basic_rnn使用基础 one-hot 编码MelodyOneHotEncoding表示旋律事件。训练时所有样本会被转调到 MIDI 音高范围[48, 84]即 C3 到 C6 区间对应DEFAULT_MIN_NOTE 48、DEFAULT_MAX_NOTE 84见 melody_rnn_model.py生成结果也落在该范围内。mono_rnn全音域单声部配置mono_rnn同样是 one-hot 编码的基线配置但与basic_rnn将输入压缩到窄音域不同它使用0 到 128 的全 MIDI 音域min_note0, max_note128且transpose_to_keyNone表示不做转调。代价是输入向量的维度更大模型需要学习的音高空间更宽。lookback_rnn回看Lookback配置lookback_rnn引入自定义输入与自定义标签编码器为LookbackEventSequenceEncoderDecoder。自定义输入让模型更容易识别跨越 1 小节和 2 小节的模式也有助于模型感知当前事件在小节内的位置自定义标签则把重复 1 或 2 小节前的事件这一操作直接编码进标签减轻 RNN 细胞状态cell state的记忆负担。其效果是生成的旋律漂移更少、音乐结构更强。关于自定义输入/标签的具体编码逻辑可阅读 note-seq 库中LookbackEventSequenceEncoderDecoder的events_to_input与events_to_label方法实现。attention_rnn注意力配置attention_rnn在 lookback 编码KeyMelodyEncoderDecoder的基础上引入注意力机制attention。注意力让模型无需把所有历史信息都塞进细胞状态就能直接回看过去若干步的信息从而更容易学习长期依赖生成带有更长拱形主题arching themes的旋律。在实现上注意力通过AttentionCellWrapper包装在 RNN 的第一层见 events_rnn_graph.py其回看步数由超参数attn_length控制默认 40 步即 2.5 小节。四种配置的参数总览从 melody_rnn_model.py 的源码可以整理出各配置的默认超参数配置编码器音域batch_sizernn_layer_sizesdropout_keep_probclip_normattn_lengthlearning_ratebasic_rnnOneHotMelodyOneHotEncoding[48, 84]128[128, 128]0.55—0.001mono_rnnOneHotMelodyOneHotEncoding[0, 128]128[128, 128]0.55—0.001lookback_rnnLookback[48, 84]128[128, 128]0.55—0.001attention_rnnKeyMelodyEncoderDecoder[48, 84]128[128, 128]0.53400.001说明上述默认值由各MelodyRnnConfig直接指定EventSequenceRnnConfig基类还提供了batch_size64、rnn_layer_sizes[128,128]、attn_length0等兜底默认值events_rnn_model.py可在--hparams中覆盖。环境准备与模型获取开始之前需要先按 Magenta 环境搭建说明 完成环境安装。之后你有两条路直接使用预训练模型快速体验或训练自己的模型。Magenta 官方提供了基于海量 MIDI 文件预训练的.magbundle 文件与上述四种配置一一对应basic_rnn、mono_rnn、lookback_rnn、attention_rnnbundle 文件托管在 Magenta 官方模型下载地址文件名与配置同名后缀为.mag。下载后即可用melody_rnn_generate直接生成旋律。用预训练模型生成旋律准备好 bundle 文件后先设置两个环境变量再调用生成脚本BUNDLE_PATHabsolute path of .mag file CONFIGone of basic_rnn, lookback_rnn, or attention_rnn, matching the bundle melody_rnn_generate \ --config${CONFIG} \ --bundle_file${BUNDLE_PATH} \ --output_dir/tmp/melody_rnn/generated \ --num_outputs10 \ --num_steps128 \ --primer_melody[60]上面的命令会以中央 Cmiddle CMIDI 音高 60为起始音符生成一段旋律。melody_rnn_generate的主要参数在 melody_rnn_generate.py 中定义汇总如下参数默认值说明--config无配置名须与 bundle 匹配basic_rnn / lookback_rnn / attention_rnn 等--bundle_fileNone.magbundle 文件路径指定后优先级高于run_dir与checkpoint_file--run_dirNone训练日志目录会从其中train子目录加载最新 checkpoint--checkpoint_fileNone直接指定 checkpoint 文件路径优先级低于run_dir--output_dir/tmp/melody_rnn/generated生成的 MIDI 文件保存目录--num_outputs10生成的旋律数量每个保存为一个 MIDI 文件--num_steps128生成旋律的总步数以十六分音符为单位128 步 8 小节包含 primer 长度--primer_melodyPython 列表字符串形式的种子旋律如[60, -2, ...]--primer_midi指定一个 MIDI 文件从其中提取旋律作为种子--qpmNone输出的播放速度quarter notes per minute默认 120若提供 primer MIDI 则以其中的 qpm 为准--temperature1.0采样随机度1.0 使用原始 softmax 概率1.0 更随机1.0 更保守--beam_size1束搜索beam search的束宽--branch_factor1束搜索分支因子--steps_per_iteration1每次束搜索迭代生成的步数--logINFO日志级别DEBUG、INFO、WARN、ERROR、FATAL--save_generator_bundleFalse若为 True则不生成旋律而是把生成器保存为 bundle 文件种子旋律的两种指定方式--primer_melody用 Python 列表的字符串形式给出列表元素必须是整数遵循note_seq.Melody事件格式-2无事件休止-1音符关note-off0到127该 MIDI 音高的音符开note-on例如--primer_melody[60, -2, 60, -2, 67, -2, 67, -2]会以小星星Twinkle Twinkle Little Star的前四个音符作为种子。--primer_midi指定一个 MIDI 文件从中提取旋律作为种子。仓库自带示例文件 primer.mid可用--primer_midi该文件的绝对路径直接体验。如果两者都不指定脚本会默认使用单个中央 CMIDI 音高 60作为种子见 melody_rnn_generate.py并从该音符开始生成后续旋律。生成时若种子序列长度超过num_steps指定长度脚本会直接报错终止melody_rnn_generate.py。从源码看生成过程大致是读取 bundle 或 checkpoint → 构造MelodyRnnSequenceGenerator→ 把 primer 序列量化为 Melody 对象 → 调用MelodyRnnModel.generate_melody逐步采样事件melody_rnn_sequence_generator.py。generate_melody内部会先把 primer 转调到配置音域生成完成后再转调回原始音域以保证输出的音符范围与输入一致melody_rnn_model.py。训练自己的模型第一步创建 NoteSequences首先把一批 MIDI 文件转换为 NoteSequences。NoteSequences 是基于 Protocol Buffers 的格式比原始 MIDI 文件更高效、更易处理。生成 NoteSequences TFRecord 文件的详细步骤见 Building your Dataset 说明。本文示例假设 NoteSequences 已输出到/tmp/notesequences.tfrecord。第二步创建 SequenceExamplesSequenceExamples 是训练与评估时真正喂给模型的数据每个 SequenceExample 包含一段旋律的输入序列和标签序列。运行下面的命令从 NoteSequences 中提取旋律并保存为 SequenceExamplesmelody_rnn_create_dataset \ --configone of basic_rnn, mono_rnn, lookback_rnn, or attention_rnn \ --input/tmp/notesequences.tfrecord \ --output_dir/tmp/melody_rnn/sequence_examples \ --eval_ratio0.10--inputNoteSequences 的 TFRecord 文件路径。--output_dir训练与评估 TFRecord 的输出目录会生成eval_melodies.tfrecord与training_melodies.tfrecord两个文件。--eval_ratio划分到评估集的样本比例。设为 0.10 时10% 的提取旋律进入 eval 集合90% 进入训练集合划分是随机进行的见 melody_rnn_create_dataset.py。该脚本背后是一条完整的 DAG 数据管线melody_rnn_pipeline.py先用RandomPartition按eval_ratio随机切分数据再对每个子集依次执行TimeChangeSplitter按速度变化切分、TranspositionPipeline转调增强、Quantizer按steps_per_quarter量化Melody RNN 默认每四分音符 4 步、MelodyExtractor提取单声部旋律要求至少 7 小节、512 步以内、至少 5 个不同音高最后由EncoderPipeline把每条旋律 squash压入配置音域并转调后编码为SequenceExamplemelody_rnn_pipeline.py。第三步训练与评估模型下面的命令以attention_rnn配置启动训练任务melody_rnn_train \ --configattention_rnn \ --run_dir/tmp/melody_rnn/logdir/run1 \ --sequence_example_file/tmp/melody_rnn/sequence_examples/training_melodies.tfrecord \ --hparamsbatch_size64,rnn_layer_sizes[64,64] \ --num_training_steps20000melody_rnn_train的核心参数melody_rnn_train.py参数默认值说明--config无配置名决定编码器与默认超参数--run_dir/tmp/melody_rnn/logdir/run1checkpoint 与 TensorBoard 摘要的保存目录训练/评估事件分别存放在其下train与eval子目录--sequence_example_fileSequenceExamples 的 TFRecord 路径支持 filepattern 通配符--num_training_steps0训练更新步数0 表示一直训练直到手动终止--num_eval_examples0每次评估处理的样本数0 表示使用整个评估集--summary_frequency10训练时每 N 步记录一次摘要评估时每 N 秒记录一次--num_checkpoints10训练目录中保留的最近 checkpoint 数量0 表示全部保留--evalFalse若为 True只评估模型、不更新权重--logINFO日志级别超参数--hparams详解--hparams以逗号分隔的namevalue列表形式覆盖默认超参数解析逻辑见 melody_rnn_config_flags.py。常用超参数batch_size每批训练的样本数默认 128。示例中改为 64可降低内存占用缓解大模型训练时的 OOM 问题。rnn_layer_sizes各 RNN 层的单元数默认[128, 128]2 层各 128 单元。示例改为[64, 64]模型训练更快若算力充足可尝试更大层尺寸以提升效果。attn_length注意力机制回看的历史步数仅对attention_rnn生效默认 40 步2.5 小节。dropout_keep_probDropout 保留概率生成模式下强制为 1.0即关闭 Dropout。clip_norm梯度裁剪范数attention_rnn默认 3其余配置默认 5。learning_rateAdam 优化器学习率默认 0.001。并行运行评估任务可选地可以并行启动一个评估任务与训练共用同一run_dirmelody_rnn_train \ --configattention_rnn \ --run_dir/tmp/melody_rnn/logdir/run1 \ --sequence_example_file/tmp/melody_rnn/sequence_examples/eval_melodies.tfrecord \ --hparamsbatch_size64,rnn_layer_sizes[64,64] \ --num_training_steps20000 \ --eval注意评估任务的--run_dir、--hparams与--num_training_steps必须和训练任务一致--sequence_example_file指向独立的评估集文件并加上--eval标志。评估模式只计算指标、不更新权重melody_rnn_train.py。训练图与评估图都会产生 loss、perplexity、accuracy、event_accuracy、no_event_accuracy、loss_per_step、perplexity_per_step 等标量摘要见 events_rnn_graph.py。用 TensorBoard 监控tensorboard --logdir/tmp/melody_rnn/logdir启动后访问 http://localhost:6006 查看训练与评估曲线。--logdir指向run_dir的父目录即可同时看到多次运行的记录。第四步用训练好的 checkpoint 生成旋律训练期间或训练结束后都可以生成旋律。下面的命令使用最新 checkpoint 生成一批旋律melody_rnn_generate \ --configattention_rnn \ --run_dir/tmp/melody_rnn/logdir/run1 \ --output_dir/tmp/melody_rnn/generated \ --num_outputs10 \ --num_steps128 \ --hparamsbatch_size64,rnn_layer_sizes[64,64] \ --primer_melody[60]要点--run_dir与训练任务保持一致脚本会从/tmp/melody_rnn/logdir/run1/train加载最新 checkpointmelody_rnn_generate.py。--hparams应与训练时一致但其中部分参数如 batch_size在生成时会被忽略。--num_outputs指定生成的旋律条数--num_steps指定每条旋律的总步数128 步 8 小节。模型至少需要一个音符作为起始否则无法连续生成后续音符使用--primer_melody或--primer_midi提供种子都不指定时默认随机从模型音域中选一个音符开头。第五步创建 Bundle 文件.magbundle 格式把模型 checkpoint、metagraph 和模型元数据打包进单个文件便于分发与部署。Bundle 由SequenceGenerator基类的create_bundle_file方法生成见 sequence_generator.py所有旋律模型的生成脚本都支持--save_generator_bundle标志来触发该流程。示例melody_rnn_generate \ --configattention_rnn \ --run_dir/tmp/melody_rnn/logdir/run1 \ --hparamsbatch_size64,rnn_layer_sizes[64,64] \ --bundle_file/tmp/attention_rnn.mag \ --save_generator_bundle打包完成后/tmp/attention_rnn.mag即可作为预训练 bundle配合--bundle_file参数直接用于生成旋律。打包逻辑见 melody_rnn_generate.py脚本会从--run_dir加载 checkpoint调用generator.create_bundle_file(bundle_filename, bundle_description)写入 bundle可选的--bundle_description参数用于附加一段可读的模型说明如训练数据、超参数等。进阶从源码理解配置与生成的底层逻辑配置的灵活组合除了使用预设的--configmelody_rnn_config_flags.py还提供了--melody_encoder_decoder可选值onehot、lookback、key、--generator_id、--generator_description等参数可自由组合编码器与自定义生成器 ID/描述两者与--config互斥melody_rnn_config_flags.py。例如可以自行指定--melody_encoder_decoderkey配合任意音域构造出不同于内置 attention 的配置。转调squash机制MelodyRnnConfig通过min_note、max_note、transpose_to_key三个字段控制旋律的转调与音域压缩melody_rnn_model.py。生成时旋律先被压入配置音域、生成完成后再转回原音域因此音域的大小决定生成旋律可能的跨度而音域位置相对随意。束搜索生成EventSequenceRnnModel._generate_events使用beam_search逐事件扩展序列支持temperature、beam_size、branch_factor、steps_per_iteration四个生成参数events_rnn_model.py这些正是melody_rnn_generate命令行中对应参数的最终去向。至此从预训练模型快速体验到自有 MIDI 数据集的完整训练、评估、生成与打包Melody RNN 的全链路都已覆盖。你可以在此基础上进一步调整超参数、尝试不同编码器组合探索更丰富的旋律生成风格。赞分享人工智能深度学习音频媒体生成计算机视觉【免费下载链接】magentaMagenta: Music and Art Generation with Machine Intelligence项目地址https://gitcode.com/gh_mirrors/ma/magenta点击查看免费下载相关推荐Magenta Improv RNN 指南基于和弦进行条件化的旋律生成模型详解Magenta Improv RNN 指南基于和弦进行条件化的旋律生成模型详解 导读 Improv RNN 是 Magenta 项目中的和弦感知旋律生成模人工智能深度学习音频媒体生成计算机视觉Magenta RLTuner 实战指南用强化学习与音乐理论奖励调优 Note RNN 生成旋律Magenta RLTuner 实战指南用强化学习与音乐理论奖励调优 Note RNN 生成旋律 本文围绕 Magenta 项目中的 RL Tuner 模型文人工智能深度学习音频媒体生成计算机视觉MXNet RNN 变长序列训练实战基于 Sherlock Holmes 数据集的 Bucketing 语言模型LSTM / CuDNN RNN / 混合精度推理MXNet RNN 变长序列训练实战基于 Sherlock Holmes 数据集的 Bucketing 语言模型LSTM / CuDNN RNN / 混合精深度学习机器学习人工智能上一篇Open3D电商展示终极指南如何用3D模型提升商品转化率500%下一篇探索高效文件上传——深度解析 MyUploader-Backend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表