In [1]:
%matplotlib inline
import matplotlib.pyplot as plt
plt.style.use('ggplot')
import pickle
import numpy as np
import librosa
import librosa.display
import IPython.display
import sklearn
from keras.models import Sequential
from keras.layers import Dense, CuDNNLSTM, Permute, Dropout
from keras.utils import to_categorical
from keras.models import Sequential
Using TensorFlow backend.
In [2]:
def show_history(history):
    print(history.history.keys())
    fig = plt.figure(figsize=(20,5))
    plt.subplot(121)
    plt.plot(history.history['acc'])
    plt.plot(history.history['val_acc'])
    plt.title('model accuracy')
    plt.ylabel('accuracy')
    plt.xlabel('epoch')
    plt.legend(['train', 'test'], loc='upper left')
    plt.subplot(122)
    plt.plot(history.history['loss'])
    plt.plot(history.history['val_loss'])
    plt.title('model loss')
    plt.ylabel('loss')
    plt.xlabel('epoch')
    plt.legend(['train', 'test'], loc='lower left')
    plt.show()
In [3]:
n_frame = 173
n_mfcc = 40
In [4]:
train_x = pickle.load(open('./train_x.dat', 'rb'))
train_y = pickle.load(open('./train_y.dat', 'rb'))
val_x = pickle.load(open('./val_x.dat', 'rb'))
val_y = pickle.load(open('./val_y.dat', 'rb'))
test_x = pickle.load(open('./test_x.dat', 'rb'))
test_y = pickle.load(open('./test_y.dat', 'rb'))

train_x = train_x.transpose((0,2,1))
val_x = val_x.transpose((0,2,1))
test_x = test_x.transpose((0,2,1))

train_y = to_categorical(train_y)
val_y = to_categorical(val_y)
test_y = to_categorical(test_y)
In [5]:
train_x.shape
Out[5]:
(2686, 173, 40)
In [6]:
model = Sequential()
model.add(CuDNNLSTM(units=256, input_shape = (n_frame, n_mfcc), return_sequences=True))
model.add(Dropout(0.25))
model.add(CuDNNLSTM(units=256, return_sequences=False))
model.add(Dropout(0.25))
# model.add(Dense(256, activation='relu'))
model.add(Dense(10, activation='softmax'))
model.compile(loss='categorical_crossentropy', 
              optimizer='Adam', 
              metrics=['accuracy'])
model.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
cu_dnnlstm_1 (CuDNNLSTM)     (None, 173, 256)          305152    
_________________________________________________________________
dropout_1 (Dropout)          (None, 173, 256)          0         
_________________________________________________________________
cu_dnnlstm_2 (CuDNNLSTM)     (None, 256)               526336    
_________________________________________________________________
dense_1 (Dense)              (None, 256)               65792     
_________________________________________________________________
dropout_2 (Dropout)          (None, 256)               0         
_________________________________________________________________
dense_2 (Dense)              (None, 10)                2570      
=================================================================
Total params: 899,850
Trainable params: 899,850
Non-trainable params: 0
_________________________________________________________________
In [7]:
history = model.fit(train_x, train_y,
                    epochs=20, batch_size=32,
                    validation_data=(test_x, test_y))
show_history(history)
Train on 2686 samples, validate on 837 samples
Epoch 1/20
2686/2686 [==============================] - 19s 7ms/step - loss: 2.1119 - acc: 0.2018 - val_loss: 2.0881 - val_acc: 0.2151
Epoch 2/20
2686/2686 [==============================] - 17s 6ms/step - loss: 1.8152 - acc: 0.3470 - val_loss: 1.8617 - val_acc: 0.2796
Epoch 3/20
2686/2686 [==============================] - 18s 7ms/step - loss: 1.5683 - acc: 0.4274 - val_loss: 1.9274 - val_acc: 0.3082
Epoch 4/20
2686/2686 [==============================] - 18s 7ms/step - loss: 1.3495 - acc: 0.5026 - val_loss: 1.7932 - val_acc: 0.3548
Epoch 5/20
2686/2686 [==============================] - 18s 7ms/step - loss: 1.1512 - acc: 0.5830 - val_loss: 1.7733 - val_acc: 0.4158
Epoch 6/20
2686/2686 [==============================] - 18s 7ms/step - loss: 1.0065 - acc: 0.6381 - val_loss: 1.8237 - val_acc: 0.3644
Epoch 7/20
2686/2686 [==============================] - 18s 7ms/step - loss: 0.8727 - acc: 0.6761 - val_loss: 1.9882 - val_acc: 0.4026
Epoch 8/20
2686/2686 [==============================] - 18s 7ms/step - loss: 0.7362 - acc: 0.7465 - val_loss: 1.9186 - val_acc: 0.4050
Epoch 9/20
2686/2686 [==============================] - 18s 7ms/step - loss: 0.5799 - acc: 0.7911 - val_loss: 2.0587 - val_acc: 0.3883
Epoch 10/20
2686/2686 [==============================] - 18s 7ms/step - loss: 0.3542 - acc: 0.8768 - val_loss: 2.3767 - val_acc: 0.3811
Epoch 11/20
2686/2686 [==============================] - 18s 7ms/step - loss: 0.3207 - acc: 0.8931 - val_loss: 2.4279 - val_acc: 0.3883
Epoch 12/20
2686/2686 [==============================] - 18s 7ms/step - loss: 0.5503 - acc: 0.8295 - val_loss: 2.2614 - val_acc: 0.3978
Epoch 13/20
2686/2686 [==============================] - 18s 7ms/step - loss: 0.2183 - acc: 0.9278 - val_loss: 2.3521 - val_acc: 0.4289
Epoch 14/20
2686/2686 [==============================] - 19s 7ms/step - loss: 0.1228 - acc: 0.9654 - val_loss: 2.8068 - val_acc: 0.3740
Epoch 15/20
2686/2686 [==============================] - 18s 7ms/step - loss: 0.0727 - acc: 0.9792 - val_loss: 2.8658 - val_acc: 0.4158
Epoch 16/20
2686/2686 [==============================] - 18s 7ms/step - loss: 0.0517 - acc: 0.9866 - val_loss: 2.9393 - val_acc: 0.4158
Epoch 17/20
2686/2686 [==============================] - 18s 7ms/step - loss: 0.0470 - acc: 0.9899 - val_loss: 2.9615 - val_acc: 0.4289
Epoch 18/20
2686/2686 [==============================] - 18s 7ms/step - loss: 0.0387 - acc: 0.9911 - val_loss: 3.1810 - val_acc: 0.4205
Epoch 19/20
2686/2686 [==============================] - 18s 7ms/step - loss: 0.0797 - acc: 0.9769 - val_loss: 3.0956 - val_acc: 0.3931
Epoch 20/20
2686/2686 [==============================] - 18s 7ms/step - loss: 0.1127 - acc: 0.9617 - val_loss: 2.9729 - val_acc: 0.3990
dict_keys(['val_loss', 'val_acc', 'loss', 'acc'])