![深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network ) 深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network )](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczOS9lOGRkODVkZDA5NDAyZDYzM2E1NDNjMzFmMjg1ZmJhMy5wbmc=)
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
![深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network ) 深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network )](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzk0OC9jYWNkYzI5NDE4NWQwNzkyZTA1ODgzOTNlZTZlZDk1NC5wbmc=)
![深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network ) 深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network )](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczMy9mNjgzNGQyNjA1OGVhOTQ2MDkzNDNhZDljNjQyMmQwNS5wbmc=)
IPython.display.Audio('./data/30s_seq.mp3')
![深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network ) 深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network )](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzEzNS9iMDAxM2MzMzEzZDIzNWNmNWY0MGNiM2E1Yjc0MTY0Zi5wbmc=)
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)
![深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network ) 深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network )](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzE1My9kYzdjNDEzYjA2NzMwYjkyOGFmMmUzYTRhZjI0MDMxMS5wbmc=)
![深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network ) 深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network )](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzU3Mi84OGZjNDZlYWZlYTY3MmRiYjAzZGI4OGIyMDNlMmUwYy5wbmc=)
![深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network ) 深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network )](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzkzNC83MTAzY2VjMWU4MDIwMzcyNjBlMjI5Nzk4ZDhjZDEwZS5wbmc=)
![深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network ) 深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network )](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzE4NS9jNDQzYzNiMzQzNTk1MjBkMWMyNjVkODQ5Njg3MzJhMS5wbmc=)
n_a = 64
![深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network ) 深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network )](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMzOS81YzdiZjA3ZjNjMzVkNDQzMzlhZWU0OGJjZWM2NzI4Yi5wbmc=)
reshapor = Reshape((1, 78)) # Used in Step 2.B of djmodel(), below
LSTM_cell = LSTM(n_a, return_state = True) # Used in Step 2.C
densor = Dense(n_values, activation='softmax') # Used in Step 2.D
![深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network ) 深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network )](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQxMS8wNmZjZjkwOWFkZDE0MzJlYzExZTFhZDExNjZhM2ZmYi5wbmc=)
![深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network ) 深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network )](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzU1MC82MDAxZjgxNTdjZWU1Zjk1MTA3MjFjZGFkNjZkNmM1Ni5wbmc=)
# GRADED FUNCTION: djmodel
def djmodel(Tx, n_a, n_values):
"""
Implement the model
Arguments:
Tx -- length of the sequence in a corpus
n_a -- the number of activations used in our model
n_values -- number of unique values in the music data
Returns:
model -- a keras model with the
"""
# Define the input of your model with a shape
X = Input(shape=(Tx, n_values))
# Define s0, initial hidden state for the decoder LSTM
a0 = Input(shape=(n_a,), name='a0')
c0 = Input(shape=(n_a,), name='c0')
a = a0
c = c0
### START CODE HERE ###
# Step 1: Create empty list to append the outputs while you iterate (≈1 line)
outputs = []
# Step 2: Loop
for t in range(Tx):
# Step 2.A: select the "t"th time step vector from X.
x = Lambda(lambda x: X[:,t,:])(X)
# Step 2.B: Use reshapor to reshape x to be (1, n_values) (≈1 line)
x = reshapor(x)
# Step 2.C: Perform one step of the LSTM_cell
a, _, c = LSTM_cell(x, initial_state=[a, c])
# Step 2.D: Apply densor to the hidden state output of LSTM_Cell
out = densor(a)
# Step 2.E: add the output to "outputs"
outputs.append(out)
# Step 3: Create model instance
model = Model(inputs=[X, a0, c0], outputs=outputs)
### END CODE HERE ###
return model
model = djmodel(Tx = 30 , n_a = 64, n_values = 78)
opt = Adam(lr=0.01, beta_1=0.9, beta_2=0.999, decay=0.01)
model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy'])
m = 60
a0 = np.zeros((m, n_a))
c0 = np.zeros((m, n_a))
model.fit([X, a0, c0], list(Y), epochs=100)
![深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network ) 深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network )](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzYxL2E3YzQxZWU5MzIzMDZlZjA5MTEwNTQ4MmQwY2IzYWFkLnBuZw==)
![深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network ) 深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network )](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzY1Ni9kMjQ3MTNmNDIwNWEzNzg4OTYzYjRiNTBiODc4NjUwMC5wbmc=)
![深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network ) 深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network )](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzYyNi9kYjhmNDI3NzEwOThmODljNWNmNTc5Yzc1ZWEwOWVkYS5wbmc=)
# GRADED FUNCTION: music_inference_model
def music_inference_model(LSTM_cell, densor, n_values = 78, n_a = 64, Ty = 100):
"""
Uses the trained "LSTM_cell" and "densor" from model() to generate a sequence of values.
Arguments:
LSTM_cell -- the trained "LSTM_cell" from model(), Keras layer object
densor -- the trained "densor" from model(), Keras layer object
n_values -- integer, umber of unique values
n_a -- number of units in the LSTM_cell
Ty -- integer, number of time steps to generate
Returns:
inference_model -- Keras model instance
"""
# Define the input of your model with a shape
x0 = Input(shape=(1, n_values))
# Define s0, initial hidden state for the decoder LSTM
a0 = Input(shape=(n_a,), name='a0')
c0 = Input(shape=(n_a,), name='c0')
a = a0
c = c0
x = x0
### START CODE HERE ###
# Step 1: Create an empty list of "outputs" to later store your predicted values (≈1 line)
outputs = []
# Step 2: Loop over Ty and generate a value at every time step
for t in range(Ty):
# Step 2.A: Perform one step of LSTM_cell (≈1 line)
a, _, c = LSTM_cell(x, initial_state=[a, c])
# Step 2.B: Apply Dense layer to the hidden state output of the LSTM_cell (≈1 line)
out = densor(a)
# Step 2.C: Append the prediction "out" to "outputs". out.shape = (None, 78) (≈1 line)
outputs.append(out)
# Step 2.D: Select the next value according to "out", and set "x" to be the one-hot representation of the
# selected value, which will be passed as the input to LSTM_cell on the next step. We have provided
# the line of code you need to do this.
x = Lambda(one_hot)(out)
# Step 3: Create model instance with the correct "inputs" and "outputs" (≈1 line)
inference_model = Model(inputs=[x0, a0, c0], outputs=outputs)
### END CODE HERE ###
return inference_model
inference_model = music_inference_model(LSTM_cell, densor, n_values = 78, n_a = 64, Ty = 50)
x_initializer = np.zeros((1, 1, 78))
a_initializer = np.zeros((1, n_a))
c_initializer = np.zeros((1, n_a))
![深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network ) 深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network )](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzY0OS8yYjdlM2QwOTdkNTBmM2MwNzRmMDk5MzVhOWY4Y2NkOS5wbmc=)
# GRADED FUNCTION: predict_and_sample
def predict_and_sample(inference_model, x_initializer = x_initializer, a_initializer = a_initializer,
c_initializer = c_initializer):
"""
Predicts the next value of values using the inference model.
Arguments:
inference_model -- Keras model instance for inference time
x_initializer -- numpy array of shape (1, 1, 78), one-hot vector initializing the values generation
a_initializer -- numpy array of shape (1, n_a), initializing the hidden state of the LSTM_cell
c_initializer -- numpy array of shape (1, n_a), initializing the cell state of the LSTM_cel
Returns:
results -- numpy-array of shape (Ty, 78), matrix of one-hot vectors representing the values generated
indices -- numpy-array of shape (Ty, 1), matrix of indices representing the values generated
"""
### START CODE HERE ###
# Step 1: Use your inference model to predict an output sequence given x_initializer, a_initializer and c_initializer.
pred = inference_model.predict([x_initializer, a_initializer, c_initializer])
# Step 2: Convert "pred" into an np.array() of indices with the maximum probabilities
indices = np.argmax(pred, axis=-1)
# Step 3: Convert indices to one-hot vectors, the shape of the results should be (1, )
results = to_categorical(indices, num_classes=78)
### END CODE HERE ###
return results, indices
results, indices = predict_and_sample(inference_model, x_initializer, a_initializer, c_initializer)
print("np.argmax(results[12]) =", np.argmax(results[12]))
print("np.argmax(results[17]) =", np.argmax(results[17]))
print("list(indices[12:18]) =", list(indices[12:18]))
np.argmax(results[12]) = 28
np.argmax(results[17]) = 59
list(indices[12:18]) = [array([28]), array([55]), array([15]), array([76]), array([38]), array([59])]
![深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network ) 深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network )](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzUwOC8xNDhlMWRjNGIxZjczMjQ3N2QyZDkyZTc3ZTQxYzJjYy5wbmc=)
out_stream = generate_music(inference_model)
IPython.display.Audio('./data/30s_trained_model.mp3')
![深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network ) 深度学习-序列模型 吴恩达第五课第一周作业3答案(Improvise a Jazz Solo with an LSTM Network )](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzk1Ni8wMTg2M2JkOWIyNzMzNmQyY2Q1MGQ0ZDAwNzYxN2I0Yy5wbmc=)