第三个作业是用LSTM来生成爵士乐。
Part3:Improvise a Jazz Solo with an LSTM Network
我们已经对音乐数据做了预处理,以”values”来表示。可以非正式地将每个”value”看作一个音符,它包含音高和持续时间。 例如,如果您按下特定钢琴键0.5秒,那么您刚刚弹奏了一个音符。 在音乐理论中,”value” 实际上比这更复杂。 特别是,它还捕获了同时播放多个音符所需的信息。 例如,在播放音乐作品时,可以同时按下两个钢琴键(同时播放多个音符生成所谓的“和弦”)。 但是这里我们不需要关系音乐理论的细节。对于这个作业,你需要知道的是,我们获得一个”values”的数据集,并将学习一个RNN模型来生成一个序列的”values”。
我们的音乐生成系统将使用78个独特的值。
- X: 这是一个(m,Tx,78)维数组。 m 表示样本数量,Tx 表示时间步(也即序列的长度),在每个时间步,输入是78个不同的可能值之一,表示为一个one-hot向量。 因此,例如,X [i,t,:]是表示第i个示例在时间t的值的one-hot向量。
- Y: 与X基本相同,但向左(向前)移动了一步。 与恐龙分配类似,使用先前值预测下一个值,所以我们的序列模型将尝试预测给定的x⟨t⟩。 但是,Y中的数据被重新排序为维(Ty,m,78),其中Ty = Tx。 这种格式使得稍后进入LSTM更方便。
- n_value: 数据集中独立”value”的个数,这里是78
- indices_values: python 字典:key 是0-77,value 是特定音符
模型结构如下:
这里用了3个keras函数来定义:
1 | reshapor = Reshape((1, 78)) # Used in Step 2.B of djmodel(), below |
1 | # GRADED FUNCTION: djmodel |
1 | model = djmodel(Tx = 30 , n_a = 64, n_values = 78) |
1 | opt = Adam(lr=0.01, beta_1=0.9, beta_2=0.999, decay=0.01) |
1 | m = 60 |
1 | model.fit([X, a0, c0], list(Y), epochs=100) |
生成音乐的模型
1 | # GRADED FUNCTION: music_inference_model |
1 | inference_model = music_inference_model(LSTM_cell, densor, n_values = 78, n_a = 64, Ty = 50) |
1 | x_initializer = np.zeros((1, 1, 78)) |
1 | # GRADED FUNCTION: predict_and_sample |
1 | out_stream = generate_music(inference_model) |