├── images ├── log.png ├── spectogram.png └── augmentation.png ├── featuring └── features.py ├── LICENSE ├── bayes └── spectrogram-bayes.ipynb ├── lgb ├── spectrogram-lgb.ipynb └── log-lgb.ipynb ├── README.md ├── deep-learning ├── feature-feedforward.ipynb ├── spectrogram-feedforward.ipynb ├── spectrogram-rnn.ipynb └── spectrogram-cnn.ipynb └── xgb └── log-xgb.ipynb /images/log.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huseinzol05/Signal-Classification-Comparison/HEAD/images/log.png -------------------------------------------------------------------------------- /images/spectogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huseinzol05/Signal-Classification-Comparison/HEAD/images/spectogram.png -------------------------------------------------------------------------------- /images/augmentation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huseinzol05/Signal-Classification-Comparison/HEAD/images/augmentation.png -------------------------------------------------------------------------------- /featuring/features.py: -------------------------------------------------------------------------------- 1 | import scipy.io.wavfile as wav 2 | import numpy as np 3 | import speechpy 4 | 5 | def extract_features(signal, fs): 6 | frames = speechpy.processing.stack_frames(signal, sampling_frequency=fs, frame_length=0.020, frame_stride=0.01, filter=lambda x: np.ones((x,)),zero_padding=True) 7 | power_spectrum = speechpy.processing.power_spectrum(frames, fft_points=1) 8 | logenergy = speechpy.feature.lmfe(signal, sampling_frequency=fs, frame_length=0.020, frame_stride=0.01,num_filters=1, fft_length=512, low_frequency=0, high_frequency=None) 9 | mfcc = speechpy.feature.mfcc(signal, sampling_frequency=fs, frame_length=0.020, frame_stride=0.01,num_filters=1, fft_length=512, low_frequency=0, high_frequency=None) 10 | mfcc_cmvn = speechpy.processing.cmvnw(mfcc,win_size=301,variance_normalization=True) 11 | mfcc_feature_cube = speechpy.feature.extract_derivative_feature(mfcc) 12 | return np.hstack([power_spectrum[:,0],logenergy[:,0],mfcc_cmvn[:,0],mfcc_feature_cube[:,0,1]]) 13 | 14 | fs, signal = wav.read('file.wav') 15 | extract_features(signal, fs).tolist() 16 | 17 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 HUSEIN ZOLKEPLI 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /bayes/spectrogram-bayes.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": true 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "import tensorflow as tf\n", 12 | "import numpy as np\n", 13 | "import matplotlib.mlab\n", 14 | "import scipy.io.wavfile\n", 15 | "import scipy\n", 16 | "import os\n", 17 | "import time\n", 18 | "from sklearn import metrics\n", 19 | "import matplotlib.pyplot as plt\n", 20 | "import seaborn as sns\n", 21 | "from sklearn.naive_bayes import MultinomialNB\n", 22 | "from scipy import sparse\n", 23 | "sns.set()" 24 | ] 25 | }, 26 | { 27 | "cell_type": "code", 28 | "execution_count": 2, 29 | "metadata": { 30 | "collapsed": true 31 | }, 32 | "outputs": [], 33 | "source": [ 34 | "def processAudio(folder, sound_dimension = [128, 128]):\n", 35 | " location = folder + '/'\n", 36 | " elements = os.listdir(location)\n", 37 | " results,labels = [], []\n", 38 | " for i in elements:\n", 39 | " try:\n", 40 | " fs, data = scipy.io.wavfile.read(location+i)\n", 41 | " try:\n", 42 | " data = np.mean(data, axis = 1)\n", 43 | " except:\n", 44 | " pass\n", 45 | " audio = matplotlib.mlab.specgram(data)[0]\n", 46 | " audio = scipy.misc.imresize(audio, sound_dimension)\n", 47 | " audio = audio.astype('float64')\n", 48 | " results.append(sparse.csr_matrix(audio.flatten()))\n", 49 | " labels.append(folder)\n", 50 | " except Exception as e:\n", 51 | " print(e)\n", 52 | " continue\n", 53 | " return sparse.vstack(results), labels" 54 | ] 55 | }, 56 | { 57 | "cell_type": "code", 58 | "execution_count": 3, 59 | "metadata": { 60 | "collapsed": true 61 | }, 62 | "outputs": [], 63 | "source": [ 64 | "folders = [i for i in os.listdir(os.getcwd())if i.find('.md') < 0 and i.find('.txt') < 0 and i.find('ipynb') < 0 and i.find('LICENSE') < 0 and i.find('_background_noise_') < 0]" 65 | ] 66 | }, 67 | { 68 | "cell_type": "code", 69 | "execution_count": 4, 70 | "metadata": {}, 71 | "outputs": [ 72 | { 73 | "name": "stdout", 74 | "output_type": "stream", 75 | "text": [ 76 | "yes\n", 77 | "marvin\n", 78 | "off\n", 79 | "happy\n", 80 | "bed\n", 81 | "house\n", 82 | "up\n", 83 | "six\n", 84 | "go\n", 85 | "four\n", 86 | "nine\n", 87 | "left\n", 88 | "no\n", 89 | "three\n", 90 | "wow\n", 91 | "sheila\n", 92 | "right\n", 93 | "on\n", 94 | "five\n", 95 | "seven\n", 96 | "zero\n", 97 | "stop\n", 98 | "one\n", 99 | "down\n", 100 | "bird\n", 101 | "tree\n", 102 | "eight\n", 103 | "dog\n", 104 | "two\n", 105 | "cat\n" 106 | ] 107 | } 108 | ], 109 | "source": [ 110 | "output,label = [], []\n", 111 | "for i in folders:\n", 112 | " print(i)\n", 113 | " out = processAudio(i)\n", 114 | " output.append(out[0])\n", 115 | " label += out[1]" 116 | ] 117 | }, 118 | { 119 | "cell_type": "code", 120 | "execution_count": 5, 121 | "metadata": {}, 122 | "outputs": [ 123 | { 124 | "name": "stdout", 125 | "output_type": "stream", 126 | "text": [ 127 | "64721\n" 128 | ] 129 | }, 130 | { 131 | "data": { 132 | "text/plain": [ 133 | "(64721, 16384)" 134 | ] 135 | }, 136 | "execution_count": 5, 137 | "metadata": {}, 138 | "output_type": "execute_result" 139 | } 140 | ], 141 | "source": [ 142 | "print(len(label))\n", 143 | "output = sparse.vstack(output)\n", 144 | "output.shape" 145 | ] 146 | }, 147 | { 148 | "cell_type": "code", 149 | "execution_count": 6, 150 | "metadata": {}, 151 | "outputs": [ 152 | { 153 | "name": "stderr", 154 | "output_type": "stream", 155 | "text": [ 156 | "/usr/local/lib/python3.5/dist-packages/sklearn/cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n", 157 | " \"This module will be removed in 0.20.\", DeprecationWarning)\n" 158 | ] 159 | } 160 | ], 161 | "source": [ 162 | "from sklearn.cross_validation import train_test_split\n", 163 | "from sklearn.preprocessing import LabelEncoder\n", 164 | "labels = np.unique(label)\n", 165 | "target = LabelEncoder().fit_transform(label)\n", 166 | "train_X, test_X, train_Y, test_Y = train_test_split(output, target, test_size = 0.2)" 167 | ] 168 | }, 169 | { 170 | "cell_type": "code", 171 | "execution_count": 7, 172 | "metadata": {}, 173 | "outputs": [ 174 | { 175 | "name": "stdout", 176 | "output_type": "stream", 177 | "text": [ 178 | "accuracy validation set: 0.245886442642\n", 179 | " precision recall f1-score support\n", 180 | "\n", 181 | " bed 0.23 0.31 0.27 359\n", 182 | " bird 0.51 0.35 0.42 361\n", 183 | " cat 0.23 0.26 0.25 351\n", 184 | " dog 0.12 0.13 0.13 348\n", 185 | " down 0.36 0.04 0.07 469\n", 186 | " eight 0.46 0.34 0.39 464\n", 187 | " five 0.12 0.13 0.13 485\n", 188 | " four 0.29 0.52 0.38 444\n", 189 | " go 0.17 0.11 0.13 474\n", 190 | " happy 0.24 0.22 0.23 339\n", 191 | " house 0.26 0.40 0.31 332\n", 192 | " left 0.11 0.28 0.16 474\n", 193 | " marvin 0.19 0.19 0.19 344\n", 194 | " nine 0.32 0.22 0.26 450\n", 195 | " no 0.20 0.09 0.13 484\n", 196 | " off 0.26 0.42 0.32 468\n", 197 | " on 0.38 0.10 0.16 473\n", 198 | " one 0.18 0.15 0.16 481\n", 199 | " right 0.37 0.05 0.09 472\n", 200 | " seven 0.52 0.19 0.28 457\n", 201 | " sheila 0.34 0.39 0.36 354\n", 202 | " six 0.37 0.47 0.42 476\n", 203 | " stop 0.30 0.27 0.28 507\n", 204 | " three 0.27 0.30 0.28 481\n", 205 | " tree 0.31 0.38 0.34 347\n", 206 | " two 0.28 0.31 0.30 543\n", 207 | " up 0.32 0.07 0.12 490\n", 208 | " wow 0.11 0.20 0.14 314\n", 209 | " yes 0.16 0.26 0.20 413\n", 210 | " zero 0.23 0.30 0.26 491\n", 211 | "\n", 212 | "avg / total 0.28 0.25 0.24 12945\n", 213 | "\n" 214 | ] 215 | } 216 | ], 217 | "source": [ 218 | "bayes_multinomial = MultinomialNB().fit(train_X, train_Y)\n", 219 | "predicted = bayes_multinomial.predict(test_X)\n", 220 | "print('accuracy validation set: ', np.mean(predicted == test_Y))\n", 221 | "\n", 222 | "# print scores\n", 223 | "print(metrics.classification_report(test_Y, predicted, target_names = labels))" 224 | ] 225 | } 226 | ], 227 | "metadata": { 228 | "kernelspec": { 229 | "display_name": "Python 3", 230 | "language": "python", 231 | "name": "python3" 232 | }, 233 | "language_info": { 234 | "codemirror_mode": { 235 | "name": "ipython", 236 | "version": 3 237 | }, 238 | "file_extension": ".py", 239 | "mimetype": "text/x-python", 240 | "name": "python", 241 | "nbconvert_exporter": "python", 242 | "pygments_lexer": "ipython3", 243 | "version": "3.5.2" 244 | } 245 | }, 246 | "nbformat": 4, 247 | "nbformat_minor": 2 248 | } 249 | -------------------------------------------------------------------------------- /lgb/spectrogram-lgb.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": true 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "import tensorflow as tf\n", 12 | "import numpy as np\n", 13 | "import matplotlib.mlab\n", 14 | "import scipy.io.wavfile\n", 15 | "import scipy\n", 16 | "import os\n", 17 | "import time\n", 18 | "from sklearn import metrics\n", 19 | "import matplotlib.pyplot as plt\n", 20 | "import seaborn as sns\n", 21 | "from scipy import sparse\n", 22 | "sns.set()" 23 | ] 24 | }, 25 | { 26 | "cell_type": "code", 27 | "execution_count": 2, 28 | "metadata": { 29 | "collapsed": true 30 | }, 31 | "outputs": [], 32 | "source": [ 33 | "def processAudio(folder, sound_dimension = [128, 128]):\n", 34 | " location = folder + '/'\n", 35 | " elements = os.listdir(location)\n", 36 | " results,labels = [], []\n", 37 | " for i in elements:\n", 38 | " try:\n", 39 | " fs, data = scipy.io.wavfile.read(location+i)\n", 40 | " try:\n", 41 | " data = np.mean(data, axis = 1)\n", 42 | " except:\n", 43 | " pass\n", 44 | " audio = matplotlib.mlab.specgram(data)[0]\n", 45 | " audio = scipy.misc.imresize(audio, sound_dimension)\n", 46 | " audio = audio.astype('float64')\n", 47 | " results.append(sparse.csr_matrix(audio.flatten()))\n", 48 | " labels.append(folder)\n", 49 | " except Exception as e:\n", 50 | " print(e)\n", 51 | " continue\n", 52 | " return sparse.vstack(results), labels" 53 | ] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "execution_count": 3, 58 | "metadata": { 59 | "collapsed": true 60 | }, 61 | "outputs": [], 62 | "source": [ 63 | "folders = [i for i in os.listdir(os.getcwd())if i.find('.md') < 0 and i.find('.txt') < 0 and i.find('ipynb') < 0 and i.find('LICENSE') < 0 and i.find('_background_noise_') < 0]" 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "execution_count": 4, 69 | "metadata": {}, 70 | "outputs": [ 71 | { 72 | "name": "stdout", 73 | "output_type": "stream", 74 | "text": [ 75 | "yes\n", 76 | "marvin\n", 77 | "off\n", 78 | "happy\n", 79 | "bed\n", 80 | "house\n", 81 | "up\n", 82 | "six\n", 83 | "go\n", 84 | "four\n", 85 | "nine\n", 86 | "left\n", 87 | "no\n", 88 | "three\n", 89 | "wow\n", 90 | "sheila\n", 91 | "right\n", 92 | "on\n", 93 | "five\n", 94 | "seven\n", 95 | "zero\n", 96 | "stop\n", 97 | "one\n", 98 | "down\n", 99 | "bird\n", 100 | "tree\n", 101 | "eight\n", 102 | "dog\n", 103 | "two\n", 104 | "cat\n" 105 | ] 106 | } 107 | ], 108 | "source": [ 109 | "output,label = [], []\n", 110 | "for i in folders:\n", 111 | " print(i)\n", 112 | " out = processAudio(i)\n", 113 | " output.append(out[0])\n", 114 | " label += out[1]" 115 | ] 116 | }, 117 | { 118 | "cell_type": "code", 119 | "execution_count": 5, 120 | "metadata": {}, 121 | "outputs": [ 122 | { 123 | "name": "stdout", 124 | "output_type": "stream", 125 | "text": [ 126 | "64721\n" 127 | ] 128 | }, 129 | { 130 | "data": { 131 | "text/plain": [ 132 | "(64721, 16384)" 133 | ] 134 | }, 135 | "execution_count": 5, 136 | "metadata": {}, 137 | "output_type": "execute_result" 138 | } 139 | ], 140 | "source": [ 141 | "print(len(label))\n", 142 | "output = sparse.vstack(output)\n", 143 | "output.shape" 144 | ] 145 | }, 146 | { 147 | "cell_type": "code", 148 | "execution_count": 6, 149 | "metadata": {}, 150 | "outputs": [ 151 | { 152 | "name": "stderr", 153 | "output_type": "stream", 154 | "text": [ 155 | "/usr/local/lib/python3.5/dist-packages/sklearn/cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n", 156 | " \"This module will be removed in 0.20.\", DeprecationWarning)\n" 157 | ] 158 | } 159 | ], 160 | "source": [ 161 | "import lightgbm as lgb\n", 162 | "from sklearn.cross_validation import train_test_split\n", 163 | "from sklearn.preprocessing import LabelEncoder\n", 164 | "labels = np.unique(label)\n", 165 | "target = LabelEncoder().fit_transform(label)\n", 166 | "train_X, test_X, train_Y, test_Y = train_test_split(output, target, test_size = 0.2)" 167 | ] 168 | }, 169 | { 170 | "cell_type": "code", 171 | "execution_count": 7, 172 | "metadata": {}, 173 | "outputs": [ 174 | { 175 | "name": "stderr", 176 | "output_type": "stream", 177 | "text": [ 178 | "/usr/local/lib/python3.5/dist-packages/lightgbm/basic.py:642: UserWarning: max_bin keyword has been found in `params` and will be ignored. Please use max_bin argument of the Dataset constructor to pass this parameter.\n", 179 | " 'Please use {0} argument of the Dataset constructor to pass this parameter.'.format(key))\n", 180 | "/usr/local/lib/python3.5/dist-packages/lightgbm/basic.py:648: LGBMDeprecationWarning: The `max_bin` parameter is deprecated and will be removed in 2.0.12 version. Please use `params` to pass this parameter.\n", 181 | " 'Please use `params` to pass this parameter.', LGBMDeprecationWarning)\n" 182 | ] 183 | }, 184 | { 185 | "name": "stdout", 186 | "output_type": "stream", 187 | "text": [ 188 | "time taken to fit lgb: 2628.1320009231567 seconds \n" 189 | ] 190 | } 191 | ], 192 | "source": [ 193 | "params_lgd = {\n", 194 | " 'boosting_type': 'dart',\n", 195 | " 'objective': 'multiclass',\n", 196 | " 'colsample_bytree': 0.4,\n", 197 | " 'subsample': 0.8,\n", 198 | " 'learning_rate': 0.1,\n", 199 | " 'silent': False,\n", 200 | " 'n_estimators': 10000,\n", 201 | " 'reg_lambda': 0.0005,\n", 202 | " 'device':'gpu'\n", 203 | " }\n", 204 | "clf = lgb.LGBMClassifier(**params_lgd)\n", 205 | "lasttime = time.time()\n", 206 | "clf.fit(train_X,train_Y, eval_set=[(train_X,train_Y), (test_X,test_Y)], \n", 207 | " eval_metric='logloss', early_stopping_rounds=20, verbose=False)\n", 208 | "print('time taken to fit lgb:', time.time()-lasttime, 'seconds ')" 209 | ] 210 | }, 211 | { 212 | "cell_type": "code", 213 | "execution_count": 9, 214 | "metadata": {}, 215 | "outputs": [ 216 | { 217 | "name": "stdout", 218 | "output_type": "stream", 219 | "text": [ 220 | "accuracy validation set: 0.649594438007\n", 221 | " precision recall f1-score support\n", 222 | "\n", 223 | " bed 0.56 0.52 0.54 332\n", 224 | " bird 0.84 0.66 0.74 381\n", 225 | " cat 0.64 0.68 0.66 353\n", 226 | " dog 0.61 0.51 0.55 332\n", 227 | " down 0.61 0.55 0.58 476\n", 228 | " eight 0.68 0.73 0.70 470\n", 229 | " five 0.64 0.57 0.60 466\n", 230 | " four 0.67 0.77 0.71 469\n", 231 | " go 0.52 0.54 0.53 478\n", 232 | " happy 0.87 0.84 0.85 368\n", 233 | " house 0.78 0.64 0.70 347\n", 234 | " left 0.59 0.60 0.59 484\n", 235 | " marvin 0.77 0.78 0.78 361\n", 236 | " nine 0.63 0.66 0.64 480\n", 237 | " no 0.61 0.57 0.59 456\n", 238 | " off 0.59 0.67 0.63 456\n", 239 | " on 0.67 0.59 0.63 482\n", 240 | " one 0.65 0.71 0.68 481\n", 241 | " right 0.69 0.62 0.65 446\n", 242 | " seven 0.76 0.72 0.74 485\n", 243 | " sheila 0.89 0.72 0.80 329\n", 244 | " six 0.62 0.81 0.71 490\n", 245 | " stop 0.63 0.56 0.59 466\n", 246 | " three 0.56 0.56 0.56 446\n", 247 | " tree 0.71 0.42 0.53 362\n", 248 | " two 0.48 0.70 0.57 478\n", 249 | " up 0.57 0.74 0.64 474\n", 250 | " wow 0.65 0.59 0.62 343\n", 251 | " yes 0.67 0.64 0.65 461\n", 252 | " zero 0.75 0.75 0.75 493\n", 253 | "\n", 254 | "avg / total 0.66 0.65 0.65 12945\n", 255 | "\n" 256 | ] 257 | } 258 | ], 259 | "source": [ 260 | "predicted = clf.predict(test_X)\n", 261 | "print('accuracy validation set: ', np.mean(predicted == test_Y))\n", 262 | "\n", 263 | "# print scores\n", 264 | "print(metrics.classification_report(test_Y, predicted, target_names = labels))" 265 | ] 266 | }, 267 | { 268 | "cell_type": "code", 269 | "execution_count": null, 270 | "metadata": { 271 | "collapsed": true 272 | }, 273 | "outputs": [], 274 | "source": [] 275 | }, 276 | { 277 | "cell_type": "code", 278 | "execution_count": null, 279 | "metadata": { 280 | "collapsed": true 281 | }, 282 | "outputs": [], 283 | "source": [] 284 | } 285 | ], 286 | "metadata": { 287 | "kernelspec": { 288 | "display_name": "Python 3", 289 | "language": "python", 290 | "name": "python3" 291 | }, 292 | "language_info": { 293 | "codemirror_mode": { 294 | "name": "ipython", 295 | "version": 3 296 | }, 297 | "file_extension": ".py", 298 | "mimetype": "text/x-python", 299 | "name": "python", 300 | "nbconvert_exporter": "python", 301 | "pygments_lexer": "ipython3", 302 | "version": "3.5.2" 303 | } 304 | }, 305 | "nbformat": 4, 306 | "nbformat_minor": 2 307 | } 308 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Sound-Classification-Comparison 2 | Classify sound using Deep Learning on Tensorflow and various machine learning models. 3 | 4 | ## Features 5 | 6 | 1. log = Log scale spectrogram 7 | 2. spectrogram = spectrogram 8 | 3. features = concat(power spectrum, log-energy, mfcc). Check featuring/features.py 9 | 10 | ## Datasets 11 | 12 | 1. [Urban sound](https://serv.cusp.nyu.edu/projects/urbansounddataset/urbansound8k.html) 13 | 2. [Google dataset](https://research.googleblog.com/2017/08/launching-speech-commands-dataset.html) 14 | 15 | ## Models 16 | 17 | #### Light Gradient Boosting 18 | 1. log 19 | 2. spectrogram 20 | 21 | #### eXtreme Gradient Boosting 22 | 1. log 23 | 24 | #### Bayes 25 | 1. spectrogram 26 | 27 | #### Deep-learning 28 | 1. features on feed-forward 29 | 2. log on convolutional neural network 30 | 3. log on feed-forward 31 | 4. spectrogram on convolutional neural network 32 | 5. spectrogram on feed-forward 33 | 6. spectrogram on recurrent neural network 34 | 35 | ## Results 36 | 37 | #### Spectrogram Urban Sound 38 | 39 | * feed-forward neural network 40 | ```text 41 | testing accuracy: 0.463215 42 | precision recall f1-score support 43 | 44 | air_conditioner 0.41 0.32 0.36 105 45 | car_horn 0.46 0.40 0.43 58 46 | children_playing 0.33 0.12 0.17 126 47 | dog_bark 0.67 0.58 0.62 134 48 | drilling 0.42 0.72 0.53 137 49 | engine_idling 0.54 0.30 0.39 127 50 | gun_shot 0.60 0.59 0.60 59 51 | jackhammer 0.36 0.73 0.49 122 52 | siren 0.57 0.74 0.64 114 53 | street_music 0.31 0.13 0.19 119 54 | 55 | avg / total 0.46 0.46 0.44 1101 56 | ``` 57 | 58 | * convolutional neural network 59 | ```text 60 | testing accuracy: 0.4 61 | precision recall f1-score support 62 | 63 | air_conditioner 0.40 0.20 0.27 10 64 | car_horn 0.29 0.33 0.31 6 65 | children_playing 0.16 0.33 0.21 9 66 | dog_bark 0.36 0.31 0.33 16 67 | drilling 0.50 0.55 0.52 11 68 | engine_idling 0.56 0.56 0.56 9 69 | gun_shot 0.33 0.33 0.33 3 70 | jackhammer 0.57 0.44 0.50 9 71 | siren 0.46 0.67 0.55 9 72 | street_music 0.67 0.31 0.42 13 73 | 74 | avg / total 0.45 0.40 0.40 95 75 | ``` 76 | 77 | * recurrent neural network 78 | ```text 79 | testing accuracy: 0.453488 80 | precision recall f1-score support 81 | 82 | air_conditioner 0.35 0.55 0.43 11 83 | car_horn 0.50 0.40 0.44 5 84 | children_playing 0.20 0.11 0.14 9 85 | dog_bark 1.00 0.64 0.78 11 86 | drilling 0.38 0.45 0.42 11 87 | engine_idling 1.00 0.44 0.62 9 88 | gun_shot 1.00 0.50 0.67 2 89 | jackhammer 0.50 0.60 0.55 10 90 | siren 0.50 0.22 0.31 9 91 | street_music 0.26 0.56 0.36 9 92 | 93 | avg / total 0.54 0.45 0.46 86 94 | ``` 95 | 96 | #### Spectrogram Google Dataset 97 | * lgb 98 | ```text 99 | accuracy validation set: 0.649594438007 100 | precision recall f1-score support 101 | 102 | bed 0.56 0.52 0.54 332 103 | bird 0.84 0.66 0.74 381 104 | cat 0.64 0.68 0.66 353 105 | dog 0.61 0.51 0.55 332 106 | down 0.61 0.55 0.58 476 107 | eight 0.68 0.73 0.70 470 108 | five 0.64 0.57 0.60 466 109 | four 0.67 0.77 0.71 469 110 | go 0.52 0.54 0.53 478 111 | happy 0.87 0.84 0.85 368 112 | house 0.78 0.64 0.70 347 113 | left 0.59 0.60 0.59 484 114 | marvin 0.77 0.78 0.78 361 115 | nine 0.63 0.66 0.64 480 116 | no 0.61 0.57 0.59 456 117 | off 0.59 0.67 0.63 456 118 | on 0.67 0.59 0.63 482 119 | one 0.65 0.71 0.68 481 120 | right 0.69 0.62 0.65 446 121 | seven 0.76 0.72 0.74 485 122 | sheila 0.89 0.72 0.80 329 123 | six 0.62 0.81 0.71 490 124 | stop 0.63 0.56 0.59 466 125 | three 0.56 0.56 0.56 446 126 | tree 0.71 0.42 0.53 362 127 | two 0.48 0.70 0.57 478 128 | up 0.57 0.74 0.64 474 129 | wow 0.65 0.59 0.62 343 130 | yes 0.67 0.64 0.65 461 131 | zero 0.75 0.75 0.75 493 132 | 133 | avg / total 0.66 0.65 0.65 12945 134 | ``` 135 | * bayes 136 | ```text 137 | accuracy validation set: 0.245886442642 138 | precision recall f1-score support 139 | 140 | bed 0.23 0.31 0.27 359 141 | bird 0.51 0.35 0.42 361 142 | cat 0.23 0.26 0.25 351 143 | dog 0.12 0.13 0.13 348 144 | down 0.36 0.04 0.07 469 145 | eight 0.46 0.34 0.39 464 146 | five 0.12 0.13 0.13 485 147 | four 0.29 0.52 0.38 444 148 | go 0.17 0.11 0.13 474 149 | happy 0.24 0.22 0.23 339 150 | house 0.26 0.40 0.31 332 151 | left 0.11 0.28 0.16 474 152 | marvin 0.19 0.19 0.19 344 153 | nine 0.32 0.22 0.26 450 154 | no 0.20 0.09 0.13 484 155 | off 0.26 0.42 0.32 468 156 | on 0.38 0.10 0.16 473 157 | one 0.18 0.15 0.16 481 158 | right 0.37 0.05 0.09 472 159 | seven 0.52 0.19 0.28 457 160 | sheila 0.34 0.39 0.36 354 161 | six 0.37 0.47 0.42 476 162 | stop 0.30 0.27 0.28 507 163 | three 0.27 0.30 0.28 481 164 | tree 0.31 0.38 0.34 347 165 | two 0.28 0.31 0.30 543 166 | up 0.32 0.07 0.12 490 167 | wow 0.11 0.20 0.14 314 168 | yes 0.16 0.26 0.20 413 169 | zero 0.23 0.30 0.26 491 170 | 171 | avg / total 0.28 0.25 0.24 12945 172 | ``` 173 | 174 | #### Log-spectrogram Google Dataset 175 | * LGB 176 | ```text 177 | accuracy validation set: 0.722689742775 178 | precision recall f1-score support 179 | 180 | bed 0.64 0.68 0.66 359 181 | bird 0.82 0.74 0.78 327 182 | cat 0.77 0.72 0.74 353 183 | dog 0.78 0.59 0.67 340 184 | down 0.67 0.67 0.67 457 185 | eight 0.75 0.79 0.77 466 186 | five 0.73 0.65 0.69 514 187 | four 0.78 0.82 0.80 477 188 | go 0.54 0.61 0.57 463 189 | house 0.87 0.75 0.80 324 190 | left 0.75 0.70 0.72 488 191 | marvin 0.79 0.76 0.78 370 192 | nine 0.70 0.75 0.72 447 193 | no 0.70 0.57 0.63 518 194 | off 0.71 0.74 0.72 450 195 | on 0.66 0.66 0.66 466 196 | one 0.72 0.75 0.73 485 197 | right 0.80 0.73 0.76 453 198 | seven 0.78 0.73 0.75 467 199 | sheila 0.88 0.81 0.85 362 200 | six 0.69 0.85 0.76 469 201 | stop 0.77 0.73 0.75 452 202 | three 0.68 0.71 0.70 461 203 | tree 0.80 0.62 0.70 341 204 | two 0.65 0.81 0.72 530 205 | up 0.59 0.80 0.68 470 206 | wow 0.80 0.71 0.76 358 207 | yes 0.75 0.70 0.72 470 208 | zero 0.76 0.78 0.77 459 209 | 210 | avg / total 0.73 0.72 0.72 12596 211 | ``` 212 | 213 | * XGB 214 | ```text 215 | accuracy validation set: 0.801047951731 216 | precision recall f1-score support 217 | 218 | bed 0.71 0.78 0.74 330 219 | bird 0.85 0.83 0.84 348 220 | cat 0.81 0.85 0.83 362 221 | dog 0.76 0.70 0.73 351 222 | down 0.77 0.74 0.75 442 223 | eight 0.83 0.86 0.85 485 224 | five 0.80 0.77 0.78 478 225 | four 0.83 0.88 0.86 460 226 | go 0.68 0.69 0.69 460 227 | house 0.90 0.82 0.86 368 228 | left 0.81 0.78 0.79 495 229 | marvin 0.87 0.80 0.84 363 230 | nine 0.81 0.80 0.80 455 231 | no 0.76 0.74 0.75 468 232 | off 0.77 0.78 0.78 464 233 | on 0.78 0.74 0.76 447 234 | one 0.76 0.82 0.79 418 235 | right 0.86 0.80 0.83 491 236 | seven 0.86 0.82 0.84 495 237 | sheila 0.94 0.87 0.90 359 238 | six 0.78 0.88 0.83 474 239 | stop 0.84 0.80 0.82 489 240 | three 0.78 0.80 0.79 476 241 | tree 0.81 0.71 0.76 329 242 | two 0.77 0.81 0.79 506 243 | up 0.70 0.82 0.76 504 244 | wow 0.80 0.82 0.81 330 245 | yes 0.84 0.86 0.85 496 246 | zero 0.82 0.84 0.83 453 247 | 248 | avg / total 0.80 0.80 0.80 12596 249 | ``` 250 | 251 | ## images 252 | 253 | ![alt text](images/augmentation.png) 254 | -------------------------------------------------------------------------------- /deep-learning/feature-feedforward.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stderr", 10 | "output_type": "stream", 11 | "text": [ 12 | "/usr/local/lib/python3.5/dist-packages/sklearn/cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n", 13 | " \"This module will be removed in 0.20.\", DeprecationWarning)\n" 14 | ] 15 | } 16 | ], 17 | "source": [ 18 | "import os\n", 19 | "from IPython.display import display,Audio,HTML\n", 20 | "import scipy.io.wavfile as wav\n", 21 | "import numpy as np\n", 22 | "import speechpy\n", 23 | "import matplotlib.pyplot as plt\n", 24 | "import seaborn as sns\n", 25 | "import lightgbm as lgb\n", 26 | "from sklearn.cross_validation import train_test_split\n", 27 | "from sklearn.preprocessing import LabelEncoder\n", 28 | "from sklearn.preprocessing import MinMaxScaler\n", 29 | "import time\n", 30 | "import xgboost as xgb\n", 31 | "import tensorflow as tf\n", 32 | "from sklearn import metrics\n", 33 | "sns.set()" 34 | ] 35 | }, 36 | { 37 | "cell_type": "code", 38 | "execution_count": 2, 39 | "metadata": { 40 | "collapsed": true 41 | }, 42 | "outputs": [], 43 | "source": [ 44 | "def extract_features(signal, fs):\n", 45 | " frames = speechpy.processing.stack_frames(signal, sampling_frequency=fs, frame_length=0.020, frame_stride=0.01, filter=lambda x: np.ones((x,)),zero_padding=True)\n", 46 | " power_spectrum = speechpy.processing.power_spectrum(frames, fft_points=1)\n", 47 | " logenergy = speechpy.feature.lmfe(signal, sampling_frequency=fs, frame_length=0.020, frame_stride=0.01,num_filters=1, fft_length=512, low_frequency=0, high_frequency=None)\n", 48 | " mfcc = speechpy.feature.mfcc(signal, sampling_frequency=fs, frame_length=0.020, frame_stride=0.01,num_filters=1, fft_length=512, low_frequency=0, high_frequency=None)\n", 49 | " mfcc_cmvn = speechpy.processing.cmvnw(mfcc,win_size=301,variance_normalization=True)\n", 50 | " mfcc_feature_cube = speechpy.feature.extract_derivative_feature(mfcc)\n", 51 | " return np.hstack([power_spectrum[:,0],logenergy[:,0],mfcc_cmvn[:,0],mfcc_feature_cube[:,0,1]])\n", 52 | "\n", 53 | "def extract_files(folder):\n", 54 | " location = folder + '/'\n", 55 | " elements = os.listdir(location)\n", 56 | " results = []\n", 57 | " for i in elements:\n", 58 | " try:\n", 59 | " fs, signal = wav.read(location+i)\n", 60 | " results.append([folder]+extract_features(signal, fs).tolist())\n", 61 | " except:\n", 62 | " continue\n", 63 | " return results" 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "execution_count": 3, 69 | "metadata": { 70 | "collapsed": true 71 | }, 72 | "outputs": [], 73 | "source": [ 74 | "folders = [i for i in os.listdir(os.getcwd())if i.find('.md') < 0 and i.find('.txt') < 0 and i.find('ipynb') < 0 and i.find('LICENSE') < 0]" 75 | ] 76 | }, 77 | { 78 | "cell_type": "code", 79 | "execution_count": 4, 80 | "metadata": {}, 81 | "outputs": [ 82 | { 83 | "name": "stdout", 84 | "output_type": "stream", 85 | "text": [ 86 | "yes\n", 87 | "marvin\n", 88 | "off\n", 89 | "happy\n", 90 | "bed\n", 91 | "house\n", 92 | "up\n", 93 | "six\n", 94 | "go\n", 95 | "four\n", 96 | "nine\n", 97 | "left\n", 98 | "no\n", 99 | "three\n", 100 | "wow\n", 101 | "sheila\n", 102 | "_background_noise_\n" 103 | ] 104 | }, 105 | { 106 | "name": "stderr", 107 | "output_type": "stream", 108 | "text": [ 109 | "/usr/local/lib/python3.5/dist-packages/scipy/io/wavfile.py:273: WavFileWarning: Chunk (non-data) not understood, skipping it.\n", 110 | " WavFileWarning)\n" 111 | ] 112 | }, 113 | { 114 | "name": "stdout", 115 | "output_type": "stream", 116 | "text": [ 117 | "right\n", 118 | "on\n", 119 | "five\n", 120 | "seven\n", 121 | "zero\n", 122 | "stop\n", 123 | "one\n", 124 | "down\n", 125 | "bird\n" 126 | ] 127 | }, 128 | { 129 | "name": "stderr", 130 | "output_type": "stream", 131 | "text": [ 132 | "/usr/local/lib/python3.5/dist-packages/speechpy/processing.py:239: RuntimeWarning: divide by zero encountered in true_divide\n", 133 | " variance_normalized[i, :] = mean_subtracted[i, :] / window_variance\n" 134 | ] 135 | }, 136 | { 137 | "name": "stdout", 138 | "output_type": "stream", 139 | "text": [ 140 | "tree\n", 141 | "eight\n", 142 | "dog\n", 143 | "two\n", 144 | "cat\n" 145 | ] 146 | } 147 | ], 148 | "source": [ 149 | "output = []\n", 150 | "for i in folders:\n", 151 | " print(i)\n", 152 | " output += extract_files(i)" 153 | ] 154 | }, 155 | { 156 | "cell_type": "code", 157 | "execution_count": 11, 158 | "metadata": {}, 159 | "outputs": [ 160 | { 161 | "data": { 162 | "text/plain": [ 163 | "['bed',\n", 164 | " 'bird',\n", 165 | " 'cat',\n", 166 | " 'dog',\n", 167 | " 'down',\n", 168 | " 'eight',\n", 169 | " 'five',\n", 170 | " 'four',\n", 171 | " 'go',\n", 172 | " 'happy',\n", 173 | " 'house',\n", 174 | " 'left',\n", 175 | " 'marvin',\n", 176 | " 'nine',\n", 177 | " 'no',\n", 178 | " 'off',\n", 179 | " 'on',\n", 180 | " 'one',\n", 181 | " 'right',\n", 182 | " 'seven',\n", 183 | " 'sheila',\n", 184 | " 'six',\n", 185 | " 'stop',\n", 186 | " 'three',\n", 187 | " 'tree',\n", 188 | " 'two',\n", 189 | " 'up',\n", 190 | " 'wow',\n", 191 | " 'yes',\n", 192 | " 'zero']" 193 | ] 194 | }, 195 | "execution_count": 11, 196 | "metadata": {}, 197 | "output_type": "execute_result" 198 | } 199 | ], 200 | "source": [ 201 | "output = [i for i in output if len(i) == 397]\n", 202 | "dataset=np.array(output)\n", 203 | "np.random.shuffle(dataset)\n", 204 | "labels = np.unique(dataset[:,0]).tolist()\n", 205 | "target = LabelEncoder().fit_transform(dataset[:,0])\n", 206 | "labels" 207 | ] 208 | }, 209 | { 210 | "cell_type": "code", 211 | "execution_count": 6, 212 | "metadata": { 213 | "collapsed": true 214 | }, 215 | "outputs": [], 216 | "source": [ 217 | "class Model:\n", 218 | " def __init__(self, size_input, size_output):\n", 219 | " self.X = tf.placeholder(tf.float32, (None, size_input))\n", 220 | " self.Y = tf.placeholder(tf.float32, (None, size_output))\n", 221 | " \n", 222 | " w1 = tf.Variable(tf.random_normal([size_input, 784], stddev = np.sqrt(1/size_input)))\n", 223 | " b1 = tf.Variable(tf.random_normal([784], stddev = 0))\n", 224 | " \n", 225 | " w2 = tf.Variable(tf.random_normal([784, 256], stddev = np.sqrt(1/256.0)))\n", 226 | " b2 = tf.Variable(tf.random_normal([256], stddev = 0))\n", 227 | " \n", 228 | " w3 = tf.Variable(tf.random_normal([256, 100], stddev = np.sqrt(1/100.0)))\n", 229 | " b3 = tf.Variable(tf.random_normal([100], stddev = 0))\n", 230 | " \n", 231 | " w4 = tf.Variable(tf.random_normal([100, size_output], stddev = np.sqrt(1/(size_output * 1.0))))\n", 232 | " b4 = tf.Variable(tf.random_normal([size_output], stddev = 0))\n", 233 | " \n", 234 | " hidden1 = tf.nn.relu(tf.matmul(self.X, w1) + b1)\n", 235 | " hidden2 = tf.nn.relu(tf.matmul(hidden1, w2) + b2)\n", 236 | " hidden3 = tf.nn.relu(tf.matmul(hidden2, w3) + b3)\n", 237 | " self.logits = tf.matmul(hidden3, w4) + b4\n", 238 | " self.cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = self.logits, labels = self.Y))\n", 239 | " self.optimizer = tf.train.AdamOptimizer(learning_rate).minimize(self.cost)\n", 240 | " correct_prediction = tf.equal(tf.argmax(self.logits, 1), tf.argmax(self.Y, 1))\n", 241 | " self.accuracy = tf.reduce_mean(tf.cast(correct_prediction, \"float\"))" 242 | ] 243 | }, 244 | { 245 | "cell_type": "code", 246 | "execution_count": 12, 247 | "metadata": {}, 248 | "outputs": [], 249 | "source": [ 250 | "dataset=dataset[:, 1:].astype('float64')\n", 251 | "condition = ~np.isnan(dataset).any(axis=1)\n", 252 | "dataset=dataset[condition]\n", 253 | "target=target[condition]\n", 254 | "condition = ~np.isinf(dataset).any(axis=1)\n", 255 | "dataset=dataset[condition]\n", 256 | "target=target[condition]\n", 257 | "train_X, test_X, train_Y, test_Y = train_test_split(MinMaxScaler().fit_transform(dataset), target, test_size = 0.2)" 258 | ] 259 | }, 260 | { 261 | "cell_type": "code", 262 | "execution_count": 34, 263 | "metadata": { 264 | "collapsed": true 265 | }, 266 | "outputs": [], 267 | "source": [ 268 | "learning_rate = 0.0001\n", 269 | "batch_size = 128\n", 270 | "epoch = 1000" 271 | ] 272 | }, 273 | { 274 | "cell_type": "code", 275 | "execution_count": 35, 276 | "metadata": {}, 277 | "outputs": [ 278 | { 279 | "name": "stdout", 280 | "output_type": "stream", 281 | "text": [ 282 | "epoch: 100 avg loss: 2.2162935832 avg acc: 0.352056146978 avg time: 0.0022671091687548293\n", 283 | "epoch: 200 avg loss: 1.87672025195 avg acc: 0.454069368132 avg time: 0.0022755704083285487\n", 284 | "epoch: 300 avg loss: 1.63823067618 avg acc: 0.526850103022 avg time: 0.002270428688971551\n", 285 | "epoch: 400 avg loss: 1.44041890725 avg acc: 0.584628262363 avg time: 0.002271171454544906\n", 286 | "epoch: 500 avg loss: 1.24983836465 avg acc: 0.645368303571 avg time: 0.002266234748966091\n", 287 | "epoch: 600 avg loss: 1.17506110128 avg acc: 0.666809752747 avg time: 0.0022591955059177273\n", 288 | "epoch: 700 avg loss: 1.10258197866 avg acc: 0.687993646978 avg time: 0.0022657264719952593\n", 289 | "epoch: 800 avg loss: 0.944048415665 avg acc: 0.738839285714 avg time: 0.00226986146235204\n", 290 | "epoch: 900 avg loss: 0.822166120122 avg acc: 0.779361263736 avg time: 0.0022613956378056453\n", 291 | "epoch: 1000 avg loss: 0.882767829266 avg acc: 0.758434924451 avg time: 0.0022641695462740385\n" 292 | ] 293 | } 294 | ], 295 | "source": [ 296 | "tf.reset_default_graph()\n", 297 | "sess = tf.InteractiveSession()\n", 298 | "model = Model(train_X.shape[1],len(labels))\n", 299 | "sess.run(tf.global_variables_initializer())\n", 300 | "saver = tf.train.Saver(tf.global_variables())\n", 301 | "ACCURACY, LOST = [], []\n", 302 | "for i in range(epoch):\n", 303 | " last = time.time()\n", 304 | " total_acc, total_loss = 0, 0\n", 305 | " for k in range(0, (train_X.shape[0] // batch_size) * batch_size, batch_size):\n", 306 | " batch_y = np.zeros((batch_size, len(labels)))\n", 307 | " for n in range(batch_size):\n", 308 | " batch_y[n, train_Y[k+n]] = 1.0\n", 309 | " loss, _ = sess.run([model.cost, model.optimizer], feed_dict = {model.X: train_X[k:k+batch_size,:], model.Y: batch_y})\n", 310 | " total_acc += sess.run(model.accuracy, feed_dict = {model.X: train_X[k:k+batch_size,:], model.Y: batch_y})\n", 311 | " total_loss += loss\n", 312 | " total_loss /= (train_X.shape[0] // batch_size)\n", 313 | " total_acc /= (train_X.shape[0] // batch_size)\n", 314 | " ACCURACY.append(total_acc)\n", 315 | " LOST.append(total_loss)\n", 316 | " if (i+1) % 100 == 0:\n", 317 | " print('epoch: ', i + 1, 'avg loss: ', total_loss, 'avg acc: ', total_acc, 'avg time: ', (time.time() - last) / (train_X.shape[0] // batch_size))" 318 | ] 319 | }, 320 | { 321 | "cell_type": "code", 322 | "execution_count": 36, 323 | "metadata": {}, 324 | "outputs": [ 325 | { 326 | "name": "stdout", 327 | "output_type": "stream", 328 | "text": [ 329 | "testing accuracy: 0.331731\n", 330 | " precision recall f1-score support\n", 331 | "\n", 332 | " bed 0.14 0.11 0.13 298\n", 333 | " bird 0.18 0.10 0.13 313\n", 334 | " cat 0.21 0.34 0.26 299\n", 335 | " dog 0.17 0.19 0.18 302\n", 336 | " down 0.24 0.11 0.15 449\n", 337 | " eight 0.41 0.35 0.38 415\n", 338 | " five 0.25 0.23 0.24 427\n", 339 | " four 0.19 0.29 0.23 420\n", 340 | " go 0.13 0.15 0.14 456\n", 341 | " happy 0.57 0.65 0.61 341\n", 342 | " house 0.56 0.46 0.50 300\n", 343 | " left 0.32 0.34 0.33 429\n", 344 | " marvin 0.47 0.53 0.50 306\n", 345 | " nine 0.33 0.22 0.26 434\n", 346 | " no 0.24 0.21 0.22 420\n", 347 | " off 0.27 0.22 0.24 425\n", 348 | " on 0.38 0.16 0.22 466\n", 349 | " one 0.18 0.15 0.17 416\n", 350 | " right 0.24 0.25 0.24 452\n", 351 | " seven 0.48 0.60 0.53 453\n", 352 | " sheila 0.38 0.60 0.46 311\n", 353 | " six 0.62 0.65 0.64 436\n", 354 | " stop 0.50 0.69 0.58 449\n", 355 | " three 0.18 0.22 0.20 394\n", 356 | " tree 0.38 0.40 0.39 286\n", 357 | " two 0.26 0.16 0.20 424\n", 358 | " up 0.40 0.52 0.45 415\n", 359 | " wow 0.20 0.23 0.21 287\n", 360 | " yes 0.49 0.46 0.48 417\n", 361 | " zero 0.39 0.41 0.40 411\n", 362 | "\n", 363 | "avg / total 0.33 0.33 0.32 11651\n", 364 | "\n" 365 | ] 366 | } 367 | ], 368 | "source": [ 369 | "batch_y = np.zeros((test_X.shape[0],len(labels)))\n", 370 | "for n in range(test_X.shape[0]):\n", 371 | " batch_y[n, test_Y[n]] = 1.0\n", 372 | "acc, logits = sess.run([model.accuracy, tf.cast(tf.argmax(model.logits, 1), tf.int32)], feed_dict = {model.X : test_X, model.Y : batch_y})\n", 373 | "print('testing accuracy: ' + str(acc))\n", 374 | "print(metrics.classification_report(test_Y, logits, target_names = labels))" 375 | ] 376 | }, 377 | { 378 | "cell_type": "code", 379 | "execution_count": null, 380 | "metadata": { 381 | "collapsed": true 382 | }, 383 | "outputs": [], 384 | "source": [] 385 | } 386 | ], 387 | "metadata": { 388 | "kernelspec": { 389 | "display_name": "Python 3", 390 | "language": "python", 391 | "name": "python3" 392 | }, 393 | "language_info": { 394 | "codemirror_mode": { 395 | "name": "ipython", 396 | "version": 3 397 | }, 398 | "file_extension": ".py", 399 | "mimetype": "text/x-python", 400 | "name": "python", 401 | "nbconvert_exporter": "python", 402 | "pygments_lexer": "ipython3", 403 | "version": "3.5.2" 404 | } 405 | }, 406 | "nbformat": 4, 407 | "nbformat_minor": 2 408 | } 409 | -------------------------------------------------------------------------------- /lgb/log-lgb.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": true 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "import tensorflow as tf\n", 12 | "import numpy as np\n", 13 | "import matplotlib.mlab\n", 14 | "import scipy.io.wavfile\n", 15 | "import scipy\n", 16 | "import os\n", 17 | "import time\n", 18 | "from scipy import signal\n", 19 | "from sklearn import metrics\n", 20 | "import matplotlib.pyplot as plt\n", 21 | "import seaborn as sns\n", 22 | "from scipy import sparse\n", 23 | "sns.set()" 24 | ] 25 | }, 26 | { 27 | "cell_type": "code", 28 | "execution_count": 2, 29 | "metadata": { 30 | "collapsed": true 31 | }, 32 | "outputs": [], 33 | "source": [ 34 | "def log_specgram(audio, sample_rate, window_size=20,\n", 35 | " step_size=10, eps=1e-10):\n", 36 | " nperseg = int(round(window_size * sample_rate / 1e3))\n", 37 | " noverlap = int(round(step_size * sample_rate / 1e3))\n", 38 | " freqs, times, spec = signal.spectrogram(audio,\n", 39 | " fs=sample_rate,\n", 40 | " window='hann',\n", 41 | " nperseg=nperseg,\n", 42 | " noverlap=noverlap,\n", 43 | " detrend=False)\n", 44 | " return freqs, times, np.log(spec.T.astype(np.float32) + eps)\n", 45 | "\n", 46 | "def pad_audio(samples, L=16000):\n", 47 | " if len(samples) >= L: return samples\n", 48 | " else: return np.pad(samples, pad_width=(L - len(samples), 0), mode='constant', constant_values=(0, 0))\n", 49 | "\n", 50 | "def chop_audio(samples, L=16000, num=20):\n", 51 | " for i in range(num):\n", 52 | " beg = np.random.randint(0, len(samples) - L)\n", 53 | " yield samples[beg: beg + L]" 54 | ] 55 | }, 56 | { 57 | "cell_type": "code", 58 | "execution_count": 3, 59 | "metadata": { 60 | "collapsed": true 61 | }, 62 | "outputs": [], 63 | "source": [ 64 | "folders = [i for i in os.listdir(os.getcwd())if i.find('.md') < 0 and i.find('.txt') < 0 and i.find('ipynb') < 0 and i.find('py') < 0 and i.find('LICENSE') < 0 and i.find('_background_noise_') < 0]" 65 | ] 66 | }, 67 | { 68 | "cell_type": "code", 69 | "execution_count": 9, 70 | "metadata": {}, 71 | "outputs": [ 72 | { 73 | "name": "stdout", 74 | "output_type": "stream", 75 | "text": [ 76 | "yes\n", 77 | "marvin\n", 78 | "off\n", 79 | "bed\n", 80 | "house\n", 81 | "up\n", 82 | "six\n", 83 | "go\n", 84 | "four\n", 85 | "nine\n", 86 | "left\n", 87 | "no\n", 88 | "three\n", 89 | "wow\n", 90 | "sheila\n", 91 | "right\n", 92 | "on\n", 93 | "five\n", 94 | "seven\n", 95 | "zero\n", 96 | "stop\n", 97 | "one\n", 98 | "down\n", 99 | "bird\n", 100 | "tree\n", 101 | "eight\n", 102 | "dog\n", 103 | "two\n", 104 | "cat\n" 105 | ] 106 | } 107 | ], 108 | "source": [ 109 | "new_sample_rate = 8000\n", 110 | "Y = []\n", 111 | "X = []\n", 112 | "for i in folders:\n", 113 | " print(i)\n", 114 | " for k in os.listdir(os.getcwd()+'/'+i):\n", 115 | " sample_rate, samples = scipy.io.wavfile.read(os.path.join(os.getcwd(), i, k))\n", 116 | " samples = pad_audio(samples)\n", 117 | " if len(samples) > 16000:\n", 118 | " n_samples = chop_audio(samples)\n", 119 | " else: n_samples = [samples]\n", 120 | " for samples in n_samples:\n", 121 | " resampled = signal.resample(samples, int(new_sample_rate / sample_rate * samples.shape[0]))\n", 122 | " _, _, specgram = log_specgram(resampled, sample_rate=new_sample_rate)\n", 123 | " Y.append(i)\n", 124 | " X.append(scipy.misc.imresize(specgram,[45, 40]).flatten())" 125 | ] 126 | }, 127 | { 128 | "cell_type": "code", 129 | "execution_count": 10, 130 | "metadata": {}, 131 | "outputs": [ 132 | { 133 | "name": "stdout", 134 | "output_type": "stream", 135 | "text": [ 136 | "(62979, 1800)\n" 137 | ] 138 | }, 139 | { 140 | "data": { 141 | "text/plain": [ 142 | "62979" 143 | ] 144 | }, 145 | "execution_count": 10, 146 | "metadata": {}, 147 | "output_type": "execute_result" 148 | } 149 | ], 150 | "source": [ 151 | "X = np.array(X)\n", 152 | "print(X.shape)\n", 153 | "len(Y)" 154 | ] 155 | }, 156 | { 157 | "cell_type": "code", 158 | "execution_count": 11, 159 | "metadata": {}, 160 | "outputs": [ 161 | { 162 | "name": "stderr", 163 | "output_type": "stream", 164 | "text": [ 165 | "/usr/local/lib/python3.5/dist-packages/sklearn/cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n", 166 | " \"This module will be removed in 0.20.\", DeprecationWarning)\n" 167 | ] 168 | } 169 | ], 170 | "source": [ 171 | "import lightgbm as lgb\n", 172 | "from sklearn.cross_validation import train_test_split\n", 173 | "from sklearn.preprocessing import LabelEncoder\n", 174 | "labels = np.unique(Y)\n", 175 | "target = LabelEncoder().fit_transform(Y)\n", 176 | "train_X, test_X, train_Y, test_Y = train_test_split(X, target, test_size = 0.2)" 177 | ] 178 | }, 179 | { 180 | "cell_type": "code", 181 | "execution_count": 12, 182 | "metadata": {}, 183 | "outputs": [ 184 | { 185 | "name": "stderr", 186 | "output_type": "stream", 187 | "text": [ 188 | "/usr/local/lib/python3.5/dist-packages/lightgbm/basic.py:642: UserWarning: max_bin keyword has been found in `params` and will be ignored. Please use max_bin argument of the Dataset constructor to pass this parameter.\n", 189 | " 'Please use {0} argument of the Dataset constructor to pass this parameter.'.format(key))\n", 190 | "/usr/local/lib/python3.5/dist-packages/lightgbm/basic.py:648: LGBMDeprecationWarning: The `max_bin` parameter is deprecated and will be removed in 2.0.12 version. Please use `params` to pass this parameter.\n", 191 | " 'Please use `params` to pass this parameter.', LGBMDeprecationWarning)\n" 192 | ] 193 | }, 194 | { 195 | "name": "stdout", 196 | "output_type": "stream", 197 | "text": [ 198 | "[1]\tvalid_0's multi_logloss: 3.15526\n", 199 | "Training until validation scores don't improve for 20 rounds.\n", 200 | "[2]\tvalid_0's multi_logloss: 3.01132\n", 201 | "[3]\tvalid_0's multi_logloss: 2.89098\n", 202 | "[4]\tvalid_0's multi_logloss: 2.79342\n", 203 | "[5]\tvalid_0's multi_logloss: 2.70512\n", 204 | "[6]\tvalid_0's multi_logloss: 2.62507\n", 205 | "[7]\tvalid_0's multi_logloss: 2.55135\n", 206 | "[8]\tvalid_0's multi_logloss: 2.58867\n", 207 | "[9]\tvalid_0's multi_logloss: 2.5208\n", 208 | "[10]\tvalid_0's multi_logloss: 2.45682\n", 209 | "[11]\tvalid_0's multi_logloss: 2.39718\n", 210 | "[12]\tvalid_0's multi_logloss: 2.42141\n", 211 | "[13]\tvalid_0's multi_logloss: 2.36492\n", 212 | "[14]\tvalid_0's multi_logloss: 2.31165\n", 213 | "[15]\tvalid_0's multi_logloss: 2.26279\n", 214 | "[16]\tvalid_0's multi_logloss: 2.21751\n", 215 | "[17]\tvalid_0's multi_logloss: 2.1751\n", 216 | "[18]\tvalid_0's multi_logloss: 2.13462\n", 217 | "[19]\tvalid_0's multi_logloss: 2.09548\n", 218 | "[20]\tvalid_0's multi_logloss: 2.05903\n", 219 | "[21]\tvalid_0's multi_logloss: 2.07195\n", 220 | "[22]\tvalid_0's multi_logloss: 2.03659\n", 221 | "[23]\tvalid_0's multi_logloss: 2.00345\n", 222 | "[24]\tvalid_0's multi_logloss: 1.97242\n", 223 | "[25]\tvalid_0's multi_logloss: 1.94248\n", 224 | "[26]\tvalid_0's multi_logloss: 1.91324\n", 225 | "[27]\tvalid_0's multi_logloss: 1.88591\n", 226 | "[28]\tvalid_0's multi_logloss: 1.89757\n", 227 | "[29]\tvalid_0's multi_logloss: 1.87077\n", 228 | "[30]\tvalid_0's multi_logloss: 1.84562\n", 229 | "[31]\tvalid_0's multi_logloss: 1.84915\n", 230 | "[32]\tvalid_0's multi_logloss: 1.8241\n", 231 | "[33]\tvalid_0's multi_logloss: 1.79968\n", 232 | "[34]\tvalid_0's multi_logloss: 1.77704\n", 233 | "[35]\tvalid_0's multi_logloss: 1.78987\n", 234 | "[36]\tvalid_0's multi_logloss: 1.81193\n", 235 | "[37]\tvalid_0's multi_logloss: 1.78922\n", 236 | "[38]\tvalid_0's multi_logloss: 1.76635\n", 237 | "[39]\tvalid_0's multi_logloss: 1.74451\n", 238 | "[40]\tvalid_0's multi_logloss: 1.74119\n", 239 | "[41]\tvalid_0's multi_logloss: 1.75631\n", 240 | "[42]\tvalid_0's multi_logloss: 1.73522\n", 241 | "[43]\tvalid_0's multi_logloss: 1.7481\n", 242 | "[44]\tvalid_0's multi_logloss: 1.72703\n", 243 | "[45]\tvalid_0's multi_logloss: 1.7069\n", 244 | "[46]\tvalid_0's multi_logloss: 1.73277\n", 245 | "[47]\tvalid_0's multi_logloss: 1.71234\n", 246 | "[48]\tvalid_0's multi_logloss: 1.71185\n", 247 | "[49]\tvalid_0's multi_logloss: 1.72666\n", 248 | "[50]\tvalid_0's multi_logloss: 1.74284\n", 249 | "[51]\tvalid_0's multi_logloss: 1.72073\n", 250 | "[52]\tvalid_0's multi_logloss: 1.6997\n", 251 | "[53]\tvalid_0's multi_logloss: 1.71279\n", 252 | "[54]\tvalid_0's multi_logloss: 1.69261\n", 253 | "[55]\tvalid_0's multi_logloss: 1.67386\n", 254 | "[56]\tvalid_0's multi_logloss: 1.69038\n", 255 | "[57]\tvalid_0's multi_logloss: 1.67121\n", 256 | "[58]\tvalid_0's multi_logloss: 1.69185\n", 257 | "[59]\tvalid_0's multi_logloss: 1.71054\n", 258 | "[60]\tvalid_0's multi_logloss: 1.68945\n", 259 | "[61]\tvalid_0's multi_logloss: 1.70643\n", 260 | "[62]\tvalid_0's multi_logloss: 1.68586\n", 261 | "[63]\tvalid_0's multi_logloss: 1.66654\n", 262 | "[64]\tvalid_0's multi_logloss: 1.68179\n", 263 | "[65]\tvalid_0's multi_logloss: 1.69319\n", 264 | "[66]\tvalid_0's multi_logloss: 1.6732\n", 265 | "[67]\tvalid_0's multi_logloss: 1.65371\n", 266 | "[68]\tvalid_0's multi_logloss: 1.63514\n", 267 | "[69]\tvalid_0's multi_logloss: 1.64734\n", 268 | "[70]\tvalid_0's multi_logloss: 1.65407\n", 269 | "[71]\tvalid_0's multi_logloss: 1.66553\n", 270 | "[72]\tvalid_0's multi_logloss: 1.64718\n", 271 | "[73]\tvalid_0's multi_logloss: 1.62936\n", 272 | "[74]\tvalid_0's multi_logloss: 1.63837\n", 273 | "[75]\tvalid_0's multi_logloss: 1.62023\n", 274 | "[76]\tvalid_0's multi_logloss: 1.62124\n", 275 | "[77]\tvalid_0's multi_logloss: 1.62978\n", 276 | "[78]\tvalid_0's multi_logloss: 1.6413\n", 277 | "[79]\tvalid_0's multi_logloss: 1.62265\n", 278 | "[80]\tvalid_0's multi_logloss: 1.6047\n", 279 | "[81]\tvalid_0's multi_logloss: 1.61466\n", 280 | "[82]\tvalid_0's multi_logloss: 1.5972\n", 281 | "[83]\tvalid_0's multi_logloss: 1.60851\n", 282 | "[84]\tvalid_0's multi_logloss: 1.61911\n", 283 | "[85]\tvalid_0's multi_logloss: 1.63033\n", 284 | "[86]\tvalid_0's multi_logloss: 1.61251\n", 285 | "[87]\tvalid_0's multi_logloss: 1.59456\n", 286 | "[88]\tvalid_0's multi_logloss: 1.6073\n", 287 | "[89]\tvalid_0's multi_logloss: 1.61707\n", 288 | "[90]\tvalid_0's multi_logloss: 1.62752\n", 289 | "[91]\tvalid_0's multi_logloss: 1.64122\n", 290 | "[92]\tvalid_0's multi_logloss: 1.62263\n", 291 | "[93]\tvalid_0's multi_logloss: 1.6051\n", 292 | "[94]\tvalid_0's multi_logloss: 1.61485\n", 293 | "[95]\tvalid_0's multi_logloss: 1.62399\n", 294 | "[96]\tvalid_0's multi_logloss: 1.63271\n", 295 | "[97]\tvalid_0's multi_logloss: 1.61409\n", 296 | "[98]\tvalid_0's multi_logloss: 1.62419\n", 297 | "[99]\tvalid_0's multi_logloss: 1.60593\n", 298 | "[100]\tvalid_0's multi_logloss: 1.58879\n", 299 | "[101]\tvalid_0's multi_logloss: 1.60342\n", 300 | "[102]\tvalid_0's multi_logloss: 1.61225\n", 301 | "[103]\tvalid_0's multi_logloss: 1.62272\n", 302 | "[104]\tvalid_0's multi_logloss: 1.60484\n", 303 | "[105]\tvalid_0's multi_logloss: 1.61864\n", 304 | "[106]\tvalid_0's multi_logloss: 1.62976\n", 305 | "[107]\tvalid_0's multi_logloss: 1.64115\n", 306 | "[108]\tvalid_0's multi_logloss: 1.62186\n", 307 | "[109]\tvalid_0's multi_logloss: 1.63099\n", 308 | "[110]\tvalid_0's multi_logloss: 1.64117\n", 309 | "[111]\tvalid_0's multi_logloss: 1.62122\n", 310 | "[112]\tvalid_0's multi_logloss: 1.60224\n", 311 | "[113]\tvalid_0's multi_logloss: 1.58438\n", 312 | "[114]\tvalid_0's multi_logloss: 1.56755\n", 313 | "[115]\tvalid_0's multi_logloss: 1.55108\n", 314 | "[116]\tvalid_0's multi_logloss: 1.53526\n", 315 | "[117]\tvalid_0's multi_logloss: 1.54328\n", 316 | "[118]\tvalid_0's multi_logloss: 1.52806\n", 317 | "[119]\tvalid_0's multi_logloss: 1.53616\n", 318 | "[120]\tvalid_0's multi_logloss: 1.54554\n", 319 | "[121]\tvalid_0's multi_logloss: 1.55445\n", 320 | "[122]\tvalid_0's multi_logloss: 1.56443\n", 321 | "[123]\tvalid_0's multi_logloss: 1.5489\n", 322 | "[124]\tvalid_0's multi_logloss: 1.53273\n", 323 | "[125]\tvalid_0's multi_logloss: 1.54171\n", 324 | "[126]\tvalid_0's multi_logloss: 1.55009\n", 325 | "[127]\tvalid_0's multi_logloss: 1.53401\n", 326 | "[128]\tvalid_0's multi_logloss: 1.54254\n", 327 | "[129]\tvalid_0's multi_logloss: 1.52668\n", 328 | "[130]\tvalid_0's multi_logloss: 1.51199\n", 329 | "[131]\tvalid_0's multi_logloss: 1.51867\n", 330 | "[132]\tvalid_0's multi_logloss: 1.50397\n", 331 | "[133]\tvalid_0's multi_logloss: 1.48929\n", 332 | "[134]\tvalid_0's multi_logloss: 1.49908\n", 333 | "[135]\tvalid_0's multi_logloss: 1.48452\n", 334 | "[136]\tvalid_0's multi_logloss: 1.4966\n", 335 | "[137]\tvalid_0's multi_logloss: 1.50518\n", 336 | "[138]\tvalid_0's multi_logloss: 1.49023\n", 337 | "[139]\tvalid_0's multi_logloss: 1.47569\n", 338 | "[140]\tvalid_0's multi_logloss: 1.48516\n", 339 | "[141]\tvalid_0's multi_logloss: 1.4927\n", 340 | "[142]\tvalid_0's multi_logloss: 1.50066\n", 341 | "[143]\tvalid_0's multi_logloss: 1.48629\n", 342 | "[144]\tvalid_0's multi_logloss: 1.49308\n", 343 | "[145]\tvalid_0's multi_logloss: 1.4787\n", 344 | "[146]\tvalid_0's multi_logloss: 1.48845\n", 345 | "[147]\tvalid_0's multi_logloss: 1.49659\n", 346 | "[148]\tvalid_0's multi_logloss: 1.50599\n", 347 | "[149]\tvalid_0's multi_logloss: 1.49112\n", 348 | "[150]\tvalid_0's multi_logloss: 1.47716\n", 349 | "[151]\tvalid_0's multi_logloss: 1.48735\n", 350 | "[152]\tvalid_0's multi_logloss: 1.49684\n", 351 | "[153]\tvalid_0's multi_logloss: 1.48248\n", 352 | "[154]\tvalid_0's multi_logloss: 1.48913\n", 353 | "[155]\tvalid_0's multi_logloss: 1.47534\n", 354 | "[156]\tvalid_0's multi_logloss: 1.48368\n", 355 | "[157]\tvalid_0's multi_logloss: 1.48821\n", 356 | "[158]\tvalid_0's multi_logloss: 1.49661\n", 357 | "[159]\tvalid_0's multi_logloss: 1.50486\n", 358 | "[160]\tvalid_0's multi_logloss: 1.51319\n", 359 | "[161]\tvalid_0's multi_logloss: 1.49835\n", 360 | "[162]\tvalid_0's multi_logloss: 1.50548\n", 361 | "[163]\tvalid_0's multi_logloss: 1.49065\n", 362 | "[164]\tvalid_0's multi_logloss: 1.47676\n", 363 | "[165]\tvalid_0's multi_logloss: 1.46285\n", 364 | "[166]\tvalid_0's multi_logloss: 1.44936\n", 365 | "[167]\tvalid_0's multi_logloss: 1.43642\n", 366 | "[168]\tvalid_0's multi_logloss: 1.42341\n", 367 | "[169]\tvalid_0's multi_logloss: 1.41123\n", 368 | "[170]\tvalid_0's multi_logloss: 1.4191\n", 369 | "[171]\tvalid_0's multi_logloss: 1.40678\n", 370 | "[172]\tvalid_0's multi_logloss: 1.41429\n", 371 | "[173]\tvalid_0's multi_logloss: 1.40223\n", 372 | "[174]\tvalid_0's multi_logloss: 1.39085\n", 373 | "[175]\tvalid_0's multi_logloss: 1.37967\n", 374 | "[176]\tvalid_0's multi_logloss: 1.38521\n", 375 | "[177]\tvalid_0's multi_logloss: 1.39211\n", 376 | "[178]\tvalid_0's multi_logloss: 1.39903\n", 377 | "[179]\tvalid_0's multi_logloss: 1.3873\n", 378 | "[180]\tvalid_0's multi_logloss: 1.39353\n", 379 | "[181]\tvalid_0's multi_logloss: 1.38259\n", 380 | "[182]\tvalid_0's multi_logloss: 1.37153\n", 381 | "[183]\tvalid_0's multi_logloss: 1.36118\n", 382 | "[184]\tvalid_0's multi_logloss: 1.35096\n", 383 | "[185]\tvalid_0's multi_logloss: 1.35844\n", 384 | "[186]\tvalid_0's multi_logloss: 1.34827\n", 385 | "[187]\tvalid_0's multi_logloss: 1.33814\n", 386 | "[188]\tvalid_0's multi_logloss: 1.3285\n", 387 | "[189]\tvalid_0's multi_logloss: 1.33548\n", 388 | "[190]\tvalid_0's multi_logloss: 1.34206\n", 389 | "[191]\tvalid_0's multi_logloss: 1.33149\n", 390 | "[192]\tvalid_0's multi_logloss: 1.32173\n", 391 | "[193]\tvalid_0's multi_logloss: 1.31226\n", 392 | "[194]\tvalid_0's multi_logloss: 1.31811\n", 393 | "[195]\tvalid_0's multi_logloss: 1.32345\n", 394 | "[196]\tvalid_0's multi_logloss: 1.31423\n", 395 | "[197]\tvalid_0's multi_logloss: 1.31899\n", 396 | "[198]\tvalid_0's multi_logloss: 1.32489\n", 397 | "[199]\tvalid_0's multi_logloss: 1.31542\n", 398 | "[200]\tvalid_0's multi_logloss: 1.32193\n", 399 | "[201]\tvalid_0's multi_logloss: 1.3279\n", 400 | "[202]\tvalid_0's multi_logloss: 1.33399\n", 401 | "[203]\tvalid_0's multi_logloss: 1.32384\n", 402 | "[204]\tvalid_0's multi_logloss: 1.32897\n", 403 | "[205]\tvalid_0's multi_logloss: 1.3354\n", 404 | "[206]\tvalid_0's multi_logloss: 1.32476\n", 405 | "[207]\tvalid_0's multi_logloss: 1.33073\n", 406 | "[208]\tvalid_0's multi_logloss: 1.32019\n", 407 | "[209]\tvalid_0's multi_logloss: 1.32653\n", 408 | "[210]\tvalid_0's multi_logloss: 1.33226\n", 409 | "[211]\tvalid_0's multi_logloss: 1.33785\n", 410 | "[212]\tvalid_0's multi_logloss: 1.32733\n" 411 | ] 412 | }, 413 | { 414 | "name": "stdout", 415 | "output_type": "stream", 416 | "text": [ 417 | "[213]\tvalid_0's multi_logloss: 1.31775\n", 418 | "Early stopping, best iteration is:\n", 419 | "[193]\tvalid_0's multi_logloss: 1.31226\n", 420 | "time taken to fit lgb: 2149.428333044052 seconds \n" 421 | ] 422 | } 423 | ], 424 | "source": [ 425 | "params_lgd = {\n", 426 | " 'boosting_type': 'dart',\n", 427 | " 'objective': 'multiclass',\n", 428 | " 'colsample_bytree': 0.4,\n", 429 | " 'subsample': 0.8,\n", 430 | " 'learning_rate': 0.1,\n", 431 | " 'silent': False,\n", 432 | " 'n_estimators': 10000,\n", 433 | " 'reg_lambda': 0.0005,\n", 434 | " 'device':'gpu'\n", 435 | " }\n", 436 | "clf = lgb.LGBMClassifier(**params_lgd)\n", 437 | "lasttime = time.time()\n", 438 | "clf.fit(train_X,train_Y, eval_set=[(test_X,test_Y)], \n", 439 | " eval_metric='logloss', early_stopping_rounds=20, verbose=True)\n", 440 | "print('time taken to fit lgb:', time.time()-lasttime, 'seconds ')" 441 | ] 442 | }, 443 | { 444 | "cell_type": "code", 445 | "execution_count": 13, 446 | "metadata": {}, 447 | "outputs": [ 448 | { 449 | "name": "stdout", 450 | "output_type": "stream", 451 | "text": [ 452 | "accuracy validation set: 0.722689742775\n", 453 | " precision recall f1-score support\n", 454 | "\n", 455 | " bed 0.64 0.68 0.66 359\n", 456 | " bird 0.82 0.74 0.78 327\n", 457 | " cat 0.77 0.72 0.74 353\n", 458 | " dog 0.78 0.59 0.67 340\n", 459 | " down 0.67 0.67 0.67 457\n", 460 | " eight 0.75 0.79 0.77 466\n", 461 | " five 0.73 0.65 0.69 514\n", 462 | " four 0.78 0.82 0.80 477\n", 463 | " go 0.54 0.61 0.57 463\n", 464 | " house 0.87 0.75 0.80 324\n", 465 | " left 0.75 0.70 0.72 488\n", 466 | " marvin 0.79 0.76 0.78 370\n", 467 | " nine 0.70 0.75 0.72 447\n", 468 | " no 0.70 0.57 0.63 518\n", 469 | " off 0.71 0.74 0.72 450\n", 470 | " on 0.66 0.66 0.66 466\n", 471 | " one 0.72 0.75 0.73 485\n", 472 | " right 0.80 0.73 0.76 453\n", 473 | " seven 0.78 0.73 0.75 467\n", 474 | " sheila 0.88 0.81 0.85 362\n", 475 | " six 0.69 0.85 0.76 469\n", 476 | " stop 0.77 0.73 0.75 452\n", 477 | " three 0.68 0.71 0.70 461\n", 478 | " tree 0.80 0.62 0.70 341\n", 479 | " two 0.65 0.81 0.72 530\n", 480 | " up 0.59 0.80 0.68 470\n", 481 | " wow 0.80 0.71 0.76 358\n", 482 | " yes 0.75 0.70 0.72 470\n", 483 | " zero 0.76 0.78 0.77 459\n", 484 | "\n", 485 | "avg / total 0.73 0.72 0.72 12596\n", 486 | "\n" 487 | ] 488 | } 489 | ], 490 | "source": [ 491 | "predicted = clf.predict(test_X)\n", 492 | "print('accuracy validation set: ', np.mean(predicted == test_Y))\n", 493 | "\n", 494 | "# print scores\n", 495 | "print(metrics.classification_report(test_Y, predicted, target_names = labels))" 496 | ] 497 | }, 498 | { 499 | "cell_type": "code", 500 | "execution_count": null, 501 | "metadata": { 502 | "collapsed": true 503 | }, 504 | "outputs": [], 505 | "source": [] 506 | }, 507 | { 508 | "cell_type": "code", 509 | "execution_count": null, 510 | "metadata": { 511 | "collapsed": true 512 | }, 513 | "outputs": [], 514 | "source": [] 515 | } 516 | ], 517 | "metadata": { 518 | "kernelspec": { 519 | "display_name": "Python 3", 520 | "language": "python", 521 | "name": "python3" 522 | }, 523 | "language_info": { 524 | "codemirror_mode": { 525 | "name": "ipython", 526 | "version": 3 527 | }, 528 | "file_extension": ".py", 529 | "mimetype": "text/x-python", 530 | "name": "python", 531 | "nbconvert_exporter": "python", 532 | "pygments_lexer": "ipython3", 533 | "version": "3.5.2" 534 | } 535 | }, 536 | "nbformat": 4, 537 | "nbformat_minor": 2 538 | } 539 | -------------------------------------------------------------------------------- /xgb/log-xgb.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 4, 6 | "metadata": { 7 | "collapsed": true 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "import tensorflow as tf\n", 12 | "import numpy as np\n", 13 | "import matplotlib.mlab\n", 14 | "import scipy.io.wavfile\n", 15 | "import scipy\n", 16 | "import os\n", 17 | "import time\n", 18 | "from scipy import signal\n", 19 | "from sklearn import metrics\n", 20 | "import matplotlib.pyplot as plt\n", 21 | "import seaborn as sns\n", 22 | "from scipy import sparse\n", 23 | "sns.set()" 24 | ] 25 | }, 26 | { 27 | "cell_type": "code", 28 | "execution_count": 5, 29 | "metadata": { 30 | "collapsed": true 31 | }, 32 | "outputs": [], 33 | "source": [ 34 | "def log_specgram(audio, sample_rate, window_size=20,\n", 35 | " step_size=10, eps=1e-10):\n", 36 | " nperseg = int(round(window_size * sample_rate / 1e3))\n", 37 | " noverlap = int(round(step_size * sample_rate / 1e3))\n", 38 | " freqs, times, spec = signal.spectrogram(audio,\n", 39 | " fs=sample_rate,\n", 40 | " window='hann',\n", 41 | " nperseg=nperseg,\n", 42 | " noverlap=noverlap,\n", 43 | " detrend=False)\n", 44 | " return freqs, times, np.log(spec.T.astype(np.float32) + eps)\n", 45 | "\n", 46 | "def pad_audio(samples, L=16000):\n", 47 | " if len(samples) >= L: return samples\n", 48 | " else: return np.pad(samples, pad_width=(L - len(samples), 0), mode='constant', constant_values=(0, 0))\n", 49 | "\n", 50 | "def chop_audio(samples, L=16000, num=20):\n", 51 | " for i in range(num):\n", 52 | " beg = np.random.randint(0, len(samples) - L)\n", 53 | " yield samples[beg: beg + L]" 54 | ] 55 | }, 56 | { 57 | "cell_type": "code", 58 | "execution_count": 6, 59 | "metadata": { 60 | "collapsed": true 61 | }, 62 | "outputs": [], 63 | "source": [ 64 | "folders = [i for i in os.listdir(os.getcwd())if i.find('.md') < 0 and i.find('.txt') < 0 and i.find('ipynb') < 0 and i.find('py') < 0 and i.find('LICENSE') < 0 and i.find('_background_noise_') < 0]" 65 | ] 66 | }, 67 | { 68 | "cell_type": "code", 69 | "execution_count": 7, 70 | "metadata": {}, 71 | "outputs": [ 72 | { 73 | "name": "stdout", 74 | "output_type": "stream", 75 | "text": [ 76 | "yes\n", 77 | "marvin\n", 78 | "off\n", 79 | "bed\n", 80 | "house\n", 81 | "up\n", 82 | "six\n", 83 | "go\n", 84 | "four\n", 85 | "nine\n", 86 | "left\n", 87 | "no\n", 88 | "three\n", 89 | "wow\n", 90 | "sheila\n", 91 | "right\n", 92 | "on\n", 93 | "five\n", 94 | "seven\n", 95 | "zero\n", 96 | "stop\n", 97 | "one\n", 98 | "down\n", 99 | "bird\n", 100 | "tree\n", 101 | "eight\n", 102 | "dog\n", 103 | "two\n", 104 | "cat\n" 105 | ] 106 | } 107 | ], 108 | "source": [ 109 | "new_sample_rate = 8000\n", 110 | "Y = []\n", 111 | "X = []\n", 112 | "for i in folders:\n", 113 | " print(i)\n", 114 | " for k in os.listdir(os.getcwd()+'/'+i):\n", 115 | " sample_rate, samples = scipy.io.wavfile.read(os.path.join(os.getcwd(), i, k))\n", 116 | " samples = pad_audio(samples)\n", 117 | " if len(samples) > 16000:\n", 118 | " n_samples = chop_audio(samples)\n", 119 | " else: n_samples = [samples]\n", 120 | " for samples in n_samples:\n", 121 | " resampled = signal.resample(samples, int(new_sample_rate / sample_rate * samples.shape[0]))\n", 122 | " _, _, specgram = log_specgram(resampled, sample_rate=new_sample_rate)\n", 123 | " Y.append(i)\n", 124 | " X.append(scipy.misc.imresize(specgram,[45, 40]).flatten())" 125 | ] 126 | }, 127 | { 128 | "cell_type": "code", 129 | "execution_count": 8, 130 | "metadata": {}, 131 | "outputs": [ 132 | { 133 | "name": "stdout", 134 | "output_type": "stream", 135 | "text": [ 136 | "(62979, 1800)\n" 137 | ] 138 | }, 139 | { 140 | "data": { 141 | "text/plain": [ 142 | "62979" 143 | ] 144 | }, 145 | "execution_count": 8, 146 | "metadata": {}, 147 | "output_type": "execute_result" 148 | } 149 | ], 150 | "source": [ 151 | "X = np.array(X)\n", 152 | "print(X.shape)\n", 153 | "len(Y)" 154 | ] 155 | }, 156 | { 157 | "cell_type": "code", 158 | "execution_count": 9, 159 | "metadata": {}, 160 | "outputs": [ 161 | { 162 | "name": "stderr", 163 | "output_type": "stream", 164 | "text": [ 165 | "/usr/local/lib/python3.5/dist-packages/sklearn/cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n", 166 | " \"This module will be removed in 0.20.\", DeprecationWarning)\n" 167 | ] 168 | } 169 | ], 170 | "source": [ 171 | "import xgboost as xgb\n", 172 | "from sklearn.cross_validation import train_test_split\n", 173 | "from sklearn.preprocessing import LabelEncoder\n", 174 | "labels = np.unique(Y)\n", 175 | "target = LabelEncoder().fit_transform(Y)\n", 176 | "train_X, test_X, train_Y, test_Y = train_test_split(X, target, test_size = 0.2)" 177 | ] 178 | }, 179 | { 180 | "cell_type": "code", 181 | "execution_count": null, 182 | "metadata": {}, 183 | "outputs": [ 184 | { 185 | "name": "stdout", 186 | "output_type": "stream", 187 | "text": [ 188 | "[0]\tvalidation-mlogloss:3.2758\n", 189 | "Will train until validation-mlogloss hasn't improved in 100 rounds.\n", 190 | "[5]\tvalidation-mlogloss:2.85859\n", 191 | "[10]\tvalidation-mlogloss:2.50898\n", 192 | "[15]\tvalidation-mlogloss:2.23018\n", 193 | "[20]\tvalidation-mlogloss:2.02854\n", 194 | "[25]\tvalidation-mlogloss:1.87272\n", 195 | "[30]\tvalidation-mlogloss:1.75218\n", 196 | "[35]\tvalidation-mlogloss:1.65266\n", 197 | "[40]\tvalidation-mlogloss:1.57137\n", 198 | "[45]\tvalidation-mlogloss:1.50541\n", 199 | "[50]\tvalidation-mlogloss:1.44853\n", 200 | "[55]\tvalidation-mlogloss:1.39895\n", 201 | "[60]\tvalidation-mlogloss:1.35449\n", 202 | "[65]\tvalidation-mlogloss:1.31792\n", 203 | "[70]\tvalidation-mlogloss:1.28513\n", 204 | "[75]\tvalidation-mlogloss:1.25347\n", 205 | "[80]\tvalidation-mlogloss:1.22769\n", 206 | "[85]\tvalidation-mlogloss:1.20271\n", 207 | "[90]\tvalidation-mlogloss:1.17994\n", 208 | "[110]\tvalidation-mlogloss:1.1072\n", 209 | "[115]\tvalidation-mlogloss:1.09192\n", 210 | "[120]\tvalidation-mlogloss:1.07794\n", 211 | "[125]\tvalidation-mlogloss:1.06526\n", 212 | "[130]\tvalidation-mlogloss:1.05304\n", 213 | "[135]\tvalidation-mlogloss:1.04167\n", 214 | "[140]\tvalidation-mlogloss:1.03059\n", 215 | "[145]\tvalidation-mlogloss:1.02016\n", 216 | "[150]\tvalidation-mlogloss:1.01023\n", 217 | "[155]\tvalidation-mlogloss:1.00031\n", 218 | "[160]\tvalidation-mlogloss:0.991287\n", 219 | "[165]\tvalidation-mlogloss:0.982788\n", 220 | "[170]\tvalidation-mlogloss:0.974511\n", 221 | "[175]\tvalidation-mlogloss:0.965579\n", 222 | "[180]\tvalidation-mlogloss:0.958002\n", 223 | "[185]\tvalidation-mlogloss:0.951034\n", 224 | "[190]\tvalidation-mlogloss:0.944018\n", 225 | "[195]\tvalidation-mlogloss:0.937211\n", 226 | "[200]\tvalidation-mlogloss:0.930677\n", 227 | "[205]\tvalidation-mlogloss:0.924722\n", 228 | "[210]\tvalidation-mlogloss:0.918548\n", 229 | "[215]\tvalidation-mlogloss:0.912424\n", 230 | "[220]\tvalidation-mlogloss:0.906882\n", 231 | "[225]\tvalidation-mlogloss:0.901612\n", 232 | "[230]\tvalidation-mlogloss:0.896058\n", 233 | "[235]\tvalidation-mlogloss:0.89055\n", 234 | "[240]\tvalidation-mlogloss:0.885946\n", 235 | "[245]\tvalidation-mlogloss:0.881365\n", 236 | "[250]\tvalidation-mlogloss:0.876796\n", 237 | "[255]\tvalidation-mlogloss:0.872342\n", 238 | "[260]\tvalidation-mlogloss:0.867836\n", 239 | "[265]\tvalidation-mlogloss:0.864063\n", 240 | "[270]\tvalidation-mlogloss:0.859708\n", 241 | "[275]\tvalidation-mlogloss:0.855772\n", 242 | "[280]\tvalidation-mlogloss:0.851737\n", 243 | "[285]\tvalidation-mlogloss:0.84829\n", 244 | "[290]\tvalidation-mlogloss:0.84504\n", 245 | "[295]\tvalidation-mlogloss:0.841481\n", 246 | "[300]\tvalidation-mlogloss:0.838062\n", 247 | "[305]\tvalidation-mlogloss:0.83489\n", 248 | "[310]\tvalidation-mlogloss:0.83195\n", 249 | "[315]\tvalidation-mlogloss:0.828964\n", 250 | "[320]\tvalidation-mlogloss:0.825926\n", 251 | "[325]\tvalidation-mlogloss:0.823144\n", 252 | "[330]\tvalidation-mlogloss:0.820165\n", 253 | "[335]\tvalidation-mlogloss:0.81708\n", 254 | "[340]\tvalidation-mlogloss:0.814429\n", 255 | "[345]\tvalidation-mlogloss:0.811696\n", 256 | "[350]\tvalidation-mlogloss:0.809299\n", 257 | "[355]\tvalidation-mlogloss:0.806764\n", 258 | "[360]\tvalidation-mlogloss:0.804715\n", 259 | "[365]\tvalidation-mlogloss:0.802154\n", 260 | "[370]\tvalidation-mlogloss:0.799757\n", 261 | "[375]\tvalidation-mlogloss:0.797625\n", 262 | "[380]\tvalidation-mlogloss:0.795367\n", 263 | "[385]\tvalidation-mlogloss:0.793554\n", 264 | "[390]\tvalidation-mlogloss:0.791415\n", 265 | "[395]\tvalidation-mlogloss:0.789556\n", 266 | "[400]\tvalidation-mlogloss:0.787962\n", 267 | "[405]\tvalidation-mlogloss:0.786286\n", 268 | "[410]\tvalidation-mlogloss:0.784708\n", 269 | "[415]\tvalidation-mlogloss:0.78278\n", 270 | "[420]\tvalidation-mlogloss:0.780755\n", 271 | "[425]\tvalidation-mlogloss:0.779329\n", 272 | "[430]\tvalidation-mlogloss:0.777733\n", 273 | "[435]\tvalidation-mlogloss:0.776108\n", 274 | "[440]\tvalidation-mlogloss:0.774456\n", 275 | "[445]\tvalidation-mlogloss:0.77286\n", 276 | "[450]\tvalidation-mlogloss:0.771389\n", 277 | "[455]\tvalidation-mlogloss:0.770056\n", 278 | "[460]\tvalidation-mlogloss:0.768713\n", 279 | "[465]\tvalidation-mlogloss:0.7676\n", 280 | "[470]\tvalidation-mlogloss:0.765951\n", 281 | "[475]\tvalidation-mlogloss:0.764531\n", 282 | "[480]\tvalidation-mlogloss:0.763165\n", 283 | "[485]\tvalidation-mlogloss:0.761925\n", 284 | "[490]\tvalidation-mlogloss:0.760756\n", 285 | "[495]\tvalidation-mlogloss:0.75953\n", 286 | "[500]\tvalidation-mlogloss:0.758527\n", 287 | "[505]\tvalidation-mlogloss:0.757418\n", 288 | "[510]\tvalidation-mlogloss:0.756452\n", 289 | "[515]\tvalidation-mlogloss:0.755611\n", 290 | "[520]\tvalidation-mlogloss:0.754348\n", 291 | "[525]\tvalidation-mlogloss:0.753461\n", 292 | "[530]\tvalidation-mlogloss:0.752494\n", 293 | "[535]\tvalidation-mlogloss:0.751427\n", 294 | "[540]\tvalidation-mlogloss:0.750686\n", 295 | "[545]\tvalidation-mlogloss:0.749594\n", 296 | "[550]\tvalidation-mlogloss:0.748606\n", 297 | "[555]\tvalidation-mlogloss:0.747874\n", 298 | "[560]\tvalidation-mlogloss:0.747033\n", 299 | "[565]\tvalidation-mlogloss:0.745962\n", 300 | "[570]\tvalidation-mlogloss:0.745145\n", 301 | "[575]\tvalidation-mlogloss:0.744205\n", 302 | "[580]\tvalidation-mlogloss:0.743565\n", 303 | "[585]\tvalidation-mlogloss:0.742756\n", 304 | "[590]\tvalidation-mlogloss:0.742205\n", 305 | "[595]\tvalidation-mlogloss:0.741429\n", 306 | "[600]\tvalidation-mlogloss:0.740828\n", 307 | "[605]\tvalidation-mlogloss:0.740268\n", 308 | "[610]\tvalidation-mlogloss:0.739502\n", 309 | "[615]\tvalidation-mlogloss:0.73868\n", 310 | "[620]\tvalidation-mlogloss:0.738016\n", 311 | "[625]\tvalidation-mlogloss:0.737451\n", 312 | "[630]\tvalidation-mlogloss:0.736862\n", 313 | "[635]\tvalidation-mlogloss:0.736269\n", 314 | "[640]\tvalidation-mlogloss:0.735625\n", 315 | "[645]\tvalidation-mlogloss:0.734939\n", 316 | "[650]\tvalidation-mlogloss:0.734548\n", 317 | "[655]\tvalidation-mlogloss:0.734022\n", 318 | "[660]\tvalidation-mlogloss:0.733556\n", 319 | "[665]\tvalidation-mlogloss:0.732997\n", 320 | "[670]\tvalidation-mlogloss:0.732708\n", 321 | "[675]\tvalidation-mlogloss:0.732152\n", 322 | "[680]\tvalidation-mlogloss:0.731579\n", 323 | "[685]\tvalidation-mlogloss:0.731015\n", 324 | "[690]\tvalidation-mlogloss:0.730376\n", 325 | "[695]\tvalidation-mlogloss:0.729993\n", 326 | "[700]\tvalidation-mlogloss:0.729656\n", 327 | "[705]\tvalidation-mlogloss:0.729329\n", 328 | "[710]\tvalidation-mlogloss:0.728786\n", 329 | "[715]\tvalidation-mlogloss:0.728201\n", 330 | "[720]\tvalidation-mlogloss:0.727911\n", 331 | "[725]\tvalidation-mlogloss:0.72734\n", 332 | "[730]\tvalidation-mlogloss:0.726798\n", 333 | "[735]\tvalidation-mlogloss:0.726255\n", 334 | "[740]\tvalidation-mlogloss:0.725813\n", 335 | "[745]\tvalidation-mlogloss:0.72555\n", 336 | "[750]\tvalidation-mlogloss:0.725276\n", 337 | "[755]\tvalidation-mlogloss:0.724911\n", 338 | "[760]\tvalidation-mlogloss:0.72455\n", 339 | "[765]\tvalidation-mlogloss:0.724204\n", 340 | "[770]\tvalidation-mlogloss:0.723887\n", 341 | "[775]\tvalidation-mlogloss:0.7234\n", 342 | "[780]\tvalidation-mlogloss:0.723135\n", 343 | "[785]\tvalidation-mlogloss:0.722946\n", 344 | "[790]\tvalidation-mlogloss:0.722694\n", 345 | "[795]\tvalidation-mlogloss:0.722457\n", 346 | "[800]\tvalidation-mlogloss:0.722126\n", 347 | "[805]\tvalidation-mlogloss:0.721843\n", 348 | "[810]\tvalidation-mlogloss:0.721614\n", 349 | "[815]\tvalidation-mlogloss:0.721299\n", 350 | "[820]\tvalidation-mlogloss:0.721143\n", 351 | "[825]\tvalidation-mlogloss:0.720921\n", 352 | "[830]\tvalidation-mlogloss:0.720634\n", 353 | "[835]\tvalidation-mlogloss:0.720495\n", 354 | "[840]\tvalidation-mlogloss:0.720178\n", 355 | "[845]\tvalidation-mlogloss:0.720019\n", 356 | "[850]\tvalidation-mlogloss:0.719801\n", 357 | "[855]\tvalidation-mlogloss:0.719547\n", 358 | "[860]\tvalidation-mlogloss:0.719352\n", 359 | "[865]\tvalidation-mlogloss:0.719283\n", 360 | "[870]\tvalidation-mlogloss:0.719227\n", 361 | "[875]\tvalidation-mlogloss:0.719052\n", 362 | "[880]\tvalidation-mlogloss:0.718767\n", 363 | "[885]\tvalidation-mlogloss:0.718456\n", 364 | "[890]\tvalidation-mlogloss:0.718281\n", 365 | "[895]\tvalidation-mlogloss:0.717906\n", 366 | "[900]\tvalidation-mlogloss:0.717877\n", 367 | "[905]\tvalidation-mlogloss:0.717815\n", 368 | "[910]\tvalidation-mlogloss:0.71755\n", 369 | "[915]\tvalidation-mlogloss:0.71724\n", 370 | "[920]\tvalidation-mlogloss:0.71702\n", 371 | "[925]\tvalidation-mlogloss:0.716833\n", 372 | "[930]\tvalidation-mlogloss:0.716557\n", 373 | "[935]\tvalidation-mlogloss:0.71652\n", 374 | "[940]\tvalidation-mlogloss:0.71624\n", 375 | "[945]\tvalidation-mlogloss:0.716148\n", 376 | "[950]\tvalidation-mlogloss:0.716035\n", 377 | "[955]\tvalidation-mlogloss:0.715931\n", 378 | "[960]\tvalidation-mlogloss:0.715935\n", 379 | "[965]\tvalidation-mlogloss:0.715737\n", 380 | "[970]\tvalidation-mlogloss:0.715509\n", 381 | "[975]\tvalidation-mlogloss:0.715293\n", 382 | "[980]\tvalidation-mlogloss:0.715219\n", 383 | "[985]\tvalidation-mlogloss:0.715065\n", 384 | "[990]\tvalidation-mlogloss:0.714847\n", 385 | "[995]\tvalidation-mlogloss:0.714813\n", 386 | "[1000]\tvalidation-mlogloss:0.714714\n", 387 | "[1005]\tvalidation-mlogloss:0.714639\n", 388 | "[1010]\tvalidation-mlogloss:0.714469\n", 389 | "[1015]\tvalidation-mlogloss:0.71441\n", 390 | "[1020]\tvalidation-mlogloss:0.714305\n", 391 | "[1025]\tvalidation-mlogloss:0.714259\n", 392 | "[1030]\tvalidation-mlogloss:0.713998\n", 393 | "[1035]\tvalidation-mlogloss:0.713961\n", 394 | "[1040]\tvalidation-mlogloss:0.713896\n", 395 | "[1045]\tvalidation-mlogloss:0.713799\n", 396 | "[1050]\tvalidation-mlogloss:0.71369\n", 397 | "[1055]\tvalidation-mlogloss:0.713513\n", 398 | "[1060]\tvalidation-mlogloss:0.713401\n", 399 | "[1065]\tvalidation-mlogloss:0.713299\n", 400 | "[1070]\tvalidation-mlogloss:0.713289\n", 401 | "[1075]\tvalidation-mlogloss:0.713217\n", 402 | "[1080]\tvalidation-mlogloss:0.713112\n", 403 | "[1085]\tvalidation-mlogloss:0.713021\n", 404 | "[1090]\tvalidation-mlogloss:0.712982\n", 405 | "[1095]\tvalidation-mlogloss:0.7129\n", 406 | "[1100]\tvalidation-mlogloss:0.71279\n", 407 | "[1105]\tvalidation-mlogloss:0.712744\n", 408 | "[1110]\tvalidation-mlogloss:0.712776\n", 409 | "[1115]\tvalidation-mlogloss:0.712813\n", 410 | "[1120]\tvalidation-mlogloss:0.712662\n", 411 | "[1125]\tvalidation-mlogloss:0.712601\n", 412 | "[1130]\tvalidation-mlogloss:0.712567\n", 413 | "[1135]\tvalidation-mlogloss:0.712414\n", 414 | "[1140]\tvalidation-mlogloss:0.712516\n", 415 | "[1145]\tvalidation-mlogloss:0.712486\n", 416 | "[1150]\tvalidation-mlogloss:0.712497\n", 417 | "[1155]\tvalidation-mlogloss:0.71241\n", 418 | "[1160]\tvalidation-mlogloss:0.712328\n", 419 | "[1165]\tvalidation-mlogloss:0.712218\n", 420 | "[1170]\tvalidation-mlogloss:0.712184\n", 421 | "[1175]\tvalidation-mlogloss:0.712109\n", 422 | "[1180]\tvalidation-mlogloss:0.711965\n" 423 | ] 424 | }, 425 | { 426 | "name": "stdout", 427 | "output_type": "stream", 428 | "text": [ 429 | "[1185]\tvalidation-mlogloss:0.71189\n", 430 | "[1190]\tvalidation-mlogloss:0.711869\n", 431 | "[1195]\tvalidation-mlogloss:0.711838\n", 432 | "[1200]\tvalidation-mlogloss:0.711769\n", 433 | "[1205]\tvalidation-mlogloss:0.711646\n", 434 | "[1210]\tvalidation-mlogloss:0.711689\n", 435 | "[1215]\tvalidation-mlogloss:0.711609\n", 436 | "[1220]\tvalidation-mlogloss:0.711547\n", 437 | "[1225]\tvalidation-mlogloss:0.711521\n", 438 | "[1230]\tvalidation-mlogloss:0.711589\n", 439 | "[1235]\tvalidation-mlogloss:0.711663\n", 440 | "[1240]\tvalidation-mlogloss:0.711674\n", 441 | "[1245]\tvalidation-mlogloss:0.71156\n", 442 | "[1250]\tvalidation-mlogloss:0.711497\n", 443 | "[1255]\tvalidation-mlogloss:0.711361\n", 444 | "[1260]\tvalidation-mlogloss:0.711408\n", 445 | "[1265]\tvalidation-mlogloss:0.711342\n", 446 | "[1270]\tvalidation-mlogloss:0.711376\n", 447 | "[1275]\tvalidation-mlogloss:0.711298\n", 448 | "[1280]\tvalidation-mlogloss:0.711231\n", 449 | "[1285]\tvalidation-mlogloss:0.711108\n", 450 | "[1290]\tvalidation-mlogloss:0.711031\n", 451 | "[1295]\tvalidation-mlogloss:0.711023\n", 452 | "[1300]\tvalidation-mlogloss:0.710938\n", 453 | "[1305]\tvalidation-mlogloss:0.710947\n", 454 | "[1310]\tvalidation-mlogloss:0.710972\n", 455 | "[1315]\tvalidation-mlogloss:0.710945\n", 456 | "[1320]\tvalidation-mlogloss:0.710947\n", 457 | "[1325]\tvalidation-mlogloss:0.711006\n", 458 | "[1330]\tvalidation-mlogloss:0.710982\n", 459 | "[1335]\tvalidation-mlogloss:0.711017\n", 460 | "[1340]\tvalidation-mlogloss:0.711108\n", 461 | "[1345]\tvalidation-mlogloss:0.711075\n", 462 | "[1350]\tvalidation-mlogloss:0.711025\n", 463 | "[1355]\tvalidation-mlogloss:0.71096\n", 464 | "[1360]\tvalidation-mlogloss:0.710906\n", 465 | "[1365]\tvalidation-mlogloss:0.710882\n", 466 | "[1370]\tvalidation-mlogloss:0.710811\n", 467 | "[1375]\tvalidation-mlogloss:0.710906\n", 468 | "[1380]\tvalidation-mlogloss:0.71092\n", 469 | "[1385]\tvalidation-mlogloss:0.710909\n", 470 | "[1390]\tvalidation-mlogloss:0.710957\n", 471 | "[1395]\tvalidation-mlogloss:0.710962\n", 472 | "[1400]\tvalidation-mlogloss:0.710939\n", 473 | "[1405]\tvalidation-mlogloss:0.710872\n", 474 | "[1410]\tvalidation-mlogloss:0.710834\n", 475 | "[1415]\tvalidation-mlogloss:0.710934\n", 476 | "[1420]\tvalidation-mlogloss:0.71089\n", 477 | "[1425]\tvalidation-mlogloss:0.710867\n", 478 | "[1430]\tvalidation-mlogloss:0.710875\n", 479 | "[1435]\tvalidation-mlogloss:0.710858\n", 480 | "[1440]\tvalidation-mlogloss:0.71087\n", 481 | "[1445]\tvalidation-mlogloss:0.710857\n", 482 | "[1450]\tvalidation-mlogloss:0.710858\n", 483 | "[1455]\tvalidation-mlogloss:0.71087\n", 484 | "[1460]\tvalidation-mlogloss:0.710908\n", 485 | "[1465]\tvalidation-mlogloss:0.710846\n", 486 | "[1470]\tvalidation-mlogloss:0.710798\n", 487 | "Stopping. Best iteration:\n", 488 | "[1371]\tvalidation-mlogloss:0.710787\n", 489 | "\n" 490 | ] 491 | } 492 | ], 493 | "source": [ 494 | "train_d = xgb.DMatrix(train_X, train_Y)\n", 495 | "test_d = xgb.DMatrix(test_X, test_Y)\n", 496 | "params_xgd = {\n", 497 | " 'min_child_weight': 10.0,\n", 498 | " 'max_depth': 7,\n", 499 | " 'objective': 'multi:softprob',\n", 500 | " 'max_delta_step': 1.8,\n", 501 | " 'num_class': len(labels),\n", 502 | " 'colsample_bytree': 0.4,\n", 503 | " 'subsample': 0.8,\n", 504 | " 'learning_rate': 0.1,\n", 505 | " 'gamma': 0.65,\n", 506 | " 'silent':False,\n", 507 | " 'eval_metric': 'mlogloss',\n", 508 | " 'tree_method':'gpu_hist'\n", 509 | "}\n", 510 | "model = xgb.train(params_xgd, train_d, 10000, evals=[(test_d, 'validation')], \n", 511 | " early_stopping_rounds=100, verbose_eval=5)" 512 | ] 513 | }, 514 | { 515 | "cell_type": "code", 516 | "execution_count": 16, 517 | "metadata": {}, 518 | "outputs": [ 519 | { 520 | "name": "stdout", 521 | "output_type": "stream", 522 | "text": [ 523 | "accuracy validation set: 0.801047951731\n", 524 | " precision recall f1-score support\n", 525 | "\n", 526 | " bed 0.71 0.78 0.74 330\n", 527 | " bird 0.85 0.83 0.84 348\n", 528 | " cat 0.81 0.85 0.83 362\n", 529 | " dog 0.76 0.70 0.73 351\n", 530 | " down 0.77 0.74 0.75 442\n", 531 | " eight 0.83 0.86 0.85 485\n", 532 | " five 0.80 0.77 0.78 478\n", 533 | " four 0.83 0.88 0.86 460\n", 534 | " go 0.68 0.69 0.69 460\n", 535 | " house 0.90 0.82 0.86 368\n", 536 | " left 0.81 0.78 0.79 495\n", 537 | " marvin 0.87 0.80 0.84 363\n", 538 | " nine 0.81 0.80 0.80 455\n", 539 | " no 0.76 0.74 0.75 468\n", 540 | " off 0.77 0.78 0.78 464\n", 541 | " on 0.78 0.74 0.76 447\n", 542 | " one 0.76 0.82 0.79 418\n", 543 | " right 0.86 0.80 0.83 491\n", 544 | " seven 0.86 0.82 0.84 495\n", 545 | " sheila 0.94 0.87 0.90 359\n", 546 | " six 0.78 0.88 0.83 474\n", 547 | " stop 0.84 0.80 0.82 489\n", 548 | " three 0.78 0.80 0.79 476\n", 549 | " tree 0.81 0.71 0.76 329\n", 550 | " two 0.77 0.81 0.79 506\n", 551 | " up 0.70 0.82 0.76 504\n", 552 | " wow 0.80 0.82 0.81 330\n", 553 | " yes 0.84 0.86 0.85 496\n", 554 | " zero 0.82 0.84 0.83 453\n", 555 | "\n", 556 | "avg / total 0.80 0.80 0.80 12596\n", 557 | "\n" 558 | ] 559 | } 560 | ], 561 | "source": [ 562 | "predicted = np.argmax(model.predict(xgb.DMatrix(test_X),ntree_limit=model.best_ntree_limit),axis=1)\n", 563 | "print('accuracy validation set: ', np.mean(predicted == test_Y))\n", 564 | "\n", 565 | "# print scores\n", 566 | "print(metrics.classification_report(test_Y, predicted, target_names = labels))" 567 | ] 568 | }, 569 | { 570 | "cell_type": "code", 571 | "execution_count": null, 572 | "metadata": { 573 | "collapsed": true 574 | }, 575 | "outputs": [], 576 | "source": [] 577 | } 578 | ], 579 | "metadata": { 580 | "kernelspec": { 581 | "display_name": "Python 3", 582 | "language": "python", 583 | "name": "python3" 584 | }, 585 | "language_info": { 586 | "codemirror_mode": { 587 | "name": "ipython", 588 | "version": 3 589 | }, 590 | "file_extension": ".py", 591 | "mimetype": "text/x-python", 592 | "name": "python", 593 | "nbconvert_exporter": "python", 594 | "pygments_lexer": "ipython3", 595 | "version": "3.5.2" 596 | } 597 | }, 598 | "nbformat": 4, 599 | "nbformat_minor": 2 600 | } 601 | -------------------------------------------------------------------------------- /deep-learning/spectrogram-feedforward.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": true 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "import tensorflow as tf\n", 12 | "import numpy as np\n", 13 | "import matplotlib.mlab\n", 14 | "import scipy.io.wavfile\n", 15 | "import scipy\n", 16 | "import pandas as pd\n", 17 | "import time\n", 18 | "from sklearn import metrics\n", 19 | "import matplotlib.pyplot as plt\n", 20 | "import seaborn as sns\n", 21 | "sns.set()" 22 | ] 23 | }, 24 | { 25 | "cell_type": "code", 26 | "execution_count": 2, 27 | "metadata": {}, 28 | "outputs": [ 29 | { 30 | "data": { 31 | "text/html": [ 32 | "
\n", 33 | "\n", 34 | " \n", 35 | " \n", 36 | " \n", 37 | " \n", 38 | " \n", 39 | " \n", 40 | " \n", 41 | " \n", 42 | " \n", 43 | " \n", 44 | " \n", 45 | " \n", 46 | " \n", 47 | " \n", 48 | " \n", 49 | " \n", 50 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | "
slice_file_namefsIDstartendsaliencefoldclassIDclass
3260audio/fold10/167464-0-0-24.wav16746412.00000016.0000002100air_conditioner
6893audio/fold1/57553-3-2-0.wav5755313.06360314.279479213dog_bark
8649audio/fold3/98681-9-0-0.wav986810.0000004.000000239street_music
2201audio/fold9/155044-9-0-38.wav15504419.00000023.000000199street_music
4269audio/fold8/180134-4-2-15.wav18013449.37811053.378110184drilling
\n", 105 | "
" 106 | ], 107 | "text/plain": [ 108 | " slice_file_name fsID start end salience \\\n", 109 | "3260 audio/fold10/167464-0-0-24.wav 167464 12.000000 16.000000 2 \n", 110 | "6893 audio/fold1/57553-3-2-0.wav 57553 13.063603 14.279479 2 \n", 111 | "8649 audio/fold3/98681-9-0-0.wav 98681 0.000000 4.000000 2 \n", 112 | "2201 audio/fold9/155044-9-0-38.wav 155044 19.000000 23.000000 1 \n", 113 | "4269 audio/fold8/180134-4-2-15.wav 180134 49.378110 53.378110 1 \n", 114 | "\n", 115 | " fold classID class \n", 116 | "3260 10 0 air_conditioner \n", 117 | "6893 1 3 dog_bark \n", 118 | "8649 3 9 street_music \n", 119 | "2201 9 9 street_music \n", 120 | "4269 8 4 drilling " 121 | ] 122 | }, 123 | "execution_count": 2, 124 | "metadata": {}, 125 | "output_type": "execute_result" 126 | } 127 | ], 128 | "source": [ 129 | "dataset = pd.read_csv('/home/husein/space/UrbanSound8K/metadata/UrbanSound8K.csv')\n", 130 | "dataset.slice_file_name = 'audio/fold' + dataset.fold.astype(str) + '/' + dataset.slice_file_name\n", 131 | "dataset = dataset.iloc[np.random.permutation(len(dataset))]\n", 132 | "dataset.head()" 133 | ] 134 | }, 135 | { 136 | "cell_type": "code", 137 | "execution_count": 3, 138 | "metadata": {}, 139 | "outputs": [ 140 | { 141 | "data": { 142 | "text/plain": [ 143 | "array(['air_conditioner', 'car_horn', 'children_playing', 'dog_bark',\n", 144 | " 'drilling', 'engine_idling', 'gun_shot', 'jackhammer', 'siren',\n", 145 | " 'street_music'], dtype=object)" 146 | ] 147 | }, 148 | "execution_count": 3, 149 | "metadata": {}, 150 | "output_type": "execute_result" 151 | } 152 | ], 153 | "source": [ 154 | "unique_sound = np.unique(dataset.iloc[:, -1])\n", 155 | "unique_sound" 156 | ] 157 | }, 158 | { 159 | "cell_type": "code", 160 | "execution_count": 4, 161 | "metadata": { 162 | "collapsed": true 163 | }, 164 | "outputs": [], 165 | "source": [ 166 | "# define our global variables\n", 167 | "learning_rate = 0.001\n", 168 | "sound_dimension = [64, 512]\n", 169 | "batch_size = 128\n", 170 | "epoch = 20" 171 | ] 172 | }, 173 | { 174 | "cell_type": "code", 175 | "execution_count": 5, 176 | "metadata": { 177 | "collapsed": true 178 | }, 179 | "outputs": [], 180 | "source": [ 181 | "def processAudio(audio_file):\n", 182 | " rate, data = scipy.io.wavfile.read(audio_file)\n", 183 | " try:\n", 184 | " if data.shape[1]:\n", 185 | " data = np.mean(data, axis = 1)\n", 186 | " except:\n", 187 | " pass\n", 188 | " audio = matplotlib.mlab.specgram(data)[0]\n", 189 | " audio = scipy.misc.imresize(audio, sound_dimension)\n", 190 | " return audio.flatten()" 191 | ] 192 | }, 193 | { 194 | "cell_type": "code", 195 | "execution_count": 6, 196 | "metadata": { 197 | "collapsed": true 198 | }, 199 | "outputs": [], 200 | "source": [ 201 | "class Model:\n", 202 | " def __init__(self, size_output):\n", 203 | " self.X = tf.placeholder(tf.float32, (None, sound_dimension[0] * sound_dimension[1]))\n", 204 | " self.Y = tf.placeholder(tf.float32, (None, size_output))\n", 205 | " \n", 206 | " w1 = tf.Variable(tf.random_normal([sound_dimension[0] * sound_dimension[1], 784], stddev = np.sqrt(1/784.0)))\n", 207 | " b1 = tf.Variable(tf.random_normal([784], stddev = 0))\n", 208 | " \n", 209 | " w2 = tf.Variable(tf.random_normal([784, 256], stddev = np.sqrt(1/256.0)))\n", 210 | " b2 = tf.Variable(tf.random_normal([256], stddev = 0))\n", 211 | " \n", 212 | " w3 = tf.Variable(tf.random_normal([256, 100], stddev = np.sqrt(1/100.0)))\n", 213 | " b3 = tf.Variable(tf.random_normal([100], stddev = 0))\n", 214 | " \n", 215 | " w4 = tf.Variable(tf.random_normal([100, size_output], stddev = np.sqrt(1/(size_output * 1.0))))\n", 216 | " b4 = tf.Variable(tf.random_normal([size_output], stddev = 0))\n", 217 | " \n", 218 | " hidden1 = tf.nn.relu(tf.matmul(self.X, w1) + b1)\n", 219 | " hidden2 = tf.nn.relu(tf.matmul(hidden1, w2) + b2)\n", 220 | " hidden3 = tf.nn.relu(tf.matmul(hidden2, w3) + b3)\n", 221 | " self.logits = tf.matmul(hidden3, w4) + b4\n", 222 | " self.cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = self.logits, labels = self.Y))\n", 223 | " self.optimizer = tf.train.AdamOptimizer(learning_rate).minimize(self.cost)\n", 224 | " correct_prediction = tf.equal(tf.argmax(self.logits, 1), tf.argmax(self.Y, 1))\n", 225 | " self.accuracy = tf.reduce_mean(tf.cast(correct_prediction, \"float\"))" 226 | ] 227 | }, 228 | { 229 | "cell_type": "code", 230 | "execution_count": 7, 231 | "metadata": { 232 | "collapsed": true 233 | }, 234 | "outputs": [], 235 | "source": [ 236 | "no_classes = np.unique(dataset['classID']).shape[0]\n", 237 | "sess = tf.InteractiveSession()\n", 238 | "model = Model(no_classes)\n", 239 | "sess.run(tf.global_variables_initializer())\n", 240 | "saver = tf.train.Saver(tf.global_variables())\n", 241 | "\n", 242 | "train_dataset = dataset.iloc[:int(dataset.shape[0] * 0.80), :]\n", 243 | "test_dataset = dataset.iloc[int(dataset.shape[0] * 0.80):, :]" 244 | ] 245 | }, 246 | { 247 | "cell_type": "code", 248 | "execution_count": 8, 249 | "metadata": {}, 250 | "outputs": [ 251 | { 252 | "name": "stdout", 253 | "output_type": "stream", 254 | "text": [ 255 | "('epoch: ', 1, 'avg loss: ', 38.681511048917415, 'avg acc: ', 0.34631681497450229, 'avg time: ', 1.1846145391464233)\n", 256 | "('epoch: ', 2, 'avg loss: ', 10.284185537585506, 'avg acc: ', 0.46804722039787855, 'avg time: ', 1.1832178124675043)\n", 257 | "('epoch: ', 3, 'avg loss: ', 4.818431311183506, 'avg acc: ', 0.58318529691961074, 'avg time: ', 1.1827876479537398)\n", 258 | "('epoch: ', 4, 'avg loss: ', 3.856180195455198, 'avg acc: ', 0.63080330910506077, 'avg time: ', 1.1820432036011308)\n", 259 | "('epoch: ', 5, 'avg loss: ', 3.2105771016191551, 'avg acc: ', 0.67482221457693314, 'avg time: ', 1.1815304623709784)\n", 260 | "('epoch: ', 6, 'avg loss: ', 2.2258183338023998, 'avg acc: ', 0.71529215795022472, 'avg time: ', 1.1794133892765752)\n", 261 | "('epoch: ', 7, 'avg loss: ', 2.0526084447348558, 'avg acc: ', 0.75042694807052612, 'avg time: ', 1.178878316172847)\n", 262 | "('epoch: ', 8, 'avg loss: ', 1.5949348023644201, 'avg acc: ', 0.77596086815551479, 'avg time: ', 1.1801795738714713)\n", 263 | "('epoch: ', 9, 'avg loss: ', 1.196668208197311, 'avg acc: ', 0.81461248022538646, 'avg time: ', 1.1814612061889083)\n", 264 | "('epoch: ', 10, 'avg loss: ', 1.0416298144393497, 'avg acc: ', 0.83346935113271081, 'avg time: ', 1.1791424839584916)\n", 265 | "('epoch: ', 11, 'avg loss: ', 0.65676048177259938, 'avg acc: ', 0.87958187085610851, 'avg time: ', 1.180457146079452)\n", 266 | "('epoch: ', 12, 'avg loss: ', 0.57014686586680241, 'avg acc: ', 0.89842911671709136, 'avg time: ', 1.1808845025521737)\n", 267 | "('epoch: ', 13, 'avg loss: ', 0.43195612011132417, 'avg acc: ', 0.91864983792658206, 'avg time: ', 1.1811832012953583)\n", 268 | "('epoch: ', 14, 'avg loss: ', 0.34176873553682258, 'avg acc: ', 0.93126081316559406, 'avg time: ', 1.1802966682999223)\n", 269 | "('epoch: ', 15, 'avg loss: ', 0.33069951915078694, 'avg acc: ', 0.93880702279232164, 'avg time: ', 1.1802366265544184)\n", 270 | "('epoch: ', 16, 'avg loss: ', 0.38642849511018507, 'avg acc: ', 0.93253386131039373, 'avg time: ', 1.1820005178451538)\n", 271 | "('epoch: ', 17, 'avg loss: ', 0.39718584895685866, 'avg acc: ', 0.92877270888399199, 'avg time: ', 1.1809541119469538)\n", 272 | "('epoch: ', 18, 'avg loss: ', 0.36242452760537464, 'avg acc: ', 0.94086872648309783, 'avg time: ', 1.1805584607300934)\n", 273 | "('epoch: ', 19, 'avg loss: ', 0.42873860757659982, 'avg acc: ', 0.93803447705728038, 'avg time: ', 1.1796522979383115)\n", 274 | "('epoch: ', 20, 'avg loss: ', 0.39530716519112941, 'avg acc: ', 0.93634235196643401, 'avg time: ', 1.1792994251957647)\n" 275 | ] 276 | } 277 | ], 278 | "source": [ 279 | "ACCURACY, LOST = [], []\n", 280 | "for i in range(epoch):\n", 281 | " last = time.time()\n", 282 | " total_acc, total_loss = 0, 0\n", 283 | " for k in range(0, (train_dataset.shape[0] // batch_size) * batch_size, batch_size):\n", 284 | " batch_x, batch_y = [], []\n", 285 | " for n in range(batch_size):\n", 286 | " try:\n", 287 | " batch_x.append(processAudio(train_dataset.slice_file_name.iloc[k + n]))\n", 288 | " onehot = np.zeros((no_classes))\n", 289 | " onehot[train_dataset.classID.iloc[k + n]] = 1.0\n", 290 | " batch_y.append(onehot)\n", 291 | " except Exception as e:\n", 292 | " continue\n", 293 | " batch_x = np.array(batch_x)\n", 294 | " batch_y = np.array(batch_y)\n", 295 | " loss, _ = sess.run([model.cost, model.optimizer], feed_dict = {model.X: batch_x, model.Y: batch_y})\n", 296 | " total_acc += sess.run(model.accuracy, feed_dict = {model.X: batch_x, model.Y: batch_y})\n", 297 | " total_loss += loss\n", 298 | " total_loss /= (train_dataset.shape[0] // batch_size)\n", 299 | " total_acc /= (train_dataset.shape[0] // batch_size)\n", 300 | " ACCURACY.append(total_acc)\n", 301 | " LOST.append(total_loss)\n", 302 | " print('epoch: ', i + 1, 'avg loss: ', total_loss, 'avg acc: ', total_acc, 'avg time: ', (time.time() - last) / (train_dataset.shape[0] // batch_size))" 303 | ] 304 | }, 305 | { 306 | "cell_type": "code", 307 | "execution_count": 9, 308 | "metadata": {}, 309 | "outputs": [ 310 | { 311 | "name": "stdout", 312 | "output_type": "stream", 313 | "text": [ 314 | "testing accuracy: 0.472927\n", 315 | " precision recall f1-score support\n", 316 | "\n", 317 | " air_conditioner 0.39 0.39 0.39 112\n", 318 | " car_horn 0.40 0.50 0.45 68\n", 319 | "children_playing 0.31 0.20 0.24 116\n", 320 | " dog_bark 0.62 0.47 0.54 142\n", 321 | " drilling 0.39 0.83 0.53 142\n", 322 | " engine_idling 0.47 0.50 0.48 127\n", 323 | " gun_shot 0.70 0.55 0.62 67\n", 324 | " jackhammer 0.50 0.52 0.51 137\n", 325 | " siren 0.68 0.68 0.68 132\n", 326 | " street_music 0.32 0.09 0.14 139\n", 327 | "\n", 328 | " avg / total 0.47 0.47 0.45 1182\n", 329 | "\n" 330 | ] 331 | } 332 | ], 333 | "source": [ 334 | "batch_x, batch_y, labels = [], [], []\n", 335 | "for n in range(test_dataset.shape[0]):\n", 336 | " try:\n", 337 | " batch_x.append(processAudio(test_dataset.slice_file_name.iloc[n]))\n", 338 | " onehot = np.zeros((no_classes))\n", 339 | " onehot[test_dataset.classID.iloc[n]] = 1.0\n", 340 | " batch_y.append(onehot)\n", 341 | " labels.append(test_dataset.classID.iloc[n])\n", 342 | " except Exception as e:\n", 343 | " continue\n", 344 | "batch_x = np.array(batch_x)\n", 345 | "batch_y = np.array(batch_y)\n", 346 | "acc, logits = sess.run([model.accuracy, tf.cast(tf.argmax(model.logits, 1), tf.int32)], feed_dict = {model.X : batch_x, model.Y : batch_y})\n", 347 | "print 'testing accuracy: ' + str(acc)\n", 348 | "print(metrics.classification_report(labels, logits, target_names = np.unique(unique_sound)))" 349 | ] 350 | }, 351 | { 352 | "cell_type": "code", 353 | "execution_count": 10, 354 | "metadata": {}, 355 | "outputs": [ 356 | { 357 | "data": { 358 | "image/png": "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\n", 359 | "text/plain": [ 360 | "" 361 | ] 362 | }, 363 | "metadata": {}, 364 | "output_type": "display_data" 365 | } 366 | ], 367 | "source": [ 368 | "EPOCH = np.arange(len(LOST))\n", 369 | "plt.subplot(1, 2, 1)\n", 370 | "plt.plot(EPOCH, LOST)\n", 371 | "plt.xlabel('epoch'); plt.ylabel('loss')\n", 372 | "plt.subplot(1, 2, 2)\n", 373 | "plt.plot(EPOCH, ACCURACY)\n", 374 | "plt.xlabel('epoch'); plt.ylabel('accuracy')\n", 375 | "plt.show()" 376 | ] 377 | } 378 | ], 379 | "metadata": { 380 | "kernelspec": { 381 | "display_name": "Python 2", 382 | "language": "python", 383 | "name": "python2" 384 | }, 385 | "language_info": { 386 | "codemirror_mode": { 387 | "name": "ipython", 388 | "version": 2 389 | }, 390 | "file_extension": ".py", 391 | "mimetype": "text/x-python", 392 | "name": "python", 393 | "nbconvert_exporter": "python", 394 | "pygments_lexer": "ipython2", 395 | "version": "2.7.12" 396 | } 397 | }, 398 | "nbformat": 4, 399 | "nbformat_minor": 2 400 | } 401 | -------------------------------------------------------------------------------- /deep-learning/spectrogram-rnn.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": true 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "import tensorflow as tf\n", 12 | "import numpy as np\n", 13 | "import matplotlib.mlab\n", 14 | "import scipy.io.wavfile\n", 15 | "import scipy\n", 16 | "import pandas as pd\n", 17 | "import time\n", 18 | "from sklearn import metrics\n", 19 | "import matplotlib.pyplot as plt\n", 20 | "import seaborn as sns\n", 21 | "sns.set()" 22 | ] 23 | }, 24 | { 25 | "cell_type": "code", 26 | "execution_count": 2, 27 | "metadata": {}, 28 | "outputs": [ 29 | { 30 | "data": { 31 | "text/html": [ 32 | "
\n", 33 | "\n", 34 | " \n", 35 | " \n", 36 | " \n", 37 | " \n", 38 | " \n", 39 | " \n", 40 | " \n", 41 | " \n", 42 | " \n", 43 | " \n", 44 | " \n", 45 | " \n", 46 | " \n", 47 | " \n", 48 | " \n", 49 | " \n", 50 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | "
slice_file_namefsIDstartendsaliencefoldclassIDclass
1129audio/fold8/125678-7-4-4.wav12567896.843843100.843843187jackhammer
3860audio/fold1/177621-0-0-105.wav17762152.50000056.500000210air_conditioner
177audio/fold1/103074-7-1-3.wav10307424.01731728.017317117jackhammer
696audio/fold8/113202-5-0-15.wav1132027.50000011.500000185engine_idling
3568audio/fold4/173994-3-0-44.wav17399422.00000026.000000143dog_bark
\n", 105 | "
" 106 | ], 107 | "text/plain": [ 108 | " slice_file_name fsID start end salience \\\n", 109 | "1129 audio/fold8/125678-7-4-4.wav 125678 96.843843 100.843843 1 \n", 110 | "3860 audio/fold1/177621-0-0-105.wav 177621 52.500000 56.500000 2 \n", 111 | "177 audio/fold1/103074-7-1-3.wav 103074 24.017317 28.017317 1 \n", 112 | "696 audio/fold8/113202-5-0-15.wav 113202 7.500000 11.500000 1 \n", 113 | "3568 audio/fold4/173994-3-0-44.wav 173994 22.000000 26.000000 1 \n", 114 | "\n", 115 | " fold classID class \n", 116 | "1129 8 7 jackhammer \n", 117 | "3860 1 0 air_conditioner \n", 118 | "177 1 7 jackhammer \n", 119 | "696 8 5 engine_idling \n", 120 | "3568 4 3 dog_bark " 121 | ] 122 | }, 123 | "execution_count": 2, 124 | "metadata": {}, 125 | "output_type": "execute_result" 126 | } 127 | ], 128 | "source": [ 129 | "dataset = pd.read_csv('/home/husein/space/UrbanSound8K/metadata/UrbanSound8K.csv')\n", 130 | "dataset.slice_file_name = 'audio/fold' + dataset.fold.astype(str) + '/' + dataset.slice_file_name\n", 131 | "dataset = dataset.iloc[np.random.permutation(len(dataset))]\n", 132 | "dataset.head()" 133 | ] 134 | }, 135 | { 136 | "cell_type": "code", 137 | "execution_count": 3, 138 | "metadata": {}, 139 | "outputs": [ 140 | { 141 | "data": { 142 | "text/plain": [ 143 | "array(['air_conditioner', 'car_horn', 'children_playing', 'dog_bark',\n", 144 | " 'drilling', 'engine_idling', 'gun_shot', 'jackhammer', 'siren',\n", 145 | " 'street_music'], dtype=object)" 146 | ] 147 | }, 148 | "execution_count": 3, 149 | "metadata": {}, 150 | "output_type": "execute_result" 151 | } 152 | ], 153 | "source": [ 154 | "unique_sound = np.unique(dataset.iloc[:, -1])\n", 155 | "unique_sound" 156 | ] 157 | }, 158 | { 159 | "cell_type": "code", 160 | "execution_count": 4, 161 | "metadata": { 162 | "collapsed": true 163 | }, 164 | "outputs": [], 165 | "source": [ 166 | "learning_rate = 0.001\n", 167 | "time_stamp = 64\n", 168 | "dimension = 512\n", 169 | "batch_size = 128\n", 170 | "epoch = 20\n", 171 | "num_layers = 3\n", 172 | "size_layer = 256" 173 | ] 174 | }, 175 | { 176 | "cell_type": "code", 177 | "execution_count": 5, 178 | "metadata": {}, 179 | "outputs": [], 180 | "source": [ 181 | "def processAudio(audio_file):\n", 182 | " rate, data = scipy.io.wavfile.read(audio_file)\n", 183 | " try:\n", 184 | " if data.shape[1]:\n", 185 | " data = np.mean(data, axis = 1)\n", 186 | " except:\n", 187 | " pass\n", 188 | " audio = matplotlib.mlab.specgram(data)[0]\n", 189 | " return scipy.misc.imresize(audio, [time_stamp, dimension])" 190 | ] 191 | }, 192 | { 193 | "cell_type": "code", 194 | "execution_count": 6, 195 | "metadata": { 196 | "collapsed": true 197 | }, 198 | "outputs": [], 199 | "source": [ 200 | "class Model:\n", 201 | " \n", 202 | " def __init__(self, size_output):\n", 203 | " \n", 204 | " def lstm_cell():\n", 205 | " return tf.nn.rnn_cell.LSTMCell(size_layer)\n", 206 | " \n", 207 | " self.rnn_cells = tf.nn.rnn_cell.MultiRNNCell([lstm_cell() for _ in range(num_layers)])\n", 208 | " \n", 209 | " self.X = tf.placeholder(tf.float32, [None, None, dimension])\n", 210 | " self.Y = tf.placeholder(tf.float32, [None, size_output])\n", 211 | " \n", 212 | " self.outputs, self.last_state = tf.nn.dynamic_rnn(self.rnn_cells, self.X, dtype = tf.float32)\n", 213 | " \n", 214 | " rnn_W = tf.Variable(tf.random_normal((size_layer, size_output)))\n", 215 | " rnn_B = tf.Variable(tf.random_normal([size_output]))\n", 216 | " self.logits = tf.matmul(self.outputs[:, -1], rnn_W) + rnn_B\n", 217 | " \n", 218 | " self.cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = self.logits, labels = self.Y))\n", 219 | " \n", 220 | " self.optimizer = tf.train.AdamOptimizer(learning_rate = learning_rate).minimize(self.cost)\n", 221 | " \n", 222 | " self.correct_pred = tf.equal(tf.argmax(self.logits, 1), tf.argmax(self.Y, 1))\n", 223 | " \n", 224 | " self.accuracy = tf.reduce_mean(tf.cast(self.correct_pred, tf.float32))" 225 | ] 226 | }, 227 | { 228 | "cell_type": "code", 229 | "execution_count": 7, 230 | "metadata": {}, 231 | "outputs": [], 232 | "source": [ 233 | "no_classes = np.unique(dataset['classID']).shape[0]\n", 234 | "sess = tf.InteractiveSession()\n", 235 | "model = Model(no_classes)\n", 236 | "sess.run(tf.global_variables_initializer())\n", 237 | "saver = tf.train.Saver(tf.global_variables())\n", 238 | "\n", 239 | "train_dataset = dataset.iloc[:int(dataset.shape[0] * 0.80), :]\n", 240 | "test_dataset = dataset.iloc[int(dataset.shape[0] * 0.80):, :]" 241 | ] 242 | }, 243 | { 244 | "cell_type": "code", 245 | "execution_count": 8, 246 | "metadata": {}, 247 | "outputs": [ 248 | { 249 | "name": "stdout", 250 | "output_type": "stream", 251 | "text": [ 252 | "('epoch: ', 1, 'avg loss: ', 2.1510376665327282, 'avg acc: ', 0.26169908640009387, 'avg time: ', 1.3004957967334323)\n", 253 | "('epoch: ', 2, 'avg loss: ', 1.8687300240551983, 'avg acc: ', 0.32877649891155736, 'avg time: ', 1.295422112500226)\n", 254 | "('epoch: ', 3, 'avg loss: ', 1.7374366014092057, 'avg acc: ', 0.38838847423041306, 'avg time: ', 1.2957094245486789)\n", 255 | "('epoch: ', 4, 'avg loss: ', 1.5682201716634963, 'avg acc: ', 0.45382225623837225, 'avg time: ', 1.2962347578119349)\n", 256 | "('epoch: ', 5, 'avg loss: ', 1.4230377409193251, 'avg acc: ', 0.5331389175521003, 'avg time: ', 1.2961179282930162)\n", 257 | "('epoch: ', 6, 'avg loss: ', 1.2770085555535775, 'avg acc: ', 0.57837841080294716, 'avg time: ', 1.295755315709997)\n", 258 | "('epoch: ', 7, 'avg loss: ', 1.2246687677171495, 'avg acc: ', 0.61030772217997797, 'avg time: ', 1.2962308724721272)\n", 259 | "('epoch: ', 8, 'avg loss: ', 1.0784213024157066, 'avg acc: ', 0.65618068531707485, 'avg time: ', 1.2960012753804524)\n", 260 | "('epoch: ', 9, 'avg loss: ', 1.0243017044332292, 'avg acc: ', 0.67723421918021309, 'avg time: ', 1.295932372411092)\n", 261 | "('epoch: ', 10, 'avg loss: ', 1.0101012035652444, 'avg acc: ', 0.68378723661104834, 'avg time: ', 1.295243704760516)\n", 262 | "('epoch: ', 11, 'avg loss: ', 0.9387575045779899, 'avg acc: ', 0.70931642033435682, 'avg time: ', 1.2958803132728294)\n", 263 | "('epoch: ', 12, 'avg loss: ', 0.93555085968088225, 'avg acc: ', 0.70732399379765543, 'avg time: ', 1.2968248702861644)\n", 264 | "('epoch: ', 13, 'avg loss: ', 0.86130006666536685, 'avg acc: ', 0.73514311953827183, 'avg time: ', 1.2967655570418746)\n", 265 | "('epoch: ', 14, 'avg loss: ', 0.82304254284611456, 'avg acc: ', 0.74056734641393029, 'avg time: ', 1.2958647586681225)\n", 266 | "('epoch: ', 15, 'avg loss: ', 0.77841641560748775, 'avg acc: ', 0.76124573416180086, 'avg time: ', 1.2965232045562178)\n", 267 | "('epoch: ', 16, 'avg loss: ', 0.6538971386573933, 'avg acc: ', 0.81949622101253938, 'avg time: ', 1.2960414047594424)\n", 268 | "('epoch: ', 17, 'avg loss: ', 0.66374334472197072, 'avg acc: ', 0.81862628791067338, 'avg time: ', 1.2959498343644318)\n", 269 | "('epoch: ', 18, 'avg loss: ', 0.59316482146581018, 'avg acc: ', 0.84701195028093124, 'avg time: ', 1.2960657234545108)\n", 270 | "('epoch: ', 19, 'avg loss: ', 0.58465038626282306, 'avg acc: ', 0.85207202589070352, 'avg time: ', 1.2953290895179466)\n", 271 | "('epoch: ', 20, 'avg loss: ', 0.57856843703322935, 'avg acc: ', 0.84852628023536114, 'avg time: ', 1.2969296464213618)\n" 272 | ] 273 | } 274 | ], 275 | "source": [ 276 | "ACCURACY, LOST = [], []\n", 277 | "for i in range(epoch):\n", 278 | " last = time.time()\n", 279 | " total_acc, total_loss = 0, 0\n", 280 | " for k in range(0, (train_dataset.shape[0] // batch_size) * batch_size, batch_size):\n", 281 | " batch_x, batch_y = [], []\n", 282 | " for n in range(batch_size):\n", 283 | " try:\n", 284 | " batch_x.append(processAudio(train_dataset.slice_file_name.iloc[k + n]))\n", 285 | " onehot = np.zeros((no_classes))\n", 286 | " onehot[train_dataset.classID.iloc[k + n]] = 1.0\n", 287 | " batch_y.append(onehot)\n", 288 | " except Exception as e:\n", 289 | " continue\n", 290 | " batch_x = np.array(batch_x)\n", 291 | " batch_y = np.array(batch_y)\n", 292 | " loss, _ = sess.run([model.cost, model.optimizer], feed_dict = {model.X: batch_x, model.Y: batch_y})\n", 293 | " total_acc += sess.run(model.accuracy, feed_dict = {model.X: batch_x, model.Y: batch_y})\n", 294 | " total_loss += loss\n", 295 | " total_loss /= (train_dataset.shape[0] // batch_size)\n", 296 | " total_acc /= (train_dataset.shape[0] // batch_size)\n", 297 | " ACCURACY.append(total_acc)\n", 298 | " LOST.append(total_loss)\n", 299 | " print('epoch: ', i + 1, 'avg loss: ', total_loss, 'avg acc: ', total_acc, 'avg time: ', (time.time() - last) / (train_dataset.shape[0] // batch_size))" 300 | ] 301 | }, 302 | { 303 | "cell_type": "code", 304 | "execution_count": 9, 305 | "metadata": {}, 306 | "outputs": [ 307 | { 308 | "name": "stdout", 309 | "output_type": "stream", 310 | "text": [ 311 | "testing accuracy: 0.453488\n", 312 | " precision recall f1-score support\n", 313 | "\n", 314 | " air_conditioner 0.35 0.55 0.43 11\n", 315 | " car_horn 0.50 0.40 0.44 5\n", 316 | "children_playing 0.20 0.11 0.14 9\n", 317 | " dog_bark 1.00 0.64 0.78 11\n", 318 | " drilling 0.38 0.45 0.42 11\n", 319 | " engine_idling 1.00 0.44 0.62 9\n", 320 | " gun_shot 1.00 0.50 0.67 2\n", 321 | " jackhammer 0.50 0.60 0.55 10\n", 322 | " siren 0.50 0.22 0.31 9\n", 323 | " street_music 0.26 0.56 0.36 9\n", 324 | "\n", 325 | " avg / total 0.54 0.45 0.46 86\n", 326 | "\n" 327 | ] 328 | } 329 | ], 330 | "source": [ 331 | "batch_x, batch_y, labels = [], [], []\n", 332 | "for n in range(128):\n", 333 | " try:\n", 334 | " batch_x.append(processAudio(test_dataset.slice_file_name.iloc[n]))\n", 335 | " onehot = np.zeros((no_classes))\n", 336 | " onehot[test_dataset.classID.iloc[n]] = 1.0\n", 337 | " batch_y.append(onehot)\n", 338 | " labels.append(test_dataset.classID.iloc[n])\n", 339 | " except Exception as e:\n", 340 | " continue\n", 341 | "batch_x = np.array(batch_x)\n", 342 | "batch_y = np.array(batch_y)\n", 343 | "acc, logits = sess.run([model.accuracy, tf.cast(tf.argmax(model.logits, 1), tf.int32)], feed_dict = {model.X : batch_x, model.Y : batch_y})\n", 344 | "print 'testing accuracy: ' + str(acc)\n", 345 | "print(metrics.classification_report(labels, logits, target_names = np.unique(unique_sound)))" 346 | ] 347 | }, 348 | { 349 | "cell_type": "code", 350 | "execution_count": 10, 351 | "metadata": {}, 352 | "outputs": [ 353 | { 354 | "data": { 355 | "image/png": "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\n", 356 | "text/plain": [ 357 | "" 358 | ] 359 | }, 360 | "metadata": {}, 361 | "output_type": "display_data" 362 | } 363 | ], 364 | "source": [ 365 | "EPOCH = np.arange(len(LOST))\n", 366 | "plt.subplot(1, 2, 1)\n", 367 | "plt.plot(EPOCH, LOST)\n", 368 | "plt.xlabel('epoch'); plt.ylabel('loss')\n", 369 | "plt.subplot(1, 2, 2)\n", 370 | "plt.plot(EPOCH, ACCURACY)\n", 371 | "plt.xlabel('epoch'); plt.ylabel('accuracy')\n", 372 | "plt.show()" 373 | ] 374 | } 375 | ], 376 | "metadata": { 377 | "kernelspec": { 378 | "display_name": "Python 2", 379 | "language": "python", 380 | "name": "python2" 381 | }, 382 | "language_info": { 383 | "codemirror_mode": { 384 | "name": "ipython", 385 | "version": 2 386 | }, 387 | "file_extension": ".py", 388 | "mimetype": "text/x-python", 389 | "name": "python", 390 | "nbconvert_exporter": "python", 391 | "pygments_lexer": "ipython2", 392 | "version": "2.7.12" 393 | } 394 | }, 395 | "nbformat": 4, 396 | "nbformat_minor": 2 397 | } 398 | -------------------------------------------------------------------------------- /deep-learning/spectrogram-cnn.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": true 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "import tensorflow as tf\n", 12 | "import numpy as np\n", 13 | "import matplotlib.mlab\n", 14 | "import scipy.io.wavfile\n", 15 | "import scipy\n", 16 | "import pandas as pd\n", 17 | "import time\n", 18 | "from sklearn import metrics\n", 19 | "import matplotlib.pyplot as plt\n", 20 | "import seaborn as sns\n", 21 | "sns.set()" 22 | ] 23 | }, 24 | { 25 | "cell_type": "code", 26 | "execution_count": 2, 27 | "metadata": {}, 28 | "outputs": [ 29 | { 30 | "data": { 31 | "text/html": [ 32 | "
\n", 33 | "\n", 34 | " \n", 35 | " \n", 36 | " \n", 37 | " \n", 38 | " \n", 39 | " \n", 40 | " \n", 41 | " \n", 42 | " \n", 43 | " \n", 44 | " \n", 45 | " \n", 46 | " \n", 47 | " \n", 48 | " \n", 49 | " \n", 50 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | "
slice_file_namefsIDstartendsaliencefoldclassIDclass
1153audio/fold7/127443-4-0-0.wav127443115.015008119.015008174drilling
4610audio/fold9/187075-5-0-6.wav1870756.44677910.446779295engine_idling
4873audio/fold4/192382-2-0-18.wav1923829.00000013.000000142children_playing
1118audio/fold8/125678-7-3-1.wav12567872.67741876.677418187jackhammer
6860audio/fold1/57320-0-0-22.wav5732011.00000015.000000210air_conditioner
\n", 105 | "
" 106 | ], 107 | "text/plain": [ 108 | " slice_file_name fsID start end salience \\\n", 109 | "1153 audio/fold7/127443-4-0-0.wav 127443 115.015008 119.015008 1 \n", 110 | "4610 audio/fold9/187075-5-0-6.wav 187075 6.446779 10.446779 2 \n", 111 | "4873 audio/fold4/192382-2-0-18.wav 192382 9.000000 13.000000 1 \n", 112 | "1118 audio/fold8/125678-7-3-1.wav 125678 72.677418 76.677418 1 \n", 113 | "6860 audio/fold1/57320-0-0-22.wav 57320 11.000000 15.000000 2 \n", 114 | "\n", 115 | " fold classID class \n", 116 | "1153 7 4 drilling \n", 117 | "4610 9 5 engine_idling \n", 118 | "4873 4 2 children_playing \n", 119 | "1118 8 7 jackhammer \n", 120 | "6860 1 0 air_conditioner " 121 | ] 122 | }, 123 | "execution_count": 2, 124 | "metadata": {}, 125 | "output_type": "execute_result" 126 | } 127 | ], 128 | "source": [ 129 | "dataset = pd.read_csv('/home/husein/space/UrbanSound8K/metadata/UrbanSound8K.csv')\n", 130 | "dataset.slice_file_name = 'audio/fold' + dataset.fold.astype(str) + '/' + dataset.slice_file_name\n", 131 | "dataset = dataset.iloc[np.random.permutation(len(dataset))]\n", 132 | "dataset.head()" 133 | ] 134 | }, 135 | { 136 | "cell_type": "code", 137 | "execution_count": 3, 138 | "metadata": {}, 139 | "outputs": [ 140 | { 141 | "data": { 142 | "text/plain": [ 143 | "array(['air_conditioner', 'car_horn', 'children_playing', 'dog_bark',\n", 144 | " 'drilling', 'engine_idling', 'gun_shot', 'jackhammer', 'siren',\n", 145 | " 'street_music'], dtype=object)" 146 | ] 147 | }, 148 | "execution_count": 3, 149 | "metadata": {}, 150 | "output_type": "execute_result" 151 | } 152 | ], 153 | "source": [ 154 | "unique_sound = np.unique(dataset.iloc[:, -1])\n", 155 | "unique_sound" 156 | ] 157 | }, 158 | { 159 | "cell_type": "code", 160 | "execution_count": 4, 161 | "metadata": { 162 | "collapsed": true 163 | }, 164 | "outputs": [], 165 | "source": [ 166 | "# define our global variables\n", 167 | "learning_rate = 0.001\n", 168 | "sound_dimension = [64, 512]\n", 169 | "batch_size = 128\n", 170 | "epoch = 20" 171 | ] 172 | }, 173 | { 174 | "cell_type": "code", 175 | "execution_count": 5, 176 | "metadata": { 177 | "collapsed": true 178 | }, 179 | "outputs": [], 180 | "source": [ 181 | "def processAudio(audio_file):\n", 182 | " rate, data = scipy.io.wavfile.read(audio_file)\n", 183 | " try:\n", 184 | " if data.shape[1]:\n", 185 | " data = np.mean(data, axis = 1)\n", 186 | " except:\n", 187 | " pass\n", 188 | " audio = matplotlib.mlab.specgram(data)[0]\n", 189 | " audio = scipy.misc.imresize(audio, sound_dimension)\n", 190 | " return np.expand_dims(audio, axis = 2)" 191 | ] 192 | }, 193 | { 194 | "cell_type": "code", 195 | "execution_count": 6, 196 | "metadata": { 197 | "collapsed": true 198 | }, 199 | "outputs": [], 200 | "source": [ 201 | "class Model:\n", 202 | "\n", 203 | " def __init__(self, size_output):\n", 204 | " self.X = tf.placeholder('float', [None, sound_dimension[0], sound_dimension[1], 1])\n", 205 | " self.Y = tf.placeholder('float', [None, size_output])\n", 206 | "\n", 207 | " def conv_layer(x, conv, out_shape, name, stride = 1):\n", 208 | " w = tf.Variable(tf.truncated_normal([conv, conv, int(x.shape[3]), out_shape]), name = name + '_w')\n", 209 | " b = tf.Variable(tf.truncated_normal([out_shape], stddev = 0.01), name = name + '_b')\n", 210 | " return tf.nn.conv2d(x, w, [1, stride, stride, 1], padding = 'SAME') + b\n", 211 | " \n", 212 | " def fully_connected(x, out_shape, name):\n", 213 | " w = tf.Variable(tf.truncated_normal([int(x.shape[1]), out_shape]), name = name + '_fc_w')\n", 214 | " b = tf.Variable(tf.truncated_normal([out_shape], stddev = 0.01), name = name + '_fc_b')\n", 215 | " return tf.matmul(x, w) + b\n", 216 | "\n", 217 | " def pooling(x, k = 2, stride = 2):\n", 218 | " return tf.nn.max_pool(x, ksize = [1, k, k, 1], strides = [1, stride, stride, 1], padding = 'SAME')\n", 219 | "\n", 220 | " with tf.name_scope(\"conv5-16\"):\n", 221 | " conv1 = tf.nn.relu(conv_layer(self.X, 5, 16, '16'))\n", 222 | "\n", 223 | " with tf.name_scope(\"maxpool-1\"):\n", 224 | " pooling1 = pooling(conv1)\n", 225 | "\n", 226 | " with tf.name_scope(\"conv5-32\"):\n", 227 | " conv2 = tf.nn.relu(conv_layer(pooling1, 5, 16, '16'))\n", 228 | "\n", 229 | " with tf.name_scope(\"maxpool-2\"):\n", 230 | " pooling2 = pooling(conv2)\n", 231 | "\n", 232 | " with tf.name_scope(\"conv5-64\"):\n", 233 | " conv3 = tf.nn.relu(conv_layer(pooling2, 5, 64, '64'))\n", 234 | "\n", 235 | " with tf.name_scope(\"maxpool-3\"):\n", 236 | " pooling3 = pooling(conv3)\n", 237 | "\n", 238 | " with tf.name_scope(\"conv5-128\"):\n", 239 | " conv4 = tf.nn.relu(conv_layer(pooling3, 5, 128, '128'))\n", 240 | "\n", 241 | " with tf.name_scope(\"maxpool-4\"):\n", 242 | " pooling4 = pooling(conv4)\n", 243 | " \n", 244 | " output_shape = int(pooling4.shape[1]) * int(pooling4.shape[2]) * int(pooling4.shape[3])\n", 245 | " \n", 246 | " with tf.name_scope(\"fc-512\"):\n", 247 | " pooling4 = tf.reshape(pooling4, [-1, output_shape])\n", 248 | " fc1 = tf.nn.relu(fully_connected(pooling4, 512, '512'))\n", 249 | "\n", 250 | " with tf.name_scope(\"fc-128\"):\n", 251 | " fc2 = tf.nn.relu(fully_connected(fc1, 128, '128'))\n", 252 | "\n", 253 | " with tf.name_scope(\"logits\"):\n", 254 | " self.logits = fully_connected(fc2, size_output, 'logits')\n", 255 | " \n", 256 | " self.cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = self.logits, labels = self.Y))\n", 257 | " self.optimizer = tf.train.AdamOptimizer(learning_rate).minimize(self.cost)\n", 258 | " correct_prediction = tf.equal(tf.argmax(self.logits, 1), tf.argmax(self.Y, 1))\n", 259 | " self.accuracy = tf.reduce_mean(tf.cast(correct_prediction, \"float\"))" 260 | ] 261 | }, 262 | { 263 | "cell_type": "code", 264 | "execution_count": 7, 265 | "metadata": { 266 | "collapsed": true 267 | }, 268 | "outputs": [], 269 | "source": [ 270 | "no_classes = np.unique(dataset['classID']).shape[0]\n", 271 | "sess = tf.InteractiveSession()\n", 272 | "model = Model(no_classes)\n", 273 | "sess.run(tf.global_variables_initializer())\n", 274 | "saver = tf.train.Saver(tf.global_variables())\n", 275 | "\n", 276 | "train_dataset = dataset.iloc[:int(dataset.shape[0] * 0.80), :]\n", 277 | "test_dataset = dataset.iloc[int(dataset.shape[0] * 0.80):, :]" 278 | ] 279 | }, 280 | { 281 | "cell_type": "code", 282 | "execution_count": 8, 283 | "metadata": {}, 284 | "outputs": [ 285 | { 286 | "name": "stdout", 287 | "output_type": "stream", 288 | "text": [ 289 | "('epoch: ', 1, 'avg loss: ', 355989466.07407409, 'avg acc: ', 0.26660441289897319, 'avg time: ', 1.7140804617493242)\n", 290 | "('epoch: ', 2, 'avg loss: ', 108546171.55555555, 'avg acc: ', 0.38289101642590984, 'avg time: ', 1.4117632044686212)\n", 291 | "('epoch: ', 3, 'avg loss: ', 66213184.296296299, 'avg acc: ', 0.44299414643534907, 'avg time: ', 1.409248259332445)\n", 292 | "('epoch: ', 4, 'avg loss: ', 46724492.703703701, 'avg acc: ', 0.50952830027650908, 'avg time: ', 1.4082880020141602)\n", 293 | "('epoch: ', 5, 'avg loss: ', 35683346.962962963, 'avg acc: ', 0.55218905044926536, 'avg time: ', 1.4053929072839242)\n", 294 | "('epoch: ', 6, 'avg loss: ', 27949425.629629631, 'avg acc: ', 0.5803841805016553, 'avg time: ', 1.4093971649805705)\n", 295 | "('epoch: ', 7, 'avg loss: ', 22625920.666666668, 'avg acc: ', 0.61942265486275705, 'avg time: ', 1.40776057155044)\n", 296 | "('epoch: ', 8, 'avg loss: ', 18664258.462962963, 'avg acc: ', 0.64854848715994096, 'avg time: ', 1.4118617993813973)\n", 297 | "('epoch: ', 9, 'avg loss: ', 15714998.703703703, 'avg acc: ', 0.67103200598999302, 'avg time: ', 1.411467017950835)\n", 298 | "('epoch: ', 10, 'avg loss: ', 13583436.888888888, 'avg acc: ', 0.69984297730304579, 'avg time: ', 1.4093520729630082)\n", 299 | "('epoch: ', 11, 'avg loss: ', 11906935.157407407, 'avg acc: ', 0.71632997967578749, 'avg time: ', 1.411153206118831)\n", 300 | "('epoch: ', 12, 'avg loss: ', 10146891.75, 'avg acc: ', 0.74052399396896362, 'avg time: ', 1.4095212044539276)\n", 301 | "('epoch: ', 13, 'avg loss: ', 8077567.444444444, 'avg acc: ', 0.77608075186058323, 'avg time: ', 1.4074199243828103)\n", 302 | "('epoch: ', 14, 'avg loss: ', 7351491.9490740737, 'avg acc: ', 0.78481880492634248, 'avg time: ', 1.4103174297897905)\n", 303 | "('epoch: ', 15, 'avg loss: ', 6144154.5648148144, 'avg acc: ', 0.80765291606938394, 'avg time: ', 1.4071954444602683)\n", 304 | "('epoch: ', 16, 'avg loss: ', 5804384.8842592593, 'avg acc: ', 0.80870829908936115, 'avg time: ', 1.4077437409648188)\n", 305 | "('epoch: ', 17, 'avg loss: ', 4745148.3148148144, 'avg acc: ', 0.83724259888684305, 'avg time: ', 1.4059456321928236)\n", 306 | "('epoch: ', 18, 'avg loss: ', 4029806.576388889, 'avg acc: ', 0.84846678707334733, 'avg time: ', 1.406687166955736)\n", 307 | "('epoch: ', 19, 'avg loss: ', 3611150.7337962962, 'avg acc: ', 0.86205043836876194, 'avg time: ', 1.407532983356052)\n", 308 | "('epoch: ', 20, 'avg loss: ', 3164976.6319444445, 'avg acc: ', 0.87879322193287035, 'avg time: ', 1.4056003711841725)\n" 309 | ] 310 | } 311 | ], 312 | "source": [ 313 | "ACCURACY, LOST = [], []\n", 314 | "for i in range(epoch):\n", 315 | " last = time.time()\n", 316 | " total_acc, total_loss = 0, 0\n", 317 | " for k in range(0, (train_dataset.shape[0] // batch_size) * batch_size, batch_size):\n", 318 | " batch_x, batch_y = [], []\n", 319 | " for n in range(batch_size):\n", 320 | " try:\n", 321 | " batch_x.append(processAudio(train_dataset.slice_file_name.iloc[k + n]))\n", 322 | " onehot = np.zeros((no_classes))\n", 323 | " onehot[train_dataset.classID.iloc[k + n]] = 1.0\n", 324 | " batch_y.append(onehot)\n", 325 | " except Exception as e:\n", 326 | " continue\n", 327 | " batch_x = np.array(batch_x)\n", 328 | " batch_y = np.array(batch_y)\n", 329 | " loss, _ = sess.run([model.cost, model.optimizer], feed_dict = {model.X: batch_x, model.Y: batch_y})\n", 330 | " total_acc += sess.run(model.accuracy, feed_dict = {model.X: batch_x, model.Y: batch_y})\n", 331 | " total_loss += loss\n", 332 | " total_loss /= (train_dataset.shape[0] // batch_size)\n", 333 | " total_acc /= (train_dataset.shape[0] // batch_size)\n", 334 | " ACCURACY.append(total_acc)\n", 335 | " LOST.append(total_loss)\n", 336 | " print('epoch: ', i + 1, 'avg loss: ', total_loss, 'avg acc: ', total_acc, 'avg time: ', (time.time() - last) / (train_dataset.shape[0] // batch_size))" 337 | ] 338 | }, 339 | { 340 | "cell_type": "code", 341 | "execution_count": 9, 342 | "metadata": {}, 343 | "outputs": [ 344 | { 345 | "name": "stdout", 346 | "output_type": "stream", 347 | "text": [ 348 | "testing accuracy: 0.4\n", 349 | " precision recall f1-score support\n", 350 | "\n", 351 | " air_conditioner 0.40 0.20 0.27 10\n", 352 | " car_horn 0.29 0.33 0.31 6\n", 353 | "children_playing 0.16 0.33 0.21 9\n", 354 | " dog_bark 0.36 0.31 0.33 16\n", 355 | " drilling 0.50 0.55 0.52 11\n", 356 | " engine_idling 0.56 0.56 0.56 9\n", 357 | " gun_shot 0.33 0.33 0.33 3\n", 358 | " jackhammer 0.57 0.44 0.50 9\n", 359 | " siren 0.46 0.67 0.55 9\n", 360 | " street_music 0.67 0.31 0.42 13\n", 361 | "\n", 362 | " avg / total 0.45 0.40 0.40 95\n", 363 | "\n" 364 | ] 365 | } 366 | ], 367 | "source": [ 368 | "batch_x, batch_y, labels = [], [], []\n", 369 | "for n in range(128):\n", 370 | " try:\n", 371 | " batch_x.append(processAudio(test_dataset.slice_file_name.iloc[n]))\n", 372 | " onehot = np.zeros((no_classes))\n", 373 | " onehot[test_dataset.classID.iloc[n]] = 1.0\n", 374 | " batch_y.append(onehot)\n", 375 | " labels.append(test_dataset.classID.iloc[n])\n", 376 | " except Exception as e:\n", 377 | " continue\n", 378 | "batch_x = np.array(batch_x)\n", 379 | "batch_y = np.array(batch_y)\n", 380 | "acc, logits = sess.run([model.accuracy, tf.cast(tf.argmax(model.logits, 1), tf.int32)], feed_dict = {model.X : batch_x, model.Y : batch_y})\n", 381 | "print 'testing accuracy: ' + str(acc)\n", 382 | "print(metrics.classification_report(labels, logits, target_names = np.unique(unique_sound)))" 383 | ] 384 | }, 385 | { 386 | "cell_type": "code", 387 | "execution_count": 10, 388 | "metadata": {}, 389 | "outputs": [ 390 | { 391 | "data": { 392 | "image/png": "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\nTkSuQmCC\n", 393 | "text/plain": [ 394 | "" 395 | ] 396 | }, 397 | "metadata": {}, 398 | "output_type": "display_data" 399 | } 400 | ], 401 | "source": [ 402 | "EPOCH = np.arange(len(LOST))\n", 403 | "plt.subplot(1, 2, 1)\n", 404 | "plt.plot(EPOCH, LOST)\n", 405 | "plt.xlabel('epoch'); plt.ylabel('loss')\n", 406 | "plt.subplot(1, 2, 2)\n", 407 | "plt.plot(EPOCH, ACCURACY)\n", 408 | "plt.xlabel('epoch'); plt.ylabel('accuracy')\n", 409 | "plt.show()" 410 | ] 411 | }, 412 | { 413 | "cell_type": "code", 414 | "execution_count": null, 415 | "metadata": { 416 | "collapsed": true 417 | }, 418 | "outputs": [], 419 | "source": [] 420 | } 421 | ], 422 | "metadata": { 423 | "kernelspec": { 424 | "display_name": "Python 2", 425 | "language": "python", 426 | "name": "python2" 427 | }, 428 | "language_info": { 429 | "codemirror_mode": { 430 | "name": "ipython", 431 | "version": 2 432 | }, 433 | "file_extension": ".py", 434 | "mimetype": "text/x-python", 435 | "name": "python", 436 | "nbconvert_exporter": "python", 437 | "pygments_lexer": "ipython2", 438 | "version": "2.7.12" 439 | } 440 | }, 441 | "nbformat": 4, 442 | "nbformat_minor": 2 443 | } 444 | --------------------------------------------------------------------------------