In [1]:
import numpy as np
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.optimizers import SGD
from keras.layers.normalization import BatchNormalization

from sklearn.preprocessing import StandardScaler
from sklearn.externals import joblib

from read_dataset import read_ceps3d_with_train_test
from read_saved_models import loadMfcc3dStanderdScaler


Using TensorFlow backend.

In [2]:
def getStanderizedData(data):
    data_shape = data.shape
    n = data_shape[0]
    reshaped_data = data.reshape(n, -1)
    saved_ss = loadMfcc3dStanderdScaler()
    trasformed_data = saved_ss.transform(reshaped_data)
    ret_data = trasformed_data.reshape(data_shape)
    return ret_data

In [3]:
def createStdScaler():
    file_path = "../data/songData/genres/x_3d_all_data.npy"
    all_x_data = np.load(file_path)
    n = all_x_data.shape[0]
    reshaped_data = all_x_data.reshape(n, -1)

    ss = StandardScaler()
    ss.fit(reshaped_data)
    joblib.dump(ss, './savedStanderdScaler/mfcc_3d_ss.pkl')

In [4]:
X_train, X_test, y_train, y_test = read_ceps3d_with_train_test()

In [5]:
X_ss_train= getStanderizedData(X_train)
X_ss_test= getStanderizedData(X_test)

In [6]:
print(X_ss_train.shape)
print(X_ss_test.shape)
print(y_train.shape)
print(y_test.shape)


(600, 3, 30, 1293)
(400, 3, 30, 1293)
(600, 10)
(400, 10)

In [7]:
model = Sequential()

# the model is convolutional with layer of 30 * 1293
model.add(Conv2D(500, (10, 10), activation='relu',
                 input_shape=(3, 30, 1293),
                 data_format='channels_first'))
model.add(MaxPooling2D(pool_size=(5, 5)))
model.add(Dropout(0.5))
model.add(BatchNormalization())

model.add(Conv2D(50, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.4))
model.add(BatchNormalization())

model.add(Flatten())
model.add(Dense(300, activation='relu'))
model.add(Dropout(0.3))
model.add(BatchNormalization())
    
model.add(Dense(10, activation='softmax'))

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy', 'categorical_accuracy'])

In [8]:
result = model.fit(X_ss_train, y_train, batch_size=30, epochs=10, validation_split=0.2)


Train on 480 samples, validate on 120 samples
Epoch 1/10
480/480 [==============================] - 1490s - loss: 2.6756 - acc: 0.1729 - categorical_accuracy: 0.1729 - val_loss: 13.0046 - val_acc: 0.1250 - val_categorical_accuracy: 0.1250
Epoch 2/10
480/480 [==============================] - 1070s - loss: 2.1199 - acc: 0.3083 - categorical_accuracy: 0.3083 - val_loss: 12.9228 - val_acc: 0.1250 - val_categorical_accuracy: 0.1250
Epoch 3/10
480/480 [==============================] - 1096s - loss: 1.9118 - acc: 0.3583 - categorical_accuracy: 0.3583 - val_loss: 11.9006 - val_acc: 0.1500 - val_categorical_accuracy: 0.1500
Epoch 4/10
480/480 [==============================] - 1066s - loss: 1.6578 - acc: 0.4438 - categorical_accuracy: 0.4438 - val_loss: 10.5433 - val_acc: 0.1583 - val_categorical_accuracy: 0.1583
Epoch 5/10
480/480 [==============================] - 1054s - loss: 1.4977 - acc: 0.4958 - categorical_accuracy: 0.4958 - val_loss: 8.9539 - val_acc: 0.2333 - val_categorical_accuracy: 0.2333
Epoch 6/10
480/480 [==============================] - 1054s - loss: 1.3380 - acc: 0.5500 - categorical_accuracy: 0.5500 - val_loss: 4.6717 - val_acc: 0.2750 - val_categorical_accuracy: 0.2750
Epoch 7/10
480/480 [==============================] - 1050s - loss: 1.1301 - acc: 0.6188 - categorical_accuracy: 0.6188 - val_loss: 4.0482 - val_acc: 0.2750 - val_categorical_accuracy: 0.2750
Epoch 8/10
480/480 [==============================] - 1054s - loss: 1.0953 - acc: 0.6125 - categorical_accuracy: 0.6125 - val_loss: 2.4325 - val_acc: 0.3583 - val_categorical_accuracy: 0.3583
Epoch 9/10
480/480 [==============================] - 1052s - loss: 0.9810 - acc: 0.6667 - categorical_accuracy: 0.6667 - val_loss: 2.4126 - val_acc: 0.3417 - val_categorical_accuracy: 0.3417
Epoch 10/10
480/480 [==============================] - 1051s - loss: 0.8493 - acc: 0.7083 - categorical_accuracy: 0.7083 - val_loss: 2.2908 - val_acc: 0.3917 - val_categorical_accuracy: 0.3917

In [9]:
score = model.evaluate(X_ss_test, y_test, batch_size=30)
print(model.metrics_names)
print(score)


400/400 [==============================] - 496s    
['loss', 'acc', 'categorical_accuracy']
[2.3172718316316603, 0.39750000722706319, 0.39750000722706319]

In [10]:
model_filepath = "./savedModels/ceps_cnn3d_model.h5"
model.save(model_filepath)

In [11]:
from matplotlib import pyplot as plt
%matplotlib inline

plt.plot(range(10), result.history['acc'], label='train accuracy')
plt.plot(range(10), result.history['val_acc'], label='test accuracy')
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))


Out[11]:
<matplotlib.legend.Legend at 0x7fdcb67d4860>