├── 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 | 
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 | " slice_file_name | \n",
38 | " fsID | \n",
39 | " start | \n",
40 | " end | \n",
41 | " salience | \n",
42 | " fold | \n",
43 | " classID | \n",
44 | " class | \n",
45 | "
\n",
46 | " \n",
47 | " \n",
48 | " \n",
49 | " | 3260 | \n",
50 | " audio/fold10/167464-0-0-24.wav | \n",
51 | " 167464 | \n",
52 | " 12.000000 | \n",
53 | " 16.000000 | \n",
54 | " 2 | \n",
55 | " 10 | \n",
56 | " 0 | \n",
57 | " air_conditioner | \n",
58 | "
\n",
59 | " \n",
60 | " | 6893 | \n",
61 | " audio/fold1/57553-3-2-0.wav | \n",
62 | " 57553 | \n",
63 | " 13.063603 | \n",
64 | " 14.279479 | \n",
65 | " 2 | \n",
66 | " 1 | \n",
67 | " 3 | \n",
68 | " dog_bark | \n",
69 | "
\n",
70 | " \n",
71 | " | 8649 | \n",
72 | " audio/fold3/98681-9-0-0.wav | \n",
73 | " 98681 | \n",
74 | " 0.000000 | \n",
75 | " 4.000000 | \n",
76 | " 2 | \n",
77 | " 3 | \n",
78 | " 9 | \n",
79 | " street_music | \n",
80 | "
\n",
81 | " \n",
82 | " | 2201 | \n",
83 | " audio/fold9/155044-9-0-38.wav | \n",
84 | " 155044 | \n",
85 | " 19.000000 | \n",
86 | " 23.000000 | \n",
87 | " 1 | \n",
88 | " 9 | \n",
89 | " 9 | \n",
90 | " street_music | \n",
91 | "
\n",
92 | " \n",
93 | " | 4269 | \n",
94 | " audio/fold8/180134-4-2-15.wav | \n",
95 | " 180134 | \n",
96 | " 49.378110 | \n",
97 | " 53.378110 | \n",
98 | " 1 | \n",
99 | " 8 | \n",
100 | " 4 | \n",
101 | " drilling | \n",
102 | "
\n",
103 | " \n",
104 | "
\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 | " slice_file_name | \n",
38 | " fsID | \n",
39 | " start | \n",
40 | " end | \n",
41 | " salience | \n",
42 | " fold | \n",
43 | " classID | \n",
44 | " class | \n",
45 | "
\n",
46 | " \n",
47 | " \n",
48 | " \n",
49 | " | 1129 | \n",
50 | " audio/fold8/125678-7-4-4.wav | \n",
51 | " 125678 | \n",
52 | " 96.843843 | \n",
53 | " 100.843843 | \n",
54 | " 1 | \n",
55 | " 8 | \n",
56 | " 7 | \n",
57 | " jackhammer | \n",
58 | "
\n",
59 | " \n",
60 | " | 3860 | \n",
61 | " audio/fold1/177621-0-0-105.wav | \n",
62 | " 177621 | \n",
63 | " 52.500000 | \n",
64 | " 56.500000 | \n",
65 | " 2 | \n",
66 | " 1 | \n",
67 | " 0 | \n",
68 | " air_conditioner | \n",
69 | "
\n",
70 | " \n",
71 | " | 177 | \n",
72 | " audio/fold1/103074-7-1-3.wav | \n",
73 | " 103074 | \n",
74 | " 24.017317 | \n",
75 | " 28.017317 | \n",
76 | " 1 | \n",
77 | " 1 | \n",
78 | " 7 | \n",
79 | " jackhammer | \n",
80 | "
\n",
81 | " \n",
82 | " | 696 | \n",
83 | " audio/fold8/113202-5-0-15.wav | \n",
84 | " 113202 | \n",
85 | " 7.500000 | \n",
86 | " 11.500000 | \n",
87 | " 1 | \n",
88 | " 8 | \n",
89 | " 5 | \n",
90 | " engine_idling | \n",
91 | "
\n",
92 | " \n",
93 | " | 3568 | \n",
94 | " audio/fold4/173994-3-0-44.wav | \n",
95 | " 173994 | \n",
96 | " 22.000000 | \n",
97 | " 26.000000 | \n",
98 | " 1 | \n",
99 | " 4 | \n",
100 | " 3 | \n",
101 | " dog_bark | \n",
102 | "
\n",
103 | " \n",
104 | "
\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 | " slice_file_name | \n",
38 | " fsID | \n",
39 | " start | \n",
40 | " end | \n",
41 | " salience | \n",
42 | " fold | \n",
43 | " classID | \n",
44 | " class | \n",
45 | "
\n",
46 | " \n",
47 | " \n",
48 | " \n",
49 | " | 1153 | \n",
50 | " audio/fold7/127443-4-0-0.wav | \n",
51 | " 127443 | \n",
52 | " 115.015008 | \n",
53 | " 119.015008 | \n",
54 | " 1 | \n",
55 | " 7 | \n",
56 | " 4 | \n",
57 | " drilling | \n",
58 | "
\n",
59 | " \n",
60 | " | 4610 | \n",
61 | " audio/fold9/187075-5-0-6.wav | \n",
62 | " 187075 | \n",
63 | " 6.446779 | \n",
64 | " 10.446779 | \n",
65 | " 2 | \n",
66 | " 9 | \n",
67 | " 5 | \n",
68 | " engine_idling | \n",
69 | "
\n",
70 | " \n",
71 | " | 4873 | \n",
72 | " audio/fold4/192382-2-0-18.wav | \n",
73 | " 192382 | \n",
74 | " 9.000000 | \n",
75 | " 13.000000 | \n",
76 | " 1 | \n",
77 | " 4 | \n",
78 | " 2 | \n",
79 | " children_playing | \n",
80 | "
\n",
81 | " \n",
82 | " | 1118 | \n",
83 | " audio/fold8/125678-7-3-1.wav | \n",
84 | " 125678 | \n",
85 | " 72.677418 | \n",
86 | " 76.677418 | \n",
87 | " 1 | \n",
88 | " 8 | \n",
89 | " 7 | \n",
90 | " jackhammer | \n",
91 | "
\n",
92 | " \n",
93 | " | 6860 | \n",
94 | " audio/fold1/57320-0-0-22.wav | \n",
95 | " 57320 | \n",
96 | " 11.000000 | \n",
97 | " 15.000000 | \n",
98 | " 2 | \n",
99 | " 1 | \n",
100 | " 0 | \n",
101 | " air_conditioner | \n",
102 | "
\n",
103 | " \n",
104 | "
\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 |
--------------------------------------------------------------------------------