|
a |
|
b/model-code.ipynb |
|
|
1 |
{ |
|
|
2 |
"cells": [ |
|
|
3 |
{ |
|
|
4 |
"cell_type": "code", |
|
|
5 |
"execution_count": 3, |
|
|
6 |
"metadata": {}, |
|
|
7 |
"outputs": [ |
|
|
8 |
{ |
|
|
9 |
"name": "stdout", |
|
|
10 |
"output_type": "stream", |
|
|
11 |
"text": [ |
|
|
12 |
"['train', 'test', 'val', '.DS_Store']\n" |
|
|
13 |
] |
|
|
14 |
} |
|
|
15 |
], |
|
|
16 |
"source": [ |
|
|
17 |
"import pandas as pd \n", |
|
|
18 |
"import cv2 \n", |
|
|
19 |
"import numpy as np \n", |
|
|
20 |
"import os \n", |
|
|
21 |
"from random import shuffle\n", |
|
|
22 |
"from tqdm import tqdm \n", |
|
|
23 |
"import scipy\n", |
|
|
24 |
"import skimage\n", |
|
|
25 |
"from skimage.transform import resize\n", |
|
|
26 |
"from sklearn.model_selection import train_test_split\n", |
|
|
27 |
"print(os.listdir(\"cancer/\"))" |
|
|
28 |
] |
|
|
29 |
}, |
|
|
30 |
{ |
|
|
31 |
"cell_type": "code", |
|
|
32 |
"execution_count": 4, |
|
|
33 |
"metadata": {}, |
|
|
34 |
"outputs": [ |
|
|
35 |
{ |
|
|
36 |
"name": "stdout", |
|
|
37 |
"output_type": "stream", |
|
|
38 |
"text": [ |
|
|
39 |
"['Cancer', 'Normal']\n" |
|
|
40 |
] |
|
|
41 |
} |
|
|
42 |
], |
|
|
43 |
"source": [ |
|
|
44 |
"print(os.listdir(\"cancer/train\"))" |
|
|
45 |
] |
|
|
46 |
}, |
|
|
47 |
{ |
|
|
48 |
"cell_type": "code", |
|
|
49 |
"execution_count": 5, |
|
|
50 |
"metadata": {}, |
|
|
51 |
"outputs": [], |
|
|
52 |
"source": [ |
|
|
53 |
"TRAIN_DIR = \"cancer/train/\"\n", |
|
|
54 |
"TEST_DIR = \"cancer/test/\"" |
|
|
55 |
] |
|
|
56 |
}, |
|
|
57 |
{ |
|
|
58 |
"cell_type": "code", |
|
|
59 |
"execution_count": 6, |
|
|
60 |
"metadata": {}, |
|
|
61 |
"outputs": [], |
|
|
62 |
"source": [ |
|
|
63 |
"#Preprocessing \n", |
|
|
64 |
"def get_label(Dir):\n", |
|
|
65 |
" for nextdir in os.listdir(Dir):\n", |
|
|
66 |
" if not nextdir.startswith('.'):\n", |
|
|
67 |
" if nextdir in ['NORMAL']:\n", |
|
|
68 |
" label = 0\n", |
|
|
69 |
" elif nextdir in ['CANCER']:\n", |
|
|
70 |
" label = 1\n", |
|
|
71 |
" else:\n", |
|
|
72 |
" label = 2\n", |
|
|
73 |
" return nextdir, label" |
|
|
74 |
] |
|
|
75 |
}, |
|
|
76 |
{ |
|
|
77 |
"cell_type": "code", |
|
|
78 |
"execution_count": 7, |
|
|
79 |
"metadata": {}, |
|
|
80 |
"outputs": [], |
|
|
81 |
"source": [ |
|
|
82 |
"def preprocessing_data(Dir):\n", |
|
|
83 |
" X = []\n", |
|
|
84 |
" y = []\n", |
|
|
85 |
" \n", |
|
|
86 |
" for nextdir in os.listdir(Dir):\n", |
|
|
87 |
" nextdir, label = get_label(Dir)\n", |
|
|
88 |
" temp = Dir + nextdir\n", |
|
|
89 |
" \n", |
|
|
90 |
" for image_filename in tqdm(os.listdir(temp)):\n", |
|
|
91 |
" path = os.path.join(temp + '/' , image_filename)\n", |
|
|
92 |
" img = cv2.imread(path,cv2.IMREAD_GRAYSCALE)\n", |
|
|
93 |
" if img is not None:\n", |
|
|
94 |
" img = skimage.transform.resize(img, (150, 150, 3))\n", |
|
|
95 |
" img = np.asarray(img)\n", |
|
|
96 |
" X.append(img)\n", |
|
|
97 |
" y.append(label)\n", |
|
|
98 |
" \n", |
|
|
99 |
" X = np.asarray(X)\n", |
|
|
100 |
" y = np.asarray(y)\n", |
|
|
101 |
" \n", |
|
|
102 |
" return X,y" |
|
|
103 |
] |
|
|
104 |
}, |
|
|
105 |
{ |
|
|
106 |
"cell_type": "code", |
|
|
107 |
"execution_count": 7, |
|
|
108 |
"metadata": {}, |
|
|
109 |
"outputs": [], |
|
|
110 |
"source": [ |
|
|
111 |
" #X_train, y_train = preprocessing_data(TRAIN_DIR)" |
|
|
112 |
] |
|
|
113 |
}, |
|
|
114 |
{ |
|
|
115 |
"cell_type": "code", |
|
|
116 |
"execution_count": 8, |
|
|
117 |
"metadata": {}, |
|
|
118 |
"outputs": [], |
|
|
119 |
"source": [ |
|
|
120 |
"def get_data(Dir):\n", |
|
|
121 |
" X = []\n", |
|
|
122 |
" y = []\n", |
|
|
123 |
" for nextDir in os.listdir(Dir):\n", |
|
|
124 |
" if not nextDir.startswith('.'):\n", |
|
|
125 |
" if nextDir in ['NORMAL']:\n", |
|
|
126 |
" label = 0\n", |
|
|
127 |
" elif nextDir in ['CANCER']:\n", |
|
|
128 |
" label = 1\n", |
|
|
129 |
" else:\n", |
|
|
130 |
" label = 2\n", |
|
|
131 |
" \n", |
|
|
132 |
" temp = Dir + nextDir\n", |
|
|
133 |
" \n", |
|
|
134 |
" for file in tqdm(os.listdir(temp)):\n", |
|
|
135 |
" img = cv2.imread(temp + '/' + file)\n", |
|
|
136 |
" if img is not None:\n", |
|
|
137 |
" img = skimage.transform.resize(img, (150, 150, 3))\n", |
|
|
138 |
" #img_file = scipy.misc.imresize(arr=img_file, size=(150, 150, 3))\n", |
|
|
139 |
" img = np.asarray(img)\n", |
|
|
140 |
" X.append(img)\n", |
|
|
141 |
" y.append(label)\n", |
|
|
142 |
" \n", |
|
|
143 |
" X = np.asarray(X)\n", |
|
|
144 |
" y = np.asarray(y)\n", |
|
|
145 |
" return X,y" |
|
|
146 |
] |
|
|
147 |
}, |
|
|
148 |
{ |
|
|
149 |
"cell_type": "code", |
|
|
150 |
"execution_count": 10, |
|
|
151 |
"metadata": {}, |
|
|
152 |
"outputs": [ |
|
|
153 |
{ |
|
|
154 |
"name": "stderr", |
|
|
155 |
"output_type": "stream", |
|
|
156 |
"text": [ |
|
|
157 |
"100%|██████████| 2478/2478 [00:27<00:00, 23.64it/s] \n", |
|
|
158 |
"100%|██████████| 2483/2483 [00:39<00:00, 63.38it/s] \n" |
|
|
159 |
] |
|
|
160 |
} |
|
|
161 |
], |
|
|
162 |
"source": [ |
|
|
163 |
"X_train, y_train = get_data(TRAIN_DIR)" |
|
|
164 |
] |
|
|
165 |
}, |
|
|
166 |
{ |
|
|
167 |
"cell_type": "code", |
|
|
168 |
"execution_count": 11, |
|
|
169 |
"metadata": {}, |
|
|
170 |
"outputs": [ |
|
|
171 |
{ |
|
|
172 |
"name": "stderr", |
|
|
173 |
"output_type": "stream", |
|
|
174 |
"text": [ |
|
|
175 |
"100%|██████████| 620/620 [00:17<00:00, 35.22it/s]\n", |
|
|
176 |
"100%|██████████| 620/620 [00:15<00:00, 40.49it/s]\n" |
|
|
177 |
] |
|
|
178 |
} |
|
|
179 |
], |
|
|
180 |
"source": [ |
|
|
181 |
"X_test , y_test = get_data(TEST_DIR)" |
|
|
182 |
] |
|
|
183 |
}, |
|
|
184 |
{ |
|
|
185 |
"cell_type": "code", |
|
|
186 |
"execution_count": 12, |
|
|
187 |
"metadata": {}, |
|
|
188 |
"outputs": [ |
|
|
189 |
{ |
|
|
190 |
"name": "stdout", |
|
|
191 |
"output_type": "stream", |
|
|
192 |
"text": [ |
|
|
193 |
"(4961, 150, 150, 3) \n", |
|
|
194 |
" (1240, 150, 150, 3)\n" |
|
|
195 |
] |
|
|
196 |
} |
|
|
197 |
], |
|
|
198 |
"source": [ |
|
|
199 |
"print(X_train.shape,'\\n',X_test.shape)" |
|
|
200 |
] |
|
|
201 |
}, |
|
|
202 |
{ |
|
|
203 |
"cell_type": "code", |
|
|
204 |
"execution_count": 13, |
|
|
205 |
"metadata": {}, |
|
|
206 |
"outputs": [ |
|
|
207 |
{ |
|
|
208 |
"name": "stdout", |
|
|
209 |
"output_type": "stream", |
|
|
210 |
"text": [ |
|
|
211 |
"(4961,) \n", |
|
|
212 |
" (1240,)\n" |
|
|
213 |
] |
|
|
214 |
} |
|
|
215 |
], |
|
|
216 |
"source": [ |
|
|
217 |
"print(y_train.shape,'\\n',y_test.shape)" |
|
|
218 |
] |
|
|
219 |
}, |
|
|
220 |
{ |
|
|
221 |
"cell_type": "code", |
|
|
222 |
"execution_count": 12, |
|
|
223 |
"metadata": {}, |
|
|
224 |
"outputs": [ |
|
|
225 |
{ |
|
|
226 |
"name": "stderr", |
|
|
227 |
"output_type": "stream", |
|
|
228 |
"text": [ |
|
|
229 |
"Using TensorFlow backend.\n" |
|
|
230 |
] |
|
|
231 |
} |
|
|
232 |
], |
|
|
233 |
"source": [ |
|
|
234 |
"from keras.utils.np_utils import to_categorical\n", |
|
|
235 |
"\n", |
|
|
236 |
"y_train = to_categorical(y_train, 2)\n", |
|
|
237 |
"y_test = to_categorical(y_test, 2)\n", |
|
|
238 |
"\n" |
|
|
239 |
] |
|
|
240 |
}, |
|
|
241 |
{ |
|
|
242 |
"cell_type": "code", |
|
|
243 |
"execution_count": 13, |
|
|
244 |
"metadata": {}, |
|
|
245 |
"outputs": [ |
|
|
246 |
{ |
|
|
247 |
"name": "stdout", |
|
|
248 |
"output_type": "stream", |
|
|
249 |
"text": [ |
|
|
250 |
"(4961,) \n", |
|
|
251 |
" (1240,)\n" |
|
|
252 |
] |
|
|
253 |
} |
|
|
254 |
], |
|
|
255 |
"source": [ |
|
|
256 |
"print(y_train.shape,'\\n',y_test.shape)" |
|
|
257 |
] |
|
|
258 |
}, |
|
|
259 |
{ |
|
|
260 |
"cell_type": "code", |
|
|
261 |
"execution_count": 14, |
|
|
262 |
"metadata": {}, |
|
|
263 |
"outputs": [], |
|
|
264 |
"source": [ |
|
|
265 |
"\n", |
|
|
266 |
"Pimages = os.listdir(TRAIN_DIR + \"CANCER\")\n", |
|
|
267 |
"Nimages = os.listdir(TRAIN_DIR + \"NORMAL\")" |
|
|
268 |
] |
|
|
269 |
}, |
|
|
270 |
{ |
|
|
271 |
"cell_type": "code", |
|
|
272 |
"execution_count": 15, |
|
|
273 |
"metadata": {}, |
|
|
274 |
"outputs": [ |
|
|
275 |
{ |
|
|
276 |
"name": "stdout", |
|
|
277 |
"output_type": "stream", |
|
|
278 |
"text": [ |
|
|
279 |
"(Left) - No CANCER Vs (Right) - CANCER\n", |
|
|
280 |
"-----------------------------------------------------------------------------------------------------------------------------------\n" |
|
|
281 |
] |
|
|
282 |
}, |
|
|
283 |
{ |
|
|
284 |
"data": { |
|
|
285 |
"text/plain": [ |
|
|
286 |
"<Figure size 1000x500 with 1 Axes>" |
|
|
287 |
] |
|
|
288 |
}, |
|
|
289 |
"metadata": {}, |
|
|
290 |
"output_type": "display_data" |
|
|
291 |
}, |
|
|
292 |
{ |
|
|
293 |
"name": "stdout", |
|
|
294 |
"output_type": "stream", |
|
|
295 |
"text": [ |
|
|
296 |
"(Left) - No CANCER Vs (Right) - CANCER\n", |
|
|
297 |
"-----------------------------------------------------------------------------------------------------------------------------------\n" |
|
|
298 |
] |
|
|
299 |
}, |
|
|
300 |
{ |
|
|
301 |
"data": { |
|
|
302 |
"text/plain": [ |
|
|
303 |
"<Figure size 1000x500 with 1 Axes>" |
|
|
304 |
] |
|
|
305 |
}, |
|
|
306 |
"metadata": {}, |
|
|
307 |
"output_type": "display_data" |
|
|
308 |
}, |
|
|
309 |
{ |
|
|
310 |
"name": "stdout", |
|
|
311 |
"output_type": "stream", |
|
|
312 |
"text": [ |
|
|
313 |
"(Left) - No CANCER Vs (Right) - CANCER\n", |
|
|
314 |
"-----------------------------------------------------------------------------------------------------------------------------------\n" |
|
|
315 |
] |
|
|
316 |
}, |
|
|
317 |
{ |
|
|
318 |
"data": { |
|
|
319 |
"text/plain": [ |
|
|
320 |
"<Figure size 1000x500 with 1 Axes>" |
|
|
321 |
] |
|
|
322 |
}, |
|
|
323 |
"metadata": {}, |
|
|
324 |
"output_type": "display_data" |
|
|
325 |
}, |
|
|
326 |
{ |
|
|
327 |
"name": "stdout", |
|
|
328 |
"output_type": "stream", |
|
|
329 |
"text": [ |
|
|
330 |
"(Left) - No CANCER Vs (Right) - CANCER\n", |
|
|
331 |
"-----------------------------------------------------------------------------------------------------------------------------------\n" |
|
|
332 |
] |
|
|
333 |
}, |
|
|
334 |
{ |
|
|
335 |
"data": { |
|
|
336 |
"text/plain": [ |
|
|
337 |
"<Figure size 1000x500 with 1 Axes>" |
|
|
338 |
] |
|
|
339 |
}, |
|
|
340 |
"metadata": {}, |
|
|
341 |
"output_type": "display_data" |
|
|
342 |
}, |
|
|
343 |
{ |
|
|
344 |
"name": "stdout", |
|
|
345 |
"output_type": "stream", |
|
|
346 |
"text": [ |
|
|
347 |
"(Left) - No CANCER Vs (Right) - CANCER\n", |
|
|
348 |
"-----------------------------------------------------------------------------------------------------------------------------------\n" |
|
|
349 |
] |
|
|
350 |
}, |
|
|
351 |
{ |
|
|
352 |
"data": { |
|
|
353 |
"text/plain": [ |
|
|
354 |
"<Figure size 1000x500 with 1 Axes>" |
|
|
355 |
] |
|
|
356 |
}, |
|
|
357 |
"metadata": {}, |
|
|
358 |
"output_type": "display_data" |
|
|
359 |
} |
|
|
360 |
], |
|
|
361 |
"source": [ |
|
|
362 |
"import matplotlib.pyplot as plt\n", |
|
|
363 |
"def plotter(i):\n", |
|
|
364 |
" imagep1 = cv2.imread(TRAIN_DIR+\"CANCER/\"+Pimages[i])\n", |
|
|
365 |
" imagep1 = skimage.transform.resize(imagep1, (150, 150, 3) , mode = 'reflect')\n", |
|
|
366 |
" imagen1 = cv2.imread(TRAIN_DIR+\"NORMAL/\"+Nimages[i])\n", |
|
|
367 |
" imagen1 = skimage.transform.resize(imagen1, (150, 150, 3))\n", |
|
|
368 |
" pair = np.concatenate((imagen1, imagep1), axis=1)\n", |
|
|
369 |
" print(\"(Left) - No CANCER Vs (Right) - CANCER\")\n", |
|
|
370 |
" print(\"-----------------------------------------------------------------------------------------------------------------------------------\")\n", |
|
|
371 |
" plt.figure(figsize=(10,5))\n", |
|
|
372 |
" plt.imshow(pair)\n", |
|
|
373 |
" plt.show()\n", |
|
|
374 |
"for i in range(0,5):\n", |
|
|
375 |
" plotter(i)" |
|
|
376 |
] |
|
|
377 |
}, |
|
|
378 |
{ |
|
|
379 |
"cell_type": "code", |
|
|
380 |
"execution_count": 16, |
|
|
381 |
"metadata": {}, |
|
|
382 |
"outputs": [], |
|
|
383 |
"source": [ |
|
|
384 |
"from sklearn.model_selection import train_test_split\n", |
|
|
385 |
"from sklearn import metrics\n", |
|
|
386 |
"from sklearn.metrics import accuracy_score\n", |
|
|
387 |
"\n", |
|
|
388 |
"#function\n", |
|
|
389 |
"def train_test_rmse(x,y):\n", |
|
|
390 |
" x = Iris_data[x]\n", |
|
|
391 |
" y = Iris_data[y]\n", |
|
|
392 |
" X_train, X_test, y_train, y_test = train_test_split(x, y, test_size = 0.2,random_state=123)\n", |
|
|
393 |
" linreg = LinearRegression()\n", |
|
|
394 |
" linreg.fit(X_train, y_train)\n", |
|
|
395 |
" y_pred = linreg.predict(X_test)\n", |
|
|
396 |
" print(accuracy_score(y_test, y_pred)) # or you can save it in variable and return it \n", |
|
|
397 |
" return np.sqrt(metrics.mean_squared_error(y_test, y_pred))" |
|
|
398 |
] |
|
|
399 |
}, |
|
|
400 |
{ |
|
|
401 |
"cell_type": "code", |
|
|
402 |
"execution_count": 17, |
|
|
403 |
"metadata": {}, |
|
|
404 |
"outputs": [ |
|
|
405 |
{ |
|
|
406 |
"data": { |
|
|
407 |
"text/plain": [ |
|
|
408 |
"<matplotlib.axes._subplots.AxesSubplot at 0x7f6d256ef9e8>" |
|
|
409 |
] |
|
|
410 |
}, |
|
|
411 |
"execution_count": 17, |
|
|
412 |
"metadata": {}, |
|
|
413 |
"output_type": "execute_result" |
|
|
414 |
}, |
|
|
415 |
{ |
|
|
416 |
"data": { |
|
|
417 |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAD8CAYAAACYebj1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAADtxJREFUeJzt3X+s3Xddx/Hna93G5MfGtNcI/UEb1inNnE4vlUCig42kW7QFXLA1hB+bFIIbKoQ4gxk4QqKAApKCNJEfI7IytzgrqRbDDwFlY3cyJu2suanAboquwAZMhNnx9o/77WdnZ7f3nnX327PePR/Jyc7n8/2c7/fd5Lu++vl+z/dzUlVIkgRw0rgLkCQ9ehgKkqTGUJAkNYaCJKkxFCRJjaEgSWoMBUlSYyhIkhpDQZLUnDzuAh6u5cuX15o1a8ZdhiSdUG699dZvVtXEQuNOuFBYs2YNU1NT4y5Dkk4oSb42yjgvH0mSGkNBktQYCpKkxlCQJDWGgiSp6S0UknwgyV1JvnKU7Uny50mmk9ye5Bf6qkWSNJo+ZwofAjbOs/0iYF332ga8r8daJEkj6C0UquqzwLfnGbIZuKZm3QQ8OclT+qpHkrSwcd5TWAHcOdCe6fokSWMyzieaM0dfzTkw2cbsJSZWr179iA/8i2+45hHvQ0vPrW9/6bhL4OtX/+y4S9Cj0Oqr/u24HWucM4UZYNVAeyVwcK6BVbWjqiaranJiYsGlOyRJx2icobALeGn3LaRnAd+pqm+MsR5Jeszr7fJRkmuB84HlSWaANwGnAFTVXwC7gYuBaeD7wCv6qkWSNJreQqGqti6wvYDf7uv4kqSHzyeaJUmNoSBJagwFSVJjKEiSGkNBktQYCpKkxlCQJDWGgiSpMRQkSY2hIElqDAVJUmMoSJIaQ0GS1BgKkqTGUJAkNYaCJKkxFCRJjaEgSWoMBUlSYyhIkhpDQZLUGAqSpMZQkCQ1hoIkqTEUJEmNoSBJagwFSVJjKEiSGkNBktQYCpKkxlCQJDWGgiSp6TUUkmxMsj/JdJIr59i+Osmnk3wpye1JLu6zHknS/HoLhSTLgO3ARcB6YGuS9UPD/hC4rqrOA7YA7+2rHknSwvqcKWwApqvqQFXdB+wENg+NKeD07v0ZwMEe65EkLeDkHve9ArhzoD0D/NLQmDcDn0hyBfAE4MIe65EkLaDPmULm6Kuh9lbgQ1W1ErgY+EiSh9SUZFuSqSRThw4d6qFUSRL0GwozwKqB9koeennoMuA6gKr6AnAasHx4R1W1o6omq2pyYmKip3IlSX2Gwi3AuiRrk5zK7I3kXUNjvg5cAJDkGcyGglMBSRqT3kKhqg4DlwN7gDuY/ZbR3iRXJ9nUDXs98MokXwauBV5eVcOXmCRJx0mfN5qpqt3A7qG+qwbe7wOe02cNkqTR+USzJKkxFCRJjaEgSWoMBUlSYyhIkhpDQZLUGAqSpMZQkCQ1hoIkqTEUJEmNoSBJagwFSVJjKEiSGkNBktQYCpKkxlCQJDWGgiSpMRQkSY2hIElqDAVJUmMoSJIaQ0GS1BgKkqTGUJAkNYaCJKkxFCRJjaEgSWoMBUlSYyhIkhpDQZLUGAqSpMZQkCQ1hoIkqek1FJJsTLI/yXSSK48y5sVJ9iXZm+SjfdYjSZrfyX3tOMkyYDvwfGAGuCXJrqraNzBmHfAHwHOq6u4kP9lXPZKkhfU5U9gATFfVgaq6D9gJbB4a80pge1XdDVBVd/VYjyRpAX2GwgrgzoH2TNc36Gzg7CT/nOSmJBt7rEeStIDeLh8BmaOv5jj+OuB8YCXwuSTnVNU9D9pRsg3YBrB69erFr1SSBPQ7U5gBVg20VwIH5xjzt1X1f1X1n8B+ZkPiQapqR1VNVtXkxMREbwVL0mNdn6FwC7AuydokpwJbgF1DY24EnguQZDmzl5MO9FiTJGkeI4VCkk+O0jeoqg4DlwN7gDuA66pqb5Krk2zqhu0BvpVkH/Bp4A1V9a2H8weQJC2eee8pJDkNeDywPMmZPHCf4HTgqQvtvKp2A7uH+q4aeF/A67qXJGnMFrrR/Crgd5kNgFt5IBS+y+wzCJKkJWTeUKiqdwPvTnJFVb3nONUkSRqTkb6SWlXvSfJsYM3gZ6rqmp7qkiSNwUihkOQjwNOB24D7u+4CDAVJWkJGfXhtEljf3RiWJC1Roz6n8BXgp/osRJI0fqPOFJYD+5J8Efjhkc6q2nT0j0iSTjSjhsKb+yxCkvToMOq3j/6p70IkSeM36rePvscDK5yeCpwC/E9Vnd5XYZKk42/UmcKTBttJXsDsj+hIkpaQY1oltapuBJ63yLVIksZs1MtHLxponsTscws+syBJS8yo3z76tYH3h4Gv8tDfW5YkneBGvafwir4LkSSN36g/srMyyd8kuSvJfye5IcnKvouTJB1fo95o/iCzP6X5VGAF8HddnyRpCRk1FCaq6oNVdbh7fQiY6LEuSdIYjBoK30zykiTLutdLAH9LWZKWmFFD4VLgxcB/Ad8ALgG8+SxJS8yoX0l9C/CyqrobIMmPA+9gNiwkSUvEqDOFc48EAkBVfRs4r5+SJEnjMmoonJTkzCONbqYw6ixDknSCGPUv9j8F/iXJ9cwub/Fi4K29VSVJGotRn2i+JskUs4vgBXhRVe3rtTJJ0nE38iWgLgQMAklawo5p6WxJ0tJkKEiSGkNBktQYCpKkxlCQJDWGgiSp6TUUkmxMsj/JdJIr5xl3SZJKMtlnPZKk+fUWCkmWAduBi4D1wNYk6+cY9yTgtcDNfdUiSRpNnzOFDcB0VR2oqvuAncDmOca9BXgb8IMea5EkjaDPUFgB3DnQnun6miTnAauq6uM91iFJGlGfoZA5+qptTE4C3gm8fsEdJduSTCWZOnTo0CKWKEka1GcozACrBtorgYMD7ScB5wCfSfJV4FnArrluNlfVjqqarKrJiQl/GlqS+tJnKNwCrEuyNsmpwBZg15GNVfWdqlpeVWuqag1wE7CpqqZ6rEmSNI/eQqGqDgOXA3uAO4DrqmpvkquTbOrruJKkY9frr6dV1W5g91DfVUcZe36ftUiSFuYTzZKkxlCQJDWGgiSpMRQkSY2hIElqDAVJUmMoSJIaQ0GS1BgKkqTGUJAkNYaCJKkxFCRJjaEgSWoMBUlSYyhIkhpDQZLUGAqSpMZQkCQ1hoIkqTEUJEmNoSBJagwFSVJjKEiSGkNBktQYCpKkxlCQJDWGgiSpMRQkSY2hIElqDAVJUmMoSJIaQ0GS1BgKkqSm11BIsjHJ/iTTSa6cY/vrkuxLcnuSTyZ5Wp/1SJLm11soJFkGbAcuAtYDW5OsHxr2JWCyqs4Frgfe1lc9kqSF9TlT2ABMV9WBqroP2AlsHhxQVZ+uqu93zZuAlT3WI0laQJ+hsAK4c6A90/UdzWXA38+1Icm2JFNJpg4dOrSIJUqSBvUZCpmjr+YcmLwEmATePtf2qtpRVZNVNTkxMbGIJUqSBp3c475ngFUD7ZXAweFBSS4E3gj8SlX9sMd6JEkL6HOmcAuwLsnaJKcCW4BdgwOSnAe8H9hUVXf1WIskaQS9hUJVHQYuB/YAdwDXVdXeJFcn2dQNezvwROCvk9yWZNdRdidJOg76vHxEVe0Gdg/1XTXw/sI+jy9Jenh8olmS1BgKkqTGUJAkNYaCJKkxFCRJjaEgSWoMBUlSYyhIkhpDQZLUGAqSpMZQkCQ1hoIkqTEUJEmNoSBJagwFSVJjKEiSGkNBktQYCpKkxlCQJDWGgiSpMRQkSY2hIElqDAVJUmMoSJIaQ0GS1BgKkqTGUJAkNYaCJKkxFCRJjaEgSWoMBUlSYyhIkppeQyHJxiT7k0wnuXKO7Y9L8rFu+81J1vRZjyRpfr2FQpJlwHbgImA9sDXJ+qFhlwF3V9VZwDuBP+mrHknSwvqcKWwApqvqQFXdB+wENg+N2Qx8uHt/PXBBkvRYkyRpHn2GwgrgzoH2TNc355iqOgx8B/iJHmuSJM3j5B73Pde/+OsYxpBkG7Cta96bZP8jrE0PWA58c9xFPBrkHS8bdwl6MM/NI960KBdQnjbKoD5DYQZYNdBeCRw8ypiZJCcDZwDfHt5RVe0AdvRU52Nakqmqmhx3HdIwz83x6PPy0S3AuiRrk5wKbAF2DY3ZBRz559klwKeq6iEzBUnS8dHbTKGqDie5HNgDLAM+UFV7k1wNTFXVLuAvgY8kmWZ2hrClr3okSQuL/zB/bEuyrbs8Jz2qeG6Oh6EgSWpc5kKS1BgKJ7gkH0hyV5KvDPS9JcntSW5L8okkTx36zDOT3J/kkoG+f0hyT5KPz3MslyXRyJKcluSLSb6cZG+SP+r6L0jyr935+fkkZ3X97+z6bkvyH0nuGdjX/QPbhr+wcmSM5+ci8PLRCS7JLwP3AtdU1Tld3+lV9d3u/WuB9VX16q69DPhH4AfM3vy/vuu/AHg88Kqq+tWjHOs1wLlV9eokW4AXVtVv9Psn1ImqW53gCVV1b5JTgM8DvwNcA2yuqju6c2pDVb186LNXAOdV1aVd+96qeuICx/P8XATOFE5wVfVZhp7tOBIInSfw4AcCrwBuAO4a+swnge8tcDiXJdHIata9XfOU7lXd6/Su/wwe+vwSwFbg2od5SM/PRdDnw2saoyRvBV7K7NIhz+36VgAvBJ4HPPMYdvugZUmSHFmWxKdONaduZnorcBawvapuTvJbwO4k/wt8F3jW0GeeBqwFPjXQfVqSKeAw8MdVdeMch/P8XATOFJaoqnpjVa0C/gq4vOt+F/D7VXX/Me52pGVJpCOq6v6q+nlmVzTYkOQc4PeAi6tqJfBB4M+GPrYFuH7oPF3dPd38m8C7kjx9jsN5fi4CQ2Hp+yjw6937SWBnkq8y+wT5e5O84GHsqy1dMt+yJNKwqroH+AyzS+n/XFXd3G36GPDsoeFbGLp0VFUHu/8e6PZz3hyH8fxcBIbCEpRk3UBzE/DvAFW1tqrWVNUaZq+5vuYo0/CjcVkSjSzJRJInd+9/DLgQuAM4I8nZ3bDnd31HPvPTwJnAFwb6zkzyuO79cuA5wL45Dun5uQi8p3CCS3ItcD6wPMkM8Cbg4u5/rh8BXwNePcJ+Pgf8DPDEbj+XVdUelyXRI/AU4MPdfYWTgOuq6uNJXgnckORHwN3ApQOf2QrsHPrL/BnA+7vxJzF7T2EfgOfn4vMrqZKkxstHkqTGUJAkNYaCJKkxFCRJjaEgSWoMBUlSYyhIkhpDQZLU/D8dYdUPjz+EyQAAAABJRU5ErkJggg==\n", |
|
|
418 |
"text/plain": [ |
|
|
419 |
"<Figure size 432x288 with 1 Axes>" |
|
|
420 |
] |
|
|
421 |
}, |
|
|
422 |
"metadata": { |
|
|
423 |
"needs_background": "light" |
|
|
424 |
}, |
|
|
425 |
"output_type": "display_data" |
|
|
426 |
} |
|
|
427 |
], |
|
|
428 |
"source": [ |
|
|
429 |
"import seaborn as sns\n", |
|
|
430 |
"count = y_train.sum(axis = 0)\n", |
|
|
431 |
"sns.countplot(x = count)" |
|
|
432 |
] |
|
|
433 |
}, |
|
|
434 |
{ |
|
|
435 |
"cell_type": "code", |
|
|
436 |
"execution_count": 18, |
|
|
437 |
"metadata": {}, |
|
|
438 |
"outputs": [ |
|
|
439 |
{ |
|
|
440 |
"name": "stderr", |
|
|
441 |
"output_type": "stream", |
|
|
442 |
"text": [ |
|
|
443 |
"/home/neuzan/Programs/anaconda3/envs/DeepL/lib/python3.6/site-packages/keras/callbacks.py:1065: UserWarning: `epsilon` argument is deprecated and will be removed, use `min_delta` instead.\n", |
|
|
444 |
" warnings.warn('`epsilon` argument is deprecated and '\n" |
|
|
445 |
] |
|
|
446 |
} |
|
|
447 |
], |
|
|
448 |
"source": [ |
|
|
449 |
"from keras.callbacks import ReduceLROnPlateau , ModelCheckpoint\n", |
|
|
450 |
"lr_reduce = ReduceLROnPlateau(monitor='val_acc', factor=0.1, epsilon=0.0001, patience=1, verbose=1)" |
|
|
451 |
] |
|
|
452 |
}, |
|
|
453 |
{ |
|
|
454 |
"cell_type": "code", |
|
|
455 |
"execution_count": 19, |
|
|
456 |
"metadata": {}, |
|
|
457 |
"outputs": [], |
|
|
458 |
"source": [ |
|
|
459 |
"filepath=\"weights.hdf5\"\n", |
|
|
460 |
"checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=True, mode='max')" |
|
|
461 |
] |
|
|
462 |
}, |
|
|
463 |
{ |
|
|
464 |
"cell_type": "code", |
|
|
465 |
"execution_count": 20, |
|
|
466 |
"metadata": {}, |
|
|
467 |
"outputs": [], |
|
|
468 |
"source": [ |
|
|
469 |
"from keras.models import Sequential\n", |
|
|
470 |
"from keras.layers import Dense , Activation\n", |
|
|
471 |
"from keras.layers import Dropout\n", |
|
|
472 |
"from keras.layers import Flatten\n", |
|
|
473 |
"from keras.constraints import maxnorm\n", |
|
|
474 |
"from keras.optimizers import SGD , RMSprop\n", |
|
|
475 |
"from keras.layers import Conv2D , BatchNormalization\n", |
|
|
476 |
"from keras.layers import MaxPooling2D\n", |
|
|
477 |
"from keras.utils import np_utils\n", |
|
|
478 |
"from keras import backend as K\n", |
|
|
479 |
"K.set_image_dim_ordering('th')\n", |
|
|
480 |
"from sklearn.model_selection import GridSearchCV\n", |
|
|
481 |
"from keras.wrappers.scikit_learn import KerasClassifier" |
|
|
482 |
] |
|
|
483 |
}, |
|
|
484 |
{ |
|
|
485 |
"cell_type": "code", |
|
|
486 |
"execution_count": 21, |
|
|
487 |
"metadata": {}, |
|
|
488 |
"outputs": [], |
|
|
489 |
"source": [ |
|
|
490 |
"#X_train=X_train.reshape(5216,3,150,150)\n", |
|
|
491 |
"#X_test=X_test.reshape(624,3,150,150)" |
|
|
492 |
] |
|
|
493 |
}, |
|
|
494 |
{ |
|
|
495 |
"cell_type": "code", |
|
|
496 |
"execution_count": 22, |
|
|
497 |
"metadata": {}, |
|
|
498 |
"outputs": [ |
|
|
499 |
{ |
|
|
500 |
"name": "stdout", |
|
|
501 |
"output_type": "stream", |
|
|
502 |
"text": [ |
|
|
503 |
"_________________________________________________________________\n", |
|
|
504 |
"Layer (type) Output Shape Param # \n", |
|
|
505 |
"=================================================================\n", |
|
|
506 |
"conv2d_1 (Conv2D) (None, 16, 150, 3) 21616 \n", |
|
|
507 |
"_________________________________________________________________\n", |
|
|
508 |
"conv2d_2 (Conv2D) (None, 16, 150, 3) 2320 \n", |
|
|
509 |
"_________________________________________________________________\n", |
|
|
510 |
"conv2d_3 (Conv2D) (None, 32, 150, 3) 4640 \n", |
|
|
511 |
"_________________________________________________________________\n", |
|
|
512 |
"conv2d_4 (Conv2D) (None, 32, 150, 3) 9248 \n", |
|
|
513 |
"_________________________________________________________________\n", |
|
|
514 |
"conv2d_5 (Conv2D) (None, 64, 150, 3) 18496 \n", |
|
|
515 |
"_________________________________________________________________\n", |
|
|
516 |
"conv2d_6 (Conv2D) (None, 64, 150, 3) 36928 \n", |
|
|
517 |
"_________________________________________________________________\n", |
|
|
518 |
"max_pooling2d_1 (MaxPooling2 (None, 64, 75, 1) 0 \n", |
|
|
519 |
"_________________________________________________________________\n", |
|
|
520 |
"flatten_1 (Flatten) (None, 4800) 0 \n", |
|
|
521 |
"_________________________________________________________________\n", |
|
|
522 |
"dense_1 (Dense) (None, 64) 307264 \n", |
|
|
523 |
"_________________________________________________________________\n", |
|
|
524 |
"dropout_1 (Dropout) (None, 64) 0 \n", |
|
|
525 |
"_________________________________________________________________\n", |
|
|
526 |
"dense_2 (Dense) (None, 2) 130 \n", |
|
|
527 |
"=================================================================\n", |
|
|
528 |
"Total params: 400,642\n", |
|
|
529 |
"Trainable params: 400,642\n", |
|
|
530 |
"Non-trainable params: 0\n", |
|
|
531 |
"_________________________________________________________________\n", |
|
|
532 |
"None\n" |
|
|
533 |
] |
|
|
534 |
} |
|
|
535 |
], |
|
|
536 |
"source": [ |
|
|
537 |
"model = Sequential()\n", |
|
|
538 |
"model.add(Conv2D(16, (3, 3), activation='relu', padding=\"same\", input_shape=(150,150,3)))\n", |
|
|
539 |
"model.add(Conv2D(16, (3, 3), padding=\"same\", activation='relu'))\n", |
|
|
540 |
"\n", |
|
|
541 |
"model.add(Conv2D(32, (3, 3), activation='relu', padding=\"same\"))\n", |
|
|
542 |
"model.add(Conv2D(32, (3, 3), padding=\"same\", activation='relu'))\n", |
|
|
543 |
"\n", |
|
|
544 |
"model.add(Conv2D(64, (3, 3), activation='relu', padding=\"same\"))\n", |
|
|
545 |
"model.add(Conv2D(64, (3, 3), padding=\"same\", activation='relu'))\n", |
|
|
546 |
"model.add(MaxPooling2D(pool_size=(2, 2)))\n", |
|
|
547 |
"\n", |
|
|
548 |
"\n", |
|
|
549 |
"model.add(Flatten())\n", |
|
|
550 |
"\n", |
|
|
551 |
"model.add(Dense(64, activation='relu'))\n", |
|
|
552 |
"model.add(Dropout(0.2))\n", |
|
|
553 |
"model.add(Dense(2 , activation='sigmoid'))\n", |
|
|
554 |
"\n", |
|
|
555 |
"model.compile(loss='binary_crossentropy',\n", |
|
|
556 |
" optimizer=RMSprop(lr=0.00005),\n", |
|
|
557 |
" metrics=['accuracy'])\n", |
|
|
558 |
"\n", |
|
|
559 |
"print(model.summary())\n" |
|
|
560 |
] |
|
|
561 |
}, |
|
|
562 |
{ |
|
|
563 |
"cell_type": "code", |
|
|
564 |
"execution_count": 23, |
|
|
565 |
"metadata": {}, |
|
|
566 |
"outputs": [], |
|
|
567 |
"source": [ |
|
|
568 |
"batch_size = 256\n", |
|
|
569 |
"epochs = 10" |
|
|
570 |
] |
|
|
571 |
}, |
|
|
572 |
{ |
|
|
573 |
"cell_type": "code", |
|
|
574 |
"execution_count": 24, |
|
|
575 |
"metadata": {}, |
|
|
576 |
"outputs": [ |
|
|
577 |
{ |
|
|
578 |
"name": "stdout", |
|
|
579 |
"output_type": "stream", |
|
|
580 |
"text": [ |
|
|
581 |
"Train on 5216 samples, validate on 624 samples\n", |
|
|
582 |
"Epoch 1/10\n", |
|
|
583 |
"5216/5216 [==============================] - 12s 2ms/step - loss: 0.5063 - acc: 0.7597 - val_loss: 0.4808 - val_acc: 0.7780\n", |
|
|
584 |
"\n", |
|
|
585 |
"Epoch 00001: val_acc improved from -inf to 0.77804, saving model to weights.hdf5\n", |
|
|
586 |
"Epoch 2/10\n", |
|
|
587 |
"5216/5216 [==============================] - 6s 1ms/step - loss: 0.2925 - acc: 0.8792 - val_loss: 0.6008 - val_acc: 0.7252\n", |
|
|
588 |
"\n", |
|
|
589 |
"Epoch 00002: ReduceLROnPlateau reducing learning rate to 4.999999873689376e-06.\n", |
|
|
590 |
"\n", |
|
|
591 |
"Epoch 00002: val_acc did not improve from 0.77804\n", |
|
|
592 |
"Epoch 3/10\n", |
|
|
593 |
"5216/5216 [==============================] - 6s 1ms/step - loss: 0.2312 - acc: 0.9042 - val_loss: 0.5019 - val_acc: 0.7780\n", |
|
|
594 |
"\n", |
|
|
595 |
"Epoch 00003: ReduceLROnPlateau reducing learning rate to 4.999999873689376e-07.\n", |
|
|
596 |
"\n", |
|
|
597 |
"Epoch 00003: val_acc did not improve from 0.77804\n", |
|
|
598 |
"Epoch 4/10\n", |
|
|
599 |
"5216/5216 [==============================] - 6s 1ms/step - loss: 0.2249 - acc: 0.9077 - val_loss: 0.4912 - val_acc: 0.7821\n", |
|
|
600 |
"\n", |
|
|
601 |
"Epoch 00004: val_acc improved from 0.77804 to 0.78205, saving model to weights.hdf5\n", |
|
|
602 |
"Epoch 5/10\n", |
|
|
603 |
"5216/5216 [==============================] - 7s 1ms/step - loss: 0.2243 - acc: 0.9097 - val_loss: 0.4968 - val_acc: 0.7796\n", |
|
|
604 |
"\n", |
|
|
605 |
"Epoch 00005: ReduceLROnPlateau reducing learning rate to 4.999999987376214e-08.\n", |
|
|
606 |
"\n", |
|
|
607 |
"Epoch 00005: val_acc did not improve from 0.78205\n", |
|
|
608 |
"Epoch 6/10\n", |
|
|
609 |
"5216/5216 [==============================] - 7s 1ms/step - loss: 0.2251 - acc: 0.9078 - val_loss: 0.4975 - val_acc: 0.7796\n", |
|
|
610 |
"\n", |
|
|
611 |
"Epoch 00006: ReduceLROnPlateau reducing learning rate to 5.000000058430488e-09.\n", |
|
|
612 |
"\n", |
|
|
613 |
"Epoch 00006: val_acc did not improve from 0.78205\n", |
|
|
614 |
"Epoch 7/10\n", |
|
|
615 |
"5216/5216 [==============================] - 7s 1ms/step - loss: 0.2224 - acc: 0.9094 - val_loss: 0.4974 - val_acc: 0.7796\n", |
|
|
616 |
"\n", |
|
|
617 |
"Epoch 00007: ReduceLROnPlateau reducing learning rate to 4.999999969612646e-10.\n", |
|
|
618 |
"\n", |
|
|
619 |
"Epoch 00007: val_acc did not improve from 0.78205\n", |
|
|
620 |
"Epoch 8/10\n", |
|
|
621 |
"5216/5216 [==============================] - 7s 1ms/step - loss: 0.2255 - acc: 0.9078 - val_loss: 0.4974 - val_acc: 0.7796\n", |
|
|
622 |
"\n", |
|
|
623 |
"Epoch 00008: ReduceLROnPlateau reducing learning rate to 4.999999858590343e-11.\n", |
|
|
624 |
"\n", |
|
|
625 |
"Epoch 00008: val_acc did not improve from 0.78205\n", |
|
|
626 |
"Epoch 9/10\n", |
|
|
627 |
"5216/5216 [==============================] - 7s 1ms/step - loss: 0.2243 - acc: 0.9085 - val_loss: 0.4974 - val_acc: 0.7796\n", |
|
|
628 |
"\n", |
|
|
629 |
"Epoch 00009: ReduceLROnPlateau reducing learning rate to 4.999999719812465e-12.\n", |
|
|
630 |
"\n", |
|
|
631 |
"Epoch 00009: val_acc did not improve from 0.78205\n", |
|
|
632 |
"Epoch 10/10\n", |
|
|
633 |
"5216/5216 [==============================] - 7s 1ms/step - loss: 0.2242 - acc: 0.9088 - val_loss: 0.4974 - val_acc: 0.7796\n", |
|
|
634 |
"\n", |
|
|
635 |
"Epoch 00010: ReduceLROnPlateau reducing learning rate to 4.999999546340118e-13.\n", |
|
|
636 |
"\n", |
|
|
637 |
"Epoch 00010: val_acc did not improve from 0.78205\n" |
|
|
638 |
] |
|
|
639 |
} |
|
|
640 |
], |
|
|
641 |
"source": [ |
|
|
642 |
"history = model.fit(X_train, y_train, validation_data = (X_test , y_test) ,callbacks=[lr_reduce,checkpoint] ,\n", |
|
|
643 |
" epochs=epochs)\n" |
|
|
644 |
] |
|
|
645 |
}, |
|
|
646 |
{ |
|
|
647 |
"cell_type": "code", |
|
|
648 |
"execution_count": 34, |
|
|
649 |
"metadata": {}, |
|
|
650 |
"outputs": [], |
|
|
651 |
"source": [ |
|
|
652 |
"model.save('mymodel.h5')" |
|
|
653 |
] |
|
|
654 |
}, |
|
|
655 |
{ |
|
|
656 |
"cell_type": "code", |
|
|
657 |
"execution_count": 27, |
|
|
658 |
"metadata": {}, |
|
|
659 |
"outputs": [ |
|
|
660 |
{ |
|
|
661 |
"data": { |
|
|
662 |
"image/png": "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\n", |
|
|
663 |
"text/plain": [ |
|
|
664 |
"<Figure size 432x288 with 1 Axes>" |
|
|
665 |
] |
|
|
666 |
}, |
|
|
667 |
"metadata": { |
|
|
668 |
"needs_background": "light" |
|
|
669 |
}, |
|
|
670 |
"output_type": "display_data" |
|
|
671 |
}, |
|
|
672 |
{ |
|
|
673 |
"data": { |
|
|
674 |
"image/png": "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\n", |
|
|
675 |
"text/plain": [ |
|
|
676 |
"<Figure size 432x288 with 1 Axes>" |
|
|
677 |
] |
|
|
678 |
}, |
|
|
679 |
"metadata": { |
|
|
680 |
"needs_background": "light" |
|
|
681 |
}, |
|
|
682 |
"output_type": "display_data" |
|
|
683 |
} |
|
|
684 |
], |
|
|
685 |
"source": [ |
|
|
686 |
"import matplotlib.pyplot as plt\n", |
|
|
687 |
"from keras.models import load_model\n", |
|
|
688 |
"\n", |
|
|
689 |
"\n", |
|
|
690 |
"plt.plot(history.history['acc'])\n", |
|
|
691 |
"plt.plot(history.history['val_acc'])\n", |
|
|
692 |
"plt.title('model accuracy')\n", |
|
|
693 |
"plt.ylabel('accuracy')\n", |
|
|
694 |
"plt.xlabel('epoch')\n", |
|
|
695 |
"plt.legend(['train', 'test'], loc='upper left')\n", |
|
|
696 |
"plt.show()\n", |
|
|
697 |
"# summarize history for loss\n", |
|
|
698 |
"plt.plot(history.history['loss'])\n", |
|
|
699 |
"plt.plot(history.history['val_loss'])\n", |
|
|
700 |
"plt.title('model loss')\n", |
|
|
701 |
"plt.ylabel('loss')\n", |
|
|
702 |
"plt.xlabel('epoch')\n", |
|
|
703 |
"plt.legend(['train', 'test'], loc='upper left')\n", |
|
|
704 |
"plt.show()" |
|
|
705 |
] |
|
|
706 |
}, |
|
|
707 |
{ |
|
|
708 |
"cell_type": "code", |
|
|
709 |
"execution_count": 28, |
|
|
710 |
"metadata": {}, |
|
|
711 |
"outputs": [], |
|
|
712 |
"source": [ |
|
|
713 |
"from sklearn.metrics import confusion_matrix\n", |
|
|
714 |
"pred = model.predict(X_test)\n", |
|
|
715 |
"pred = np.argmax(pred,axis = 1) \n", |
|
|
716 |
"y_true = np.argmax(y_test,axis = 1)\n" |
|
|
717 |
] |
|
|
718 |
}, |
|
|
719 |
{ |
|
|
720 |
"cell_type": "code", |
|
|
721 |
"execution_count": 29, |
|
|
722 |
"metadata": {}, |
|
|
723 |
"outputs": [ |
|
|
724 |
{ |
|
|
725 |
"data": { |
|
|
726 |
"image/png": "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\n", |
|
|
727 |
"text/plain": [ |
|
|
728 |
"<Figure size 360x360 with 1 Axes>" |
|
|
729 |
] |
|
|
730 |
}, |
|
|
731 |
"metadata": { |
|
|
732 |
"needs_background": "light" |
|
|
733 |
}, |
|
|
734 |
"output_type": "display_data" |
|
|
735 |
} |
|
|
736 |
], |
|
|
737 |
"source": [ |
|
|
738 |
"CM = confusion_matrix(y_true, pred)\n", |
|
|
739 |
"from mlxtend.plotting import plot_confusion_matrix\n", |
|
|
740 |
"fig, ax = plot_confusion_matrix(conf_mat=CM , figsize=(5, 5))\n", |
|
|
741 |
"plt.show()\n" |
|
|
742 |
] |
|
|
743 |
}, |
|
|
744 |
{ |
|
|
745 |
"cell_type": "code", |
|
|
746 |
"execution_count": 16, |
|
|
747 |
"metadata": {}, |
|
|
748 |
"outputs": [ |
|
|
749 |
{ |
|
|
750 |
"data": { |
|
|
751 |
"text/plain": [ |
|
|
752 |
"0.7504950495049505" |
|
|
753 |
] |
|
|
754 |
}, |
|
|
755 |
"execution_count": 16, |
|
|
756 |
"metadata": {}, |
|
|
757 |
"output_type": "execute_result" |
|
|
758 |
} |
|
|
759 |
], |
|
|
760 |
"source": [ |
|
|
761 |
"#PRECISION = (TP/(TP+FP))\n", |
|
|
762 |
"379/(379+126)" |
|
|
763 |
] |
|
|
764 |
}, |
|
|
765 |
{ |
|
|
766 |
"cell_type": "code", |
|
|
767 |
"execution_count": 17, |
|
|
768 |
"metadata": {}, |
|
|
769 |
"outputs": [ |
|
|
770 |
{ |
|
|
771 |
"data": { |
|
|
772 |
"text/plain": [ |
|
|
773 |
"0.9717948717948718" |
|
|
774 |
] |
|
|
775 |
}, |
|
|
776 |
"execution_count": 17, |
|
|
777 |
"metadata": {}, |
|
|
778 |
"output_type": "execute_result" |
|
|
779 |
} |
|
|
780 |
], |
|
|
781 |
"source": [ |
|
|
782 |
"#RECALL = (TP/(TP+FN))\n", |
|
|
783 |
"379 / (379 + 11)\n" |
|
|
784 |
] |
|
|
785 |
}, |
|
|
786 |
{ |
|
|
787 |
"cell_type": "code", |
|
|
788 |
"execution_count": 18, |
|
|
789 |
"metadata": {}, |
|
|
790 |
"outputs": [ |
|
|
791 |
{ |
|
|
792 |
"data": { |
|
|
793 |
"text/plain": [ |
|
|
794 |
"0.780448717948718" |
|
|
795 |
] |
|
|
796 |
}, |
|
|
797 |
"execution_count": 18, |
|
|
798 |
"metadata": {}, |
|
|
799 |
"output_type": "execute_result" |
|
|
800 |
} |
|
|
801 |
], |
|
|
802 |
"source": [ |
|
|
803 |
"#ACCURACY = (TP+TN)/(TP+TN+FP+FN)\n", |
|
|
804 |
"(379+108)/(379+108+126+11)" |
|
|
805 |
] |
|
|
806 |
}, |
|
|
807 |
{ |
|
|
808 |
"cell_type": "code", |
|
|
809 |
"execution_count": null, |
|
|
810 |
"metadata": {}, |
|
|
811 |
"outputs": [], |
|
|
812 |
"source": [] |
|
|
813 |
} |
|
|
814 |
], |
|
|
815 |
"metadata": { |
|
|
816 |
"kernelspec": { |
|
|
817 |
"display_name": "Python 3", |
|
|
818 |
"language": "python", |
|
|
819 |
"name": "python3" |
|
|
820 |
}, |
|
|
821 |
"language_info": { |
|
|
822 |
"codemirror_mode": { |
|
|
823 |
"name": "ipython", |
|
|
824 |
"version": 3 |
|
|
825 |
}, |
|
|
826 |
"file_extension": ".py", |
|
|
827 |
"mimetype": "text/x-python", |
|
|
828 |
"name": "python", |
|
|
829 |
"nbconvert_exporter": "python", |
|
|
830 |
"pygments_lexer": "ipython3", |
|
|
831 |
"version": "3.7.3" |
|
|
832 |
} |
|
|
833 |
}, |
|
|
834 |
"nbformat": 4, |
|
|
835 |
"nbformat_minor": 2 |
|
|
836 |
} |