{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"collapsed":true},"cell_type":"code","source":"import IPython.display as ipd\nimport librosa as lb\nimport librosa.display as ld\nimport sklearn as sk\nimport seaborn as sb\nimport plotly as ply\nimport scipy as sp\nfrom scipy import signal\nfrom scipy.fftpack import fft","execution_count":1,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true,"collapsed":true},"cell_type":"code","source":"%pylab inline\nimport os\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt","execution_count":2,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"a8caae6852bb5b99071df37fdb676f7616a8711b"},"cell_type":"code","source":"root_path = r'..'\nout_path = r'.'\nmodel_path = r'.'\ntrain_path = os.path.join(root_path, 'input', 'train', 'audio')\ntest_path = os.path.join(root_path, 'input', 'test', 'audio')","execution_count":3,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"0218ecad9647987dba9c6f854087a85564e66301"},"cell_type":"code","source":"data, sampling_rate = lb.load(train_path + '/_background_noise_/dude_miaowing.wav')","execution_count":4,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"afe9c86a23bc9f482b8d31267d8c30558a75879e","collapsed":true},"cell_type":"code","source":"print(data, sampling_rate)","execution_count":5,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"cd6aea35218b45167f0edc074e278be83ed9eff2"},"cell_type":"code","source":"import random\ndef log_spectrogram(audio, sampling_rate, window_size=20, step_size=10, eps=1e-10):\n    nps = int(round(window_size * sampling_rate / 1e3))\n    nol = int(round(step_size * sampling_rate / 1e3))\n    frequencies, times, specs = signal.spectrogram(audio, fs=sampling_rate, window='hann', nperseg=nps, noverlap=nol, detrend=False)\n    return frequencies, times, np.log(specs.T.astype(np.float32) + eps)","execution_count":6,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"21799e7c77608e1e4828857ec2aee56954648ca4","collapsed":true},"cell_type":"code","source":"file = train_path + '/tree/0e4d22f1_nohash_0.wav'\nsampling_rate, samples = sp.io.wavfile.read(file)\n\nfrequencies, times, spectrogram = log_spectrogram(samples, sampling_rate)\n\nfig = plt.figure(figsize=(14,8))\nax1 = fig.add_subplot(211)\nax1.set_title('Raw Wave of ' + file)\nax1.set_ylabel('Amplitude')\nax1.plot(np.linspace(0, sampling_rate/len(samples), sampling_rate), samples)\nax2 = fig.add_subplot(212)\nax2.imshow(spectrogram.T, aspect='auto', origin='lower', extent=[times.min(), times.max(), frequencies.min(), frequencies.max()])\nax2.set_yticks(frequencies[::16])\nax2.set_xticks(times[::16])\nax2.set_title('Spectrogram of ' + file)\nax2.set_ylabel('Frequencies in Hz')\nax2.set_xlabel('Seconds')","execution_count":7,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"d61fd568d8caa6cc56bc5289f7771248aab1d7ee","collapsed":true},"cell_type":"code","source":"mean = np.mean(spectrogram, axis=0)\nstd = np.std(spectrogram, axis=0)\nspectrogram = (spectrogram - mean) / std\nprint(spectrogram)","execution_count":8,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"840f0dd3d7fa3bf28e6fab14b1e62d6f737dd9d1"},"cell_type":"code","source":"train_pic_path = os.path.join(root_path, 'input', 'train')\ntest_pic_path = os.path.join(root_path, 'input', 'test')\n","execution_count":9,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"532ab78759e83533754034d0938f548eb1f1e1f4","collapsed":true},"cell_type":"code","source":"import matplotlib as mpl\nfrom keras import backend as K\nfrom keras.datasets import mnist\nfrom keras.models import Sequential\nfrom keras.layers import Dense, Dropout, Activation\nfrom keras.layers import Flatten, Conv2D, MaxPooling2D, GRU\nfrom keras.optimizers import SGD, Adam, RMSprop, Adadelta\nfrom keras.utils import np_utils, plot_model\nfrom keras.layers.normalization import BatchNormalization\nfrom keras.layers.advanced_activations import LeakyReLU, PReLU\nfrom keras.callbacks import LearningRateScheduler\nfrom keras.preprocessing.sequence import pad_sequences\nfrom keras.layers.recurrent import SimpleRNN, LSTM \nfrom keras.layers.embeddings import Embedding\n","execution_count":10,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"3b0ef8d642781f7027f59c912f22fe94cd088d6b"},"cell_type":"code","source":"mpl.rc('font', family = 'serif', size = 17)\nmpl.rcParams['xtick.major.size'] = 5\nmpl.rcParams['xtick.minor.size'] = 2\nmpl.rcParams['ytick.major.size'] = 5\nmpl.rcParams['ytick.minor.size'] = 2","execution_count":11,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"95519f8a05a070d2acf3fa2e85ecf6501e568fbf"},"cell_type":"code","source":"hyper_pwr = 0.5\nhyper_train_ratio = 0.9\nhyper_n = 25\nhyper_m = 15\nhyper_NR = 208\nhyper_NC = 112\nhyper_delta = 0.3\nhyper_dropout0 = 0.2\nhyper_dropout1 = 0.4\nhyper_dropout2 = 0.6\nhyper_dropout3 = 0.6\nhyper_dropout4 = 0.4\nhyper_dropout5 = 0.7\n\ntarget_labels = ['yes', 'no', 'up', 'down', 'left', 'right', 'on', 'off', 'stop', 'go', 'silence', 'unknown']","execution_count":12,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"92f4b245eb639cdfa19d32450f149eff574a8922"},"cell_type":"code","source":"L = 16000\ndef load_audio_data(path, ltoi):\n    x = []\n    y = []\n    for i, folder in enumerate(os.listdir(path)):\n        for filename in os.listdir(path + '/' + folder):\n            if filename == 'README.md':\n                continue\n            rate, sample = wavfile.read(train_path + '/' + folder + '/' + filename)\n            assert(rate == L)\n            if folder == '_background_noise_':\n                length = len(sample)\n                for j in range(int(length/rate)):\n                    x.append(np.array(sample[j*rate: (j+1)*rate]))\n                    y.append(ltoi['silence'])\n            else:\n                x.append(np.array(sample))\n                label = folder\n                if folder not in target_labels:\n                    label = 'unknown'\n                y.append(ltoi[label])\n    x = np.array(pad_sequences(x, maxlen=L))\n    y = np.array(y)\n    df = pd.DataFrame()\n    df['x'] = list(x)\n    df['y'] = list(y)\n    return df","execution_count":13,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"0bba05312b9ac994f1b6156988c1bfbc62b8405f","collapsed":true},"cell_type":"code","source":"import os\nos.listdir('{0}/_background_noise_'.format(train_path))","execution_count":14,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"2d2786472c10f48343022e5b76e24d16daab76d2","collapsed":true},"cell_type":"code","source":"from scipy.io import wavfile\nprint(\"LOADING RAW DATA!\")\nlabel2idx = {}\nidmap = {}\nfor i,lab in enumerate(target_labels):\n    label2idx[lab] = i\n    idmap[i] = lab\nraw_df = load_audio_data(train_path, label2idx)\nprint(label2idx)\nprint(idmap)\nprint(raw_df.x.as_matrix().shape)\nprint(raw_df.y.as_matrix().shape)","execution_count":15,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"aa4311bacc098c52c45b758d49974927842fda9a"},"cell_type":"code","source":"from sklearn.decomposition import PCA\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom sklearn.utils import shuffle\n","execution_count":16,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"0cddf21e23a1bf2139ab4b8e568a3493f03e7ab3","collapsed":true},"cell_type":"code","source":"# Split train, test sets, and also return label_map\ndef train_test_split(df, train_ratio = 0.2, test_ratio = 0.1):\n    \n    test_x = []\n    test_y = []\n    train_x = []\n    train_y = []\n    for i in set(df.y.tolist()):\n        tmp_df = df[df.y == i]\n        tmp_df = shuffle(tmp_df)\n        tmp_n = int(len(tmp_df)*train_ratio)\n        tmp_m = int(len(tmp_df)*test_ratio)\n        train_x += tmp_df.x.tolist()[: tmp_n]\n        test_x += tmp_df.x.tolist()[tmp_n: tmp_n + tmp_m]\n        train_y += tmp_df.y.tolist()[: tmp_n]\n        test_y += tmp_df.y.tolist()[tmp_n: tmp_n + tmp_m]\n    return np.array(train_x), np.array(train_y), np.array(test_x), np.array(test_y)\n## Parsing the data Frame into train and test sets\nprint(\"SPLITTING DATA INTO TRAIN AND TEST SETS!\")\ntr_x, tr_y, ts_x, ts_y = train_test_split(raw_df, 0.3, 0.1)\nprint(tr_x.shape)\nprint(tr_y.shape)\nprint(ts_x.shape)\nprint(ts_y.shape)\ndel raw_df","execution_count":17,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"228aedda1c037c3701c446622a567296db88265f","collapsed":true},"cell_type":"code","source":"base = min(tr_x.min(), ts_x.min())\nprint(base)\ntr_x = tr_x - base\nts_x = ts_x - base\nUPPER_X = max(tr_x.max(), ts_x.max()) + 1\nprint(UPPER_X)\nprint(tr_x[0])","execution_count":18,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"cfaff2c4ec72c51b3514aa0dfddef6d3521beecc","collapsed":true},"cell_type":"code","source":"print(tr_x[0])\nprint(tr_x.max())\nprint(ts_x.max())\nprint(tr_x.min())\nprint(ts_x.min())\n","execution_count":19,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"db618e04e4357cc02dd213a2285ab80cd8643fb1"},"cell_type":"code","source":"def comp_cls_wts(y, pwr = 0.5):\n    dic = {}\n    for x in set(y):\n        dic[x] = len(y)**pwr/list(y).count(x)**pwr\n    return dic","execution_count":20,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"1169066165342c1e43ca2baead3e5476c8459c56","collapsed":true},"cell_type":"code","source":"cls_wts = comp_cls_wts(tr_y)\nprint(cls_wts)","execution_count":21,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"e90e00b66a8a3c2edc6f5bef79e52f1d8d6ddb7f","collapsed":true},"cell_type":"code","source":"NUM_CLS = len(target_labels)\ntr_y = np_utils.to_categorical(tr_y, num_classes=NUM_CLS)\nts_y = np_utils.to_categorical(ts_y, num_classes=NUM_CLS)","execution_count":22,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"01f032cd8a4121c0a233f350cfc9a8769d6c0399","collapsed":true},"cell_type":"code","source":"model = Sequential()\nmodel.add(Embedding(UPPER_X, 128, input_length=L))\nmodel.add(SimpleRNN(512))\nmodel.add(Dense(64, activation='relu'))\nmodel.add(Dense(NUM_CLS, activation='softmax'))\nmodel.summary()","execution_count":23,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"fbe046b863da0ad79ab5acfd2ab4b096e7c16f1f"},"cell_type":"code","source":"optimizer = SGD()\nmetrics = ['accuracy']\nloss = 'categorical_crossentropy'\nmodel.compile(optimizer = optimizer, loss = loss, metrics = metrics)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"4ce49dbc96d7461fe7ed1fb94bf30c2f75654788","collapsed":true},"cell_type":"code","source":"res = model.fit(tr_x[:1000], tr_y[:1000], batch_size = 64,epochs = 5, validation_data = (ts_x[:330], ts_y[:330]), class_weight = cls_wts)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"1392ffe0e10f953e0b01a574f68383a101b72017","collapsed":true},"cell_type":"code","source":"import gc\ngc.collect()","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.5","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}