Part 3: 利用LSTM即兴创作Jazz
欢迎来到本周的最后一个作业!在这个作业中,你将利用LSTM建立一个生成音乐的模型。在作业的最后你将可以听到你自己的音乐。
你将学会:
- 在音乐生成中使用 LSTM
- 利用深度学习生成你的 jazz 音乐
导包
from __future__ import print_function
import IPython
import sys
from music21 import *
import numpy as np
from grammar import *
from qa import *
from preprocess import *
from music_utils import *
from data_utils import *
from keras.models import load_model, Model
from keras.layers import Dense, Activation, Dropout, Input, LSTM, Reshape, Lambda, RepeatVector
from keras.initializers import glorot_uniform
from keras.utils import to_categorical
from keras.optimizers import Adam
from keras import backend as K
# Using TensorFlow backend.
1 问题描述
你想为你朋友的生日创作一段jazz音乐。然而,你不了解任何乐器和音乐作品。幸运的是,你了解深度学习,并将使用 LSTM 网络解决这个问题。
您将训练一个网络,以作品风格代表爵士音乐来创作爵士乐独奏。
1.1 数据集
你将在爵士音乐的语料库上训练你的算法。 运行下面的代码收听训练集中的音频片断:
IPython.display.Audio('./data/30s_seq.mp3')
我们已经对音乐数据做了预处理,以”values”来表示。可以非正式地将每个”value”看作一个音符,它包含音高和持续时间。 例如,如果您按下特定钢琴键0.5秒,那么您刚刚弹奏了一个音符。 在音乐理论中,”value” 实际上比这更复杂。 特别是,它还捕获了同时播放多个音符所需的信息。 例如,在播放音乐作品时,可以同时按下两个钢琴键(同时播放多个音符生成所谓的“和弦”)。 但是这里我们不需要关系音乐理论的细节。对于这个作业,你需要知道的是,我们获得一个”values”的数据集,并将学习一个RNN模型来生成一个序列的”values”。
我们的音乐生成系统将使用78个独特的值。 运行以下代码以加载原始音乐数据并将其预处理为”value”。
X, Y, n_values, indices_values = load_music_utils()
print('shape of X:', X.shape)
print('number of training examples:', X.shape[0])
print('Tx (length of sequence):', X.shape[1])
print('total # of unique values:', n_values)
print('Shape of Y:', Y.shape)
# shape of X: (60, 30, 78)
# number of training examples: 60
# Tx (length of sequence): 30
# total # of unique values: 78
# Shape of Y: (30, 60, 78)
- X: 这是一个(m,Tx,78)维数组。 m 表示样本数量,Tx 表示时间步(也即序列的长度),在每个时间步,输入是78个不同的可能值之一,表示为一个one-hot向量。 因此,例如,X [i,t,:]是表示第i个示例在时间t的值的one-hot向量。
- Y: 与X基本相同,但向左(向前)移动了一步。 与恐龙分配类似,使用先前值预测下一个值,所以我们的序列模型将尝试预测给定的 x⟨1⟩ x ⟨ 1 ⟩ ,…, x⟨t⟩ x ⟨ t ⟩ 。 但是,Y中的数据被重新排序为维(Ty,m,78),其中 Ty T y = Tx T x 。 这种格式使得稍后进入LSTM更方便。
- n_value: 数据集中独立”value”的个数,这里是78
- indices_values: python 字典:key 是0-77,value 是特定音符
1.2 模型概述
模型结构如下:
根据从更长的音乐中取得的30个随机片段来训练模型。 因此,这里不用设置第一个输入