├── README.md
├── .gitattributes
├── model.png
├── .gitignore
├── 3. Predict function.ipynb
├── 1. File Preparation.ipynb
└── 2. Model Train.ipynb
/README.md:
--------------------------------------------------------------------------------
1 | # image-clasifier-tf-keras
2 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
--------------------------------------------------------------------------------
/model.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/afif2100/image-clasifier-tf-keras/HEAD/model.png
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | *.jpg
3 | flowers/dandelion/run_me.py
4 | flowers/dandelion/flickr.pyc
5 | flowers/dandelion/flickr.py
6 | dataset/train/dandelion/run_me.py
7 | dataset/train/dandelion/flickr.pyc
8 | dataset/train/dandelion/flickr.py
9 | *.h5
10 | flowers/*
--------------------------------------------------------------------------------
/3. Predict function.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# Defiine params and lib"
8 | ]
9 | },
10 | {
11 | "cell_type": "code",
12 | "execution_count": 1,
13 | "metadata": {
14 | "ExecuteTime": {
15 | "end_time": "2020-04-28T05:29:11.481339Z",
16 | "start_time": "2020-04-28T05:29:11.338446Z"
17 | }
18 | },
19 | "outputs": [],
20 | "source": [
21 | "import requests\n",
22 | "from io import BytesIO\n",
23 | "\n",
24 | "from PIL import Image\n",
25 | "import numpy as np"
26 | ]
27 | },
28 | {
29 | "cell_type": "code",
30 | "execution_count": 3,
31 | "metadata": {
32 | "ExecuteTime": {
33 | "end_time": "2020-04-28T05:29:11.622498Z",
34 | "start_time": "2020-04-28T05:29:11.619866Z"
35 | }
36 | },
37 | "outputs": [],
38 | "source": [
39 | "# Parameters\n",
40 | "input_size = (160,160)\n",
41 | "\n",
42 | "#define input shape\n",
43 | "channel = (3,)\n",
44 | "input_shape = input_size + channel\n",
45 | "\n",
46 | "#define labels\n",
47 | "labels = ['daisy', 'dandelion', 'rose', 'sunflower', 'tulip']"
48 | ]
49 | },
50 | {
51 | "cell_type": "markdown",
52 | "metadata": {},
53 | "source": [
54 | "# Define preprocess function"
55 | ]
56 | },
57 | {
58 | "cell_type": "code",
59 | "execution_count": 4,
60 | "metadata": {
61 | "ExecuteTime": {
62 | "end_time": "2020-04-28T05:29:12.252129Z",
63 | "start_time": "2020-04-28T05:29:12.249482Z"
64 | }
65 | },
66 | "outputs": [],
67 | "source": [
68 | "def preprocess(img,input_size):\n",
69 | " nimg = img.convert('RGB').resize(input_size, resample= 0)\n",
70 | " img_arr = (np.array(nimg))/255\n",
71 | " return img_arr\n",
72 | "\n",
73 | "def reshape(imgs_arr):\n",
74 | " return np.stack(imgs_arr, axis=0)"
75 | ]
76 | },
77 | {
78 | "cell_type": "markdown",
79 | "metadata": {},
80 | "source": [
81 | "# Load models"
82 | ]
83 | },
84 | {
85 | "cell_type": "code",
86 | "execution_count": 5,
87 | "metadata": {
88 | "ExecuteTime": {
89 | "end_time": "2020-04-28T05:29:15.210711Z",
90 | "start_time": "2020-04-28T05:29:13.027784Z"
91 | }
92 | },
93 | "outputs": [],
94 | "source": [
95 | "from tensorflow.keras.models import load_model"
96 | ]
97 | },
98 | {
99 | "cell_type": "code",
100 | "execution_count": 6,
101 | "metadata": {
102 | "ExecuteTime": {
103 | "end_time": "2020-04-28T05:29:17.186101Z",
104 | "start_time": "2020-04-28T05:29:15.961909Z"
105 | }
106 | },
107 | "outputs": [],
108 | "source": [
109 | "# ada 2 cara load model, jika cara pertama berhasil maka bisa lasngusng di lanjutkan ke fungsi prediksi\n",
110 | "\n",
111 | "MODEL_PATH = 'model/medium_project/model.h5'\n",
112 | "model = load_model(MODEL_PATH,compile=False)"
113 | ]
114 | },
115 | {
116 | "cell_type": "code",
117 | "execution_count": null,
118 | "metadata": {},
119 | "outputs": [],
120 | "source": []
121 | },
122 | {
123 | "cell_type": "markdown",
124 | "metadata": {},
125 | "source": [
126 | "# Predict the image"
127 | ]
128 | },
129 | {
130 | "cell_type": "code",
131 | "execution_count": 7,
132 | "metadata": {
133 | "ExecuteTime": {
134 | "end_time": "2020-04-28T05:53:18.906930Z",
135 | "start_time": "2020-04-28T05:53:18.862643Z"
136 | }
137 | },
138 | "outputs": [
139 | {
140 | "name": "stdout",
141 | "output_type": "stream",
142 | "text": [
143 | "tulip 0.92026424\n"
144 | ]
145 | }
146 | ],
147 | "source": [
148 | "# read image\n",
149 | "im = Image.open('contoh_prediksi.jpg')\n",
150 | "X = preprocess(im,input_size)\n",
151 | "X = reshape([X])\n",
152 | "y = model.predict(X)\n",
153 | "\n",
154 | "print( labels[np.argmax(y)], np.max(y) )"
155 | ]
156 | },
157 | {
158 | "cell_type": "code",
159 | "execution_count": 8,
160 | "metadata": {
161 | "ExecuteTime": {
162 | "end_time": "2020-04-28T05:55:25.943020Z",
163 | "start_time": "2020-04-28T05:55:25.940623Z"
164 | }
165 | },
166 | "outputs": [
167 | {
168 | "data": {
169 | "text/plain": [
170 | "array([[7.9548061e-02, 1.8205217e-04, 3.7672000e-06, 1.9034776e-06,\n",
171 | " 9.2026424e-01]], dtype=float32)"
172 | ]
173 | },
174 | "execution_count": 8,
175 | "metadata": {},
176 | "output_type": "execute_result"
177 | }
178 | ],
179 | "source": [
180 | "y"
181 | ]
182 | },
183 | {
184 | "cell_type": "code",
185 | "execution_count": 9,
186 | "metadata": {
187 | "ExecuteTime": {
188 | "end_time": "2020-04-28T05:55:31.926225Z",
189 | "start_time": "2020-04-28T05:55:31.923969Z"
190 | }
191 | },
192 | "outputs": [
193 | {
194 | "name": "stdout",
195 | "output_type": "stream",
196 | "text": [
197 | "tulip 0.92026424\n"
198 | ]
199 | }
200 | ],
201 | "source": [
202 | "print( labels[np.argmax(y)], np.max(y) )"
203 | ]
204 | },
205 | {
206 | "cell_type": "code",
207 | "execution_count": null,
208 | "metadata": {},
209 | "outputs": [],
210 | "source": []
211 | },
212 | {
213 | "cell_type": "code",
214 | "execution_count": 10,
215 | "metadata": {
216 | "ExecuteTime": {
217 | "end_time": "2020-04-28T05:38:01.137699Z",
218 | "start_time": "2020-04-28T05:38:01.057364Z"
219 | }
220 | },
221 | "outputs": [
222 | {
223 | "name": "stdout",
224 | "output_type": "stream",
225 | "text": [
226 | "dandelion 0.9999939\n"
227 | ]
228 | }
229 | ],
230 | "source": [
231 | "# read image\n",
232 | "im = Image.open('dataset/train/dandelion/2522454811_f87af57d8b.jpg')\n",
233 | "X = preprocess(im,input_size)\n",
234 | "X = reshape([X])\n",
235 | "y = model.predict(X)\n",
236 | "\n",
237 | "print( labels[np.argmax(y)], np.max(y) )"
238 | ]
239 | },
240 | {
241 | "cell_type": "code",
242 | "execution_count": null,
243 | "metadata": {},
244 | "outputs": [],
245 | "source": []
246 | }
247 | ],
248 | "metadata": {
249 | "interpreter": {
250 | "hash": "ecf5722fdaf1897a315d257d89d94520bfcaa453217d5becf09b39e73618b0de"
251 | },
252 | "kernelspec": {
253 | "display_name": "Python [conda env:tf2]",
254 | "language": "python",
255 | "name": "python3"
256 | },
257 | "language_info": {
258 | "codemirror_mode": {
259 | "name": "ipython",
260 | "version": 3
261 | },
262 | "file_extension": ".py",
263 | "mimetype": "text/x-python",
264 | "name": "python",
265 | "nbconvert_exporter": "python",
266 | "pygments_lexer": "ipython3",
267 | "version": "3.9.5"
268 | },
269 | "toc": {
270 | "base_numbering": 1,
271 | "nav_menu": {},
272 | "number_sections": true,
273 | "sideBar": true,
274 | "skip_h1_title": false,
275 | "title_cell": "Table of Contents",
276 | "title_sidebar": "Contents",
277 | "toc_cell": false,
278 | "toc_position": {},
279 | "toc_section_display": true,
280 | "toc_window_display": false
281 | },
282 | "varInspector": {
283 | "cols": {
284 | "lenName": 16,
285 | "lenType": 16,
286 | "lenVar": 40
287 | },
288 | "kernels_config": {
289 | "python": {
290 | "delete_cmd_postfix": "",
291 | "delete_cmd_prefix": "del ",
292 | "library": "var_list.py",
293 | "varRefreshCmd": "print(var_dic_list())"
294 | },
295 | "r": {
296 | "delete_cmd_postfix": ") ",
297 | "delete_cmd_prefix": "rm(",
298 | "library": "var_list.r",
299 | "varRefreshCmd": "cat(var_dic_list()) "
300 | }
301 | },
302 | "types_to_exclude": [
303 | "module",
304 | "function",
305 | "builtin_function_or_method",
306 | "instance",
307 | "_Feature"
308 | ],
309 | "window_display": false
310 | }
311 | },
312 | "nbformat": 4,
313 | "nbformat_minor": 2
314 | }
315 |
--------------------------------------------------------------------------------
/1. File Preparation.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# Kita Pisahkan datanya menjadi 3"
8 | ]
9 | },
10 | {
11 | "cell_type": "markdown",
12 | "metadata": {},
13 | "source": [
14 | "Url Source : https://www.kaggle.com/alxmamaev/flowers-recognition"
15 | ]
16 | },
17 | {
18 | "cell_type": "markdown",
19 | "metadata": {},
20 | "source": [
21 | "- train (data latih)\n",
22 | "- validation (validasi untuk data latih)\n",
23 | "- test (data testing untuk menguji model)"
24 | ]
25 | },
26 | {
27 | "cell_type": "code",
28 | "execution_count": 1,
29 | "metadata": {
30 | "ExecuteTime": {
31 | "end_time": "2020-04-27T13:36:44.577679Z",
32 | "start_time": "2020-04-27T13:36:44.576110Z"
33 | }
34 | },
35 | "outputs": [],
36 | "source": [
37 | "# extract melalui notebook jika diperlukan\n",
38 | "# !unzip flowers-recognition.zip"
39 | ]
40 | },
41 | {
42 | "cell_type": "code",
43 | "execution_count": 2,
44 | "metadata": {
45 | "ExecuteTime": {
46 | "end_time": "2020-04-27T13:20:25.152791Z",
47 | "start_time": "2020-04-27T13:20:25.151197Z"
48 | }
49 | },
50 | "outputs": [],
51 | "source": [
52 | "import os\n",
53 | "import pandas as pd"
54 | ]
55 | },
56 | {
57 | "cell_type": "code",
58 | "execution_count": 26,
59 | "metadata": {
60 | "ExecuteTime": {
61 | "end_time": "2020-04-27T13:20:25.411819Z",
62 | "start_time": "2020-04-27T13:20:25.410118Z"
63 | }
64 | },
65 | "outputs": [],
66 | "source": [
67 | "mypath= 'flowers/'"
68 | ]
69 | },
70 | {
71 | "cell_type": "code",
72 | "execution_count": 33,
73 | "metadata": {
74 | "ExecuteTime": {
75 | "end_time": "2020-04-27T13:20:26.610071Z",
76 | "start_time": "2020-04-27T13:20:26.587117Z"
77 | }
78 | },
79 | "outputs": [],
80 | "source": [
81 | "file_name = []\n",
82 | "tag = []\n",
83 | "full_path = []\n",
84 | "for path, subdirs, files in os.walk(mypath):\n",
85 | " for name in files:\n",
86 | " full_path.append(os.path.join(path, name).replace(\"\\\\\",\"/\")) \n",
87 | " tag.append(path.split('/')[-1]) \n",
88 | " file_name.append(name)"
89 | ]
90 | },
91 | {
92 | "cell_type": "code",
93 | "execution_count": 35,
94 | "metadata": {
95 | "ExecuteTime": {
96 | "end_time": "2020-04-27T13:24:26.890142Z",
97 | "start_time": "2020-04-27T13:24:26.883846Z"
98 | }
99 | },
100 | "outputs": [
101 | {
102 | "data": {
103 | "text/plain": [
104 | "tag\n",
105 | "daisy 764\n",
106 | "dandelion 1052\n",
107 | "rose 784\n",
108 | "sunflower 733\n",
109 | "tulip 984\n",
110 | "dtype: int64"
111 | ]
112 | },
113 | "execution_count": 35,
114 | "metadata": {},
115 | "output_type": "execute_result"
116 | }
117 | ],
118 | "source": [
119 | "# memasukan variabel yang sudah dikumpulkan pada looping di atas menjadi sebuah dataframe agar rapih\n",
120 | "df = pd.DataFrame({\"path\":full_path,'file_name':file_name,\"tag\":tag})\n",
121 | "df.groupby(['tag']).size()"
122 | ]
123 | },
124 | {
125 | "cell_type": "code",
126 | "execution_count": 36,
127 | "metadata": {
128 | "ExecuteTime": {
129 | "end_time": "2020-04-27T13:24:27.173074Z",
130 | "start_time": "2020-04-27T13:24:27.167878Z"
131 | }
132 | },
133 | "outputs": [
134 | {
135 | "data": {
136 | "text/html": [
137 | "
\n",
138 | "\n",
151 | "
\n",
152 | " \n",
153 | " \n",
154 | " | \n",
155 | " path | \n",
156 | " file_name | \n",
157 | " tag | \n",
158 | "
\n",
159 | " \n",
160 | " \n",
161 | " \n",
162 | " | 0 | \n",
163 | " flowers/daisy/100080576_f52e8ee070_n.jpg | \n",
164 | " 100080576_f52e8ee070_n.jpg | \n",
165 | " daisy | \n",
166 | "
\n",
167 | " \n",
168 | " | 1 | \n",
169 | " flowers/daisy/10140303196_b88d3d6cec.jpg | \n",
170 | " 10140303196_b88d3d6cec.jpg | \n",
171 | " daisy | \n",
172 | "
\n",
173 | " \n",
174 | " | 2 | \n",
175 | " flowers/daisy/10172379554_b296050f82_n.jpg | \n",
176 | " 10172379554_b296050f82_n.jpg | \n",
177 | " daisy | \n",
178 | "
\n",
179 | " \n",
180 | " | 3 | \n",
181 | " flowers/daisy/10172567486_2748826a8b.jpg | \n",
182 | " 10172567486_2748826a8b.jpg | \n",
183 | " daisy | \n",
184 | "
\n",
185 | " \n",
186 | " | 4 | \n",
187 | " flowers/daisy/10172636503_21bededa75_n.jpg | \n",
188 | " 10172636503_21bededa75_n.jpg | \n",
189 | " daisy | \n",
190 | "
\n",
191 | " \n",
192 | "
\n",
193 | "
"
194 | ],
195 | "text/plain": [
196 | " path file_name \\\n",
197 | "0 flowers/daisy/100080576_f52e8ee070_n.jpg 100080576_f52e8ee070_n.jpg \n",
198 | "1 flowers/daisy/10140303196_b88d3d6cec.jpg 10140303196_b88d3d6cec.jpg \n",
199 | "2 flowers/daisy/10172379554_b296050f82_n.jpg 10172379554_b296050f82_n.jpg \n",
200 | "3 flowers/daisy/10172567486_2748826a8b.jpg 10172567486_2748826a8b.jpg \n",
201 | "4 flowers/daisy/10172636503_21bededa75_n.jpg 10172636503_21bededa75_n.jpg \n",
202 | "\n",
203 | " tag \n",
204 | "0 daisy \n",
205 | "1 daisy \n",
206 | "2 daisy \n",
207 | "3 daisy \n",
208 | "4 daisy "
209 | ]
210 | },
211 | "execution_count": 36,
212 | "metadata": {},
213 | "output_type": "execute_result"
214 | }
215 | ],
216 | "source": [
217 | "#cek sample datanya\n",
218 | "df.head()"
219 | ]
220 | },
221 | {
222 | "cell_type": "markdown",
223 | "metadata": {},
224 | "source": [
225 | "# Train test split"
226 | ]
227 | },
228 | {
229 | "cell_type": "code",
230 | "execution_count": 37,
231 | "metadata": {
232 | "ExecuteTime": {
233 | "end_time": "2020-04-27T13:24:27.608099Z",
234 | "start_time": "2020-04-27T13:24:27.606378Z"
235 | }
236 | },
237 | "outputs": [],
238 | "source": [
239 | "#load library untuk train test split\n",
240 | "from sklearn.model_selection import train_test_split"
241 | ]
242 | },
243 | {
244 | "cell_type": "code",
245 | "execution_count": 38,
246 | "metadata": {
247 | "ExecuteTime": {
248 | "end_time": "2020-04-27T13:24:38.449924Z",
249 | "start_time": "2020-04-27T13:24:38.447907Z"
250 | }
251 | },
252 | "outputs": [],
253 | "source": [
254 | "#variabel yang digunakan pada pemisahan data ini\n",
255 | "X= df['path']\n",
256 | "y= df['tag']"
257 | ]
258 | },
259 | {
260 | "cell_type": "code",
261 | "execution_count": 39,
262 | "metadata": {
263 | "ExecuteTime": {
264 | "end_time": "2020-04-27T13:24:38.787271Z",
265 | "start_time": "2020-04-27T13:24:38.781487Z"
266 | }
267 | },
268 | "outputs": [],
269 | "source": [
270 | "# split dataset awal menjadi data train dan test\n",
271 | "X_train, X_test, y_train, y_test = train_test_split(\n",
272 | " X, y, test_size=0.20, random_state=300)"
273 | ]
274 | },
275 | {
276 | "cell_type": "code",
277 | "execution_count": 40,
278 | "metadata": {
279 | "ExecuteTime": {
280 | "end_time": "2020-04-27T13:24:38.946665Z",
281 | "start_time": "2020-04-27T13:24:38.942709Z"
282 | }
283 | },
284 | "outputs": [],
285 | "source": [
286 | "# kemudian data test dibagi menjadi 2 sehingga menjadi data test dan data validation.\n",
287 | "X_test, X_val, y_test, y_val = train_test_split(\n",
288 | " X_test, y_test, test_size=0.5, random_state=100)"
289 | ]
290 | },
291 | {
292 | "cell_type": "code",
293 | "execution_count": 41,
294 | "metadata": {
295 | "ExecuteTime": {
296 | "end_time": "2020-04-27T13:27:35.790033Z",
297 | "start_time": "2020-04-27T13:27:35.784677Z"
298 | }
299 | },
300 | "outputs": [],
301 | "source": [
302 | "# menyatukan kedalam masing-masing dataframe\n",
303 | "\n",
304 | "df_tr = pd.DataFrame({'path':X_train\n",
305 | " ,'tag':y_train\n",
306 | " ,'set':'train'})\n",
307 | "\n",
308 | "df_te = pd.DataFrame({'path':X_test\n",
309 | " ,'tag':y_test\n",
310 | " ,'set':'test'})\n",
311 | "\n",
312 | "df_val = pd.DataFrame({'path':X_val\n",
313 | " ,'tag':y_val\n",
314 | " ,'set':'validation'})"
315 | ]
316 | },
317 | {
318 | "cell_type": "code",
319 | "execution_count": 42,
320 | "metadata": {
321 | "ExecuteTime": {
322 | "end_time": "2020-04-27T13:27:36.006934Z",
323 | "start_time": "2020-04-27T13:27:36.004779Z"
324 | }
325 | },
326 | "outputs": [
327 | {
328 | "name": "stdout",
329 | "output_type": "stream",
330 | "text": [
331 | "train size 3453\n",
332 | "val size 432\n",
333 | "test size 432\n"
334 | ]
335 | }
336 | ],
337 | "source": [
338 | "print('train size', len(df_tr))\n",
339 | "print('val size', len(df_te))\n",
340 | "print('test size', len(df_val))"
341 | ]
342 | },
343 | {
344 | "cell_type": "code",
345 | "execution_count": 43,
346 | "metadata": {
347 | "ExecuteTime": {
348 | "end_time": "2020-04-27T13:45:04.988035Z",
349 | "start_time": "2020-04-27T13:45:04.977060Z"
350 | }
351 | },
352 | "outputs": [
353 | {
354 | "name": "stdout",
355 | "output_type": "stream",
356 | "text": [
357 | "===================================================== \n",
358 | "\n",
359 | "set tag \n",
360 | "test daisy 79\n",
361 | " dandelion 112\n",
362 | " rose 86\n",
363 | " sunflower 67\n",
364 | " tulip 88\n",
365 | "train daisy 608\n",
366 | " dandelion 834\n",
367 | " rose 614\n",
368 | " sunflower 602\n",
369 | " tulip 795\n",
370 | "validation daisy 77\n",
371 | " dandelion 106\n",
372 | " rose 84\n",
373 | " sunflower 64\n",
374 | " tulip 101\n",
375 | "dtype: int64 \n",
376 | "\n",
377 | "===================================================== \n",
378 | "\n"
379 | ]
380 | },
381 | {
382 | "data": {
383 | "text/html": [
384 | "\n",
385 | "\n",
398 | "
\n",
399 | " \n",
400 | " \n",
401 | " | \n",
402 | " path | \n",
403 | " tag | \n",
404 | " set | \n",
405 | "
\n",
406 | " \n",
407 | " \n",
408 | " \n",
409 | " | 489 | \n",
410 | " flowers/dandelion/5646743865_a8f20b60f7_n.jpg | \n",
411 | " dandelion | \n",
412 | " train | \n",
413 | "
\n",
414 | " \n",
415 | " | 1061 | \n",
416 | " flowers/rose/7456197696_7e1558cc22_n.jpg | \n",
417 | " rose | \n",
418 | " train | \n",
419 | "
\n",
420 | " \n",
421 | " | 2977 | \n",
422 | " flowers/rose/4684127262_6c3346188d.jpg | \n",
423 | " rose | \n",
424 | " train | \n",
425 | "
\n",
426 | " \n",
427 | "
\n",
428 | "
"
429 | ],
430 | "text/plain": [
431 | " path tag set\n",
432 | "489 flowers/dandelion/5646743865_a8f20b60f7_n.jpg dandelion train\n",
433 | "1061 flowers/rose/7456197696_7e1558cc22_n.jpg rose train\n",
434 | "2977 flowers/rose/4684127262_6c3346188d.jpg rose train"
435 | ]
436 | },
437 | "execution_count": 43,
438 | "metadata": {},
439 | "output_type": "execute_result"
440 | }
441 | ],
442 | "source": [
443 | "# melihat proporsi pada masing masing set apakah sudah ok atau masih ada yang ingin diubah\n",
444 | "df_all = df_tr.append([df_te,df_val]).reset_index(drop=1)\n",
445 | "\n",
446 | "print('===================================================== \\n')\n",
447 | "print(df_all.groupby(['set','tag']).size(),'\\n')\n",
448 | "\n",
449 | "print('===================================================== \\n')\n",
450 | "\n",
451 | "#cek sample datanya\n",
452 | "df_all.sample(3)"
453 | ]
454 | },
455 | {
456 | "cell_type": "markdown",
457 | "metadata": {},
458 | "source": [
459 | "# Merapihkan ke folder set masing-masing"
460 | ]
461 | },
462 | {
463 | "cell_type": "code",
464 | "execution_count": 44,
465 | "metadata": {
466 | "ExecuteTime": {
467 | "end_time": "2020-04-27T13:45:15.341975Z",
468 | "start_time": "2020-04-27T13:45:15.340307Z"
469 | }
470 | },
471 | "outputs": [],
472 | "source": [
473 | "# menghapus folder dataset jika diperlukan\n",
474 | "#!rm -rf dataset/"
475 | ]
476 | },
477 | {
478 | "cell_type": "code",
479 | "execution_count": 45,
480 | "metadata": {
481 | "ExecuteTime": {
482 | "end_time": "2020-04-27T13:45:15.523556Z",
483 | "start_time": "2020-04-27T13:45:15.521907Z"
484 | }
485 | },
486 | "outputs": [],
487 | "source": [
488 | "import shutil\n",
489 | "from tqdm.notebook import tqdm as tq"
490 | ]
491 | },
492 | {
493 | "cell_type": "code",
494 | "execution_count": 46,
495 | "metadata": {
496 | "ExecuteTime": {
497 | "end_time": "2020-04-27T13:45:17.315452Z",
498 | "start_time": "2020-04-27T13:45:17.313905Z"
499 | }
500 | },
501 | "outputs": [],
502 | "source": [
503 | "datasource_path = \"flowers/\"\n",
504 | "dataset_path = \"dataset/\""
505 | ]
506 | },
507 | {
508 | "cell_type": "code",
509 | "execution_count": 47,
510 | "metadata": {
511 | "ExecuteTime": {
512 | "end_time": "2020-04-27T13:45:21.624008Z",
513 | "start_time": "2020-04-27T13:45:20.037843Z"
514 | }
515 | },
516 | "outputs": [
517 | {
518 | "data": {
519 | "application/vnd.jupyter.widget-view+json": {
520 | "model_id": "af00a3fb45cc4508ab97605c19ad2caa",
521 | "version_major": 2,
522 | "version_minor": 0
523 | },
524 | "text/plain": [
525 | "0it [00:00, ?it/s]"
526 | ]
527 | },
528 | "metadata": {},
529 | "output_type": "display_data"
530 | }
531 | ],
532 | "source": [
533 | "for index, row in tq(df_all.iterrows(), ):\n",
534 | " \n",
535 | " #detect filepath\n",
536 | " file_path = row['path']\n",
537 | " if os.path.exists(file_path) == False:\n",
538 | " file_path = os.path.join(datasource_path,row['tag'],row['image'].split('.')[0]) \n",
539 | " \n",
540 | " #make folder destination dirs\n",
541 | " if os.path.exists(os.path.join(dataset_path,row['set'],row['tag'])) == False:\n",
542 | " os.makedirs(os.path.join(dataset_path,row['set'],row['tag']))\n",
543 | " \n",
544 | " #define file dest\n",
545 | " destination_file_name = file_path.split('/')[-1]\n",
546 | " file_dest = os.path.join(dataset_path,row['set'],row['tag'],destination_file_name)\n",
547 | " \n",
548 | " #copy file from source to dest\n",
549 | " if os.path.exists(file_dest) == False:\n",
550 | " shutil.copy2(file_path,file_dest)"
551 | ]
552 | },
553 | {
554 | "cell_type": "markdown",
555 | "metadata": {},
556 | "source": [
557 | "# Finish! Dataset siap digunakan "
558 | ]
559 | }
560 | ],
561 | "metadata": {
562 | "interpreter": {
563 | "hash": "ecf5722fdaf1897a315d257d89d94520bfcaa453217d5becf09b39e73618b0de"
564 | },
565 | "kernelspec": {
566 | "display_name": "Python [conda env:tf2]",
567 | "language": "python",
568 | "name": "python3"
569 | },
570 | "language_info": {
571 | "codemirror_mode": {
572 | "name": "ipython",
573 | "version": 3
574 | },
575 | "file_extension": ".py",
576 | "mimetype": "text/x-python",
577 | "name": "python",
578 | "nbconvert_exporter": "python",
579 | "pygments_lexer": "ipython3",
580 | "version": "3.9.5"
581 | },
582 | "toc": {
583 | "base_numbering": 1,
584 | "nav_menu": {},
585 | "number_sections": true,
586 | "sideBar": true,
587 | "skip_h1_title": false,
588 | "title_cell": "Table of Contents",
589 | "title_sidebar": "Contents",
590 | "toc_cell": false,
591 | "toc_position": {},
592 | "toc_section_display": true,
593 | "toc_window_display": true
594 | },
595 | "varInspector": {
596 | "cols": {
597 | "lenName": 16,
598 | "lenType": 16,
599 | "lenVar": 40
600 | },
601 | "kernels_config": {
602 | "python": {
603 | "delete_cmd_postfix": "",
604 | "delete_cmd_prefix": "del ",
605 | "library": "var_list.py",
606 | "varRefreshCmd": "print(var_dic_list())"
607 | },
608 | "r": {
609 | "delete_cmd_postfix": ") ",
610 | "delete_cmd_prefix": "rm(",
611 | "library": "var_list.r",
612 | "varRefreshCmd": "cat(var_dic_list()) "
613 | }
614 | },
615 | "types_to_exclude": [
616 | "module",
617 | "function",
618 | "builtin_function_or_method",
619 | "instance",
620 | "_Feature"
621 | ],
622 | "window_display": false
623 | }
624 | },
625 | "nbformat": 4,
626 | "nbformat_minor": 2
627 | }
628 |
--------------------------------------------------------------------------------
/2. Model Train.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# Membuat Classifier nya"
8 | ]
9 | },
10 | {
11 | "cell_type": "code",
12 | "execution_count": null,
13 | "metadata": {},
14 | "outputs": [],
15 | "source": [
16 | "# !pip install tensorflow\n",
17 | "# !pip install pillow"
18 | ]
19 | },
20 | {
21 | "cell_type": "code",
22 | "execution_count": 1,
23 | "metadata": {
24 | "ExecuteTime": {
25 | "end_time": "2020-04-27T23:07:41.569964Z",
26 | "start_time": "2020-04-27T23:07:29.039041Z"
27 | }
28 | },
29 | "outputs": [],
30 | "source": [
31 | "import tensorflow as tf"
32 | ]
33 | },
34 | {
35 | "cell_type": "code",
36 | "execution_count": 2,
37 | "metadata": {
38 | "ExecuteTime": {
39 | "end_time": "2020-04-28T00:15:16.601007Z",
40 | "start_time": "2020-04-28T00:15:16.598774Z"
41 | }
42 | },
43 | "outputs": [],
44 | "source": [
45 | "# Define Input Parameters\n",
46 | "dim = (160, 160)\n",
47 | "# dim = (456, 456)\n",
48 | "channel = (3, )\n",
49 | "input_shape = dim + channel\n",
50 | "\n",
51 | "#batch size\n",
52 | "batch_size = 16\n",
53 | "\n",
54 | "#Epoch\n",
55 | "epoch = 10"
56 | ]
57 | },
58 | {
59 | "cell_type": "markdown",
60 | "metadata": {},
61 | "source": [
62 | "# Membuat dataset generator"
63 | ]
64 | },
65 | {
66 | "cell_type": "code",
67 | "execution_count": 3,
68 | "metadata": {
69 | "ExecuteTime": {
70 | "end_time": "2020-04-27T23:07:41.609100Z",
71 | "start_time": "2020-04-27T23:07:41.582485Z"
72 | }
73 | },
74 | "outputs": [],
75 | "source": [
76 | "from tensorflow.keras.preprocessing.image import ImageDataGenerator"
77 | ]
78 | },
79 | {
80 | "cell_type": "markdown",
81 | "metadata": {},
82 | "source": [
83 | "## Mendefinisikan Data Generatornya"
84 | ]
85 | },
86 | {
87 | "cell_type": "code",
88 | "execution_count": 4,
89 | "metadata": {
90 | "ExecuteTime": {
91 | "end_time": "2020-04-27T23:07:41.619545Z",
92 | "start_time": "2020-04-27T23:07:41.614388Z"
93 | }
94 | },
95 | "outputs": [],
96 | "source": [
97 | "train_datagen = ImageDataGenerator(rescale=1. / 255,\n",
98 | " shear_range=0.2,\n",
99 | " zoom_range=0.2,\n",
100 | " horizontal_flip=True)\n",
101 | "\n",
102 | "val_datagen = ImageDataGenerator(rescale=1. / 255,\n",
103 | " shear_range=0.2,\n",
104 | " zoom_range=0.2,\n",
105 | " horizontal_flip=True)\n",
106 | "\n",
107 | "test_datagen = ImageDataGenerator(rescale=1. / 255,\n",
108 | " shear_range=0.2,\n",
109 | " zoom_range=0.2,\n",
110 | " horizontal_flip=True)"
111 | ]
112 | },
113 | {
114 | "cell_type": "markdown",
115 | "metadata": {},
116 | "source": [
117 | "## Mendefinisikan asal folder sumber file berasal"
118 | ]
119 | },
120 | {
121 | "cell_type": "code",
122 | "execution_count": 5,
123 | "metadata": {
124 | "ExecuteTime": {
125 | "end_time": "2020-04-28T03:55:43.409949Z",
126 | "start_time": "2020-04-28T03:55:43.090028Z"
127 | },
128 | "scrolled": false
129 | },
130 | "outputs": [
131 | {
132 | "name": "stdout",
133 | "output_type": "stream",
134 | "text": [
135 | "Found 3453 images belonging to 5 classes.\n",
136 | "Found 432 images belonging to 5 classes.\n",
137 | "Found 432 images belonging to 5 classes.\n"
138 | ]
139 | }
140 | ],
141 | "source": [
142 | "# binary = [1,0,0,0,0] [0,1,0,0,0] [0,0,1,0,0] [0,0,0,1,0] [0,0,0,0,1]\n",
143 | "# categorical = 1,2,3,4,5\n",
144 | "\n",
145 | "train_generator = train_datagen.flow_from_directory('dataset/train/',\n",
146 | " target_size=dim,\n",
147 | " batch_size=batch_size,\n",
148 | " class_mode='categorical',\n",
149 | " shuffle=True)\n",
150 | "\n",
151 | "val_generator = val_datagen.flow_from_directory('dataset/validation/',\n",
152 | " target_size=dim,\n",
153 | " batch_size=batch_size,\n",
154 | " class_mode='categorical',\n",
155 | " shuffle=True)\n",
156 | "\n",
157 | "test_generator = test_datagen.flow_from_directory('dataset/test/',\n",
158 | " target_size=dim,\n",
159 | " batch_size=batch_size,\n",
160 | " class_mode='categorical',\n",
161 | " shuffle=True)\n",
162 | "\n",
163 | "num_class = test_generator.num_classes\n",
164 | "labels = train_generator.class_indices.keys()"
165 | ]
166 | },
167 | {
168 | "cell_type": "code",
169 | "execution_count": 6,
170 | "metadata": {
171 | "ExecuteTime": {
172 | "end_time": "2020-04-28T03:55:48.345523Z",
173 | "start_time": "2020-04-28T03:55:48.343497Z"
174 | },
175 | "run_control": {
176 | "marked": true
177 | }
178 | },
179 | "outputs": [
180 | {
181 | "name": "stdout",
182 | "output_type": "stream",
183 | "text": [
184 | "dict_keys(['daisy', 'dandelion', 'rose', 'sunflower', 'tulip'])\n"
185 | ]
186 | }
187 | ],
188 | "source": [
189 | "print(labels)"
190 | ]
191 | },
192 | {
193 | "cell_type": "markdown",
194 | "metadata": {},
195 | "source": [
196 | "## Membuat tf.data untuk kompabilitas yang lebih baik untuk tensorflow 2.1 (tf.keras)"
197 | ]
198 | },
199 | {
200 | "cell_type": "code",
201 | "execution_count": 7,
202 | "metadata": {
203 | "ExecuteTime": {
204 | "end_time": "2020-04-27T23:07:42.164380Z",
205 | "start_time": "2020-04-27T23:07:42.161649Z"
206 | }
207 | },
208 | "outputs": [],
209 | "source": [
210 | "def tf_data_generator(generator, input_shape):\n",
211 | " num_class = generator.num_classes\n",
212 | " tf_generator = tf.data.Dataset.from_generator(\n",
213 | " lambda: generator,\n",
214 | " output_types=(tf.float32, tf.float32),\n",
215 | " output_shapes=([None\n",
216 | " , input_shape[0]\n",
217 | " , input_shape[1]\n",
218 | " , input_shape[2]]\n",
219 | " ,[None, num_class])\n",
220 | " )\n",
221 | " return tf_generator"
222 | ]
223 | },
224 | {
225 | "cell_type": "code",
226 | "execution_count": 8,
227 | "metadata": {
228 | "ExecuteTime": {
229 | "end_time": "2020-04-27T23:07:42.240950Z",
230 | "start_time": "2020-04-27T23:07:42.168871Z"
231 | }
232 | },
233 | "outputs": [],
234 | "source": [
235 | "train_data = tf_data_generator(train_generator, input_shape)\n",
236 | "test_data = tf_data_generator(test_generator, input_shape)\n",
237 | "val_data = tf_data_generator(val_generator, input_shape)"
238 | ]
239 | },
240 | {
241 | "cell_type": "markdown",
242 | "metadata": {},
243 | "source": [
244 | "# Membuat Struktur CNN"
245 | ]
246 | },
247 | {
248 | "cell_type": "markdown",
249 | "metadata": {},
250 | "source": [
251 | "## Manualy define network"
252 | ]
253 | },
254 | {
255 | "cell_type": "code",
256 | "execution_count": 9,
257 | "metadata": {
258 | "ExecuteTime": {
259 | "end_time": "2020-04-05T01:02:52.135221Z",
260 | "start_time": "2020-04-05T01:02:52.132534Z"
261 | }
262 | },
263 | "outputs": [],
264 | "source": [
265 | "from tensorflow.keras import layers, Sequential\n",
266 | "from tensorflow.keras.models import Model\n",
267 | "from tensorflow.keras.layers import Conv2D, Activation, MaxPooling2D, Dropout, Flatten, Dense"
268 | ]
269 | },
270 | {
271 | "cell_type": "code",
272 | "execution_count": 10,
273 | "metadata": {
274 | "ExecuteTime": {
275 | "end_time": "2020-04-05T01:02:53.626958Z",
276 | "start_time": "2020-04-05T01:02:53.225773Z"
277 | }
278 | },
279 | "outputs": [
280 | {
281 | "name": "stdout",
282 | "output_type": "stream",
283 | "text": [
284 | "Compiling Model.......\n"
285 | ]
286 | }
287 | ],
288 | "source": [
289 | "model = Sequential()\n",
290 | "model.add(Conv2D(128, (3, 3), padding='same', input_shape=input_shape))\n",
291 | "\n",
292 | "model.add(Activation('relu'))\n",
293 | "model.add(Conv2D(32, (3, 3)))\n",
294 | "model.add(Activation('relu'))\n",
295 | "model.add(MaxPooling2D(pool_size=(2, 2)))\n",
296 | "model.add(Dropout(0.25))\n",
297 | "\n",
298 | "model.add(Conv2D(64, (3, 3), padding='same'))\n",
299 | "model.add(Activation('relu'))\n",
300 | "model.add(Conv2D(64, (3, 3)))\n",
301 | "model.add(Activation('relu'))\n",
302 | "model.add(MaxPooling2D(pool_size=(2, 2)))\n",
303 | "model.add(Dropout(0.25))\n",
304 | "\n",
305 | "model.add(Flatten())\n",
306 | "model.add(Dense(512))\n",
307 | "model.add(Activation('relu'))\n",
308 | "model.add(Dropout(0.5))\n",
309 | "model.add(Dense(num_class))\n",
310 | "model.add(Activation('softmax'))\n",
311 | "\n",
312 | "# Compile the model\n",
313 | "print('Compiling Model.......')\n",
314 | "model.compile(optimizer='adam',\n",
315 | " loss='categorical_crossentropy',\n",
316 | " metrics=['accuracy'])"
317 | ]
318 | },
319 | {
320 | "cell_type": "code",
321 | "execution_count": 11,
322 | "metadata": {
323 | "ExecuteTime": {
324 | "end_time": "2020-04-05T01:02:53.916849Z",
325 | "start_time": "2020-04-05T01:02:53.915340Z"
326 | },
327 | "scrolled": true
328 | },
329 | "outputs": [
330 | {
331 | "name": "stdout",
332 | "output_type": "stream",
333 | "text": [
334 | "Model: \"sequential\"\n",
335 | "_________________________________________________________________\n",
336 | " Layer (type) Output Shape Param # \n",
337 | "=================================================================\n",
338 | " conv2d (Conv2D) (None, 160, 160, 128) 3584 \n",
339 | " \n",
340 | " activation (Activation) (None, 160, 160, 128) 0 \n",
341 | " \n",
342 | " conv2d_1 (Conv2D) (None, 158, 158, 32) 36896 \n",
343 | " \n",
344 | " activation_1 (Activation) (None, 158, 158, 32) 0 \n",
345 | " \n",
346 | " max_pooling2d (MaxPooling2D (None, 79, 79, 32) 0 \n",
347 | " ) \n",
348 | " \n",
349 | " dropout (Dropout) (None, 79, 79, 32) 0 \n",
350 | " \n",
351 | " conv2d_2 (Conv2D) (None, 79, 79, 64) 18496 \n",
352 | " \n",
353 | " activation_2 (Activation) (None, 79, 79, 64) 0 \n",
354 | " \n",
355 | " conv2d_3 (Conv2D) (None, 77, 77, 64) 36928 \n",
356 | " \n",
357 | " activation_3 (Activation) (None, 77, 77, 64) 0 \n",
358 | " \n",
359 | " max_pooling2d_1 (MaxPooling (None, 38, 38, 64) 0 \n",
360 | " 2D) \n",
361 | " \n",
362 | " dropout_1 (Dropout) (None, 38, 38, 64) 0 \n",
363 | " \n",
364 | " flatten (Flatten) (None, 92416) 0 \n",
365 | " \n",
366 | " dense (Dense) (None, 512) 47317504 \n",
367 | " \n",
368 | " activation_4 (Activation) (None, 512) 0 \n",
369 | " \n",
370 | " dropout_2 (Dropout) (None, 512) 0 \n",
371 | " \n",
372 | " dense_1 (Dense) (None, 5) 2565 \n",
373 | " \n",
374 | " activation_5 (Activation) (None, 5) 0 \n",
375 | " \n",
376 | "=================================================================\n",
377 | "Total params: 47,415,973\n",
378 | "Trainable params: 47,415,973\n",
379 | "Non-trainable params: 0\n",
380 | "_________________________________________________________________\n"
381 | ]
382 | }
383 | ],
384 | "source": [
385 | "model.summary()"
386 | ]
387 | },
388 | {
389 | "cell_type": "code",
390 | "execution_count": null,
391 | "metadata": {},
392 | "outputs": [],
393 | "source": []
394 | },
395 | {
396 | "cell_type": "markdown",
397 | "metadata": {},
398 | "source": [
399 | "## Using Pre-trained model / Transfer Learning"
400 | ]
401 | },
402 | {
403 | "cell_type": "markdown",
404 | "metadata": {},
405 | "source": [
406 | "### Build Base Model (MobileNetV2)"
407 | ]
408 | },
409 | {
410 | "cell_type": "code",
411 | "execution_count": 12,
412 | "metadata": {
413 | "ExecuteTime": {
414 | "end_time": "2020-04-28T00:15:21.324641Z",
415 | "start_time": "2020-04-28T00:15:19.861604Z"
416 | }
417 | },
418 | "outputs": [],
419 | "source": [
420 | "from tensorflow.keras.applications import MobileNetV2\n",
421 | "\n",
422 | "# get base models\n",
423 | "base_model = MobileNetV2(\n",
424 | " input_shape= input_shape,\n",
425 | " include_top=False,\n",
426 | " weights='imagenet',\n",
427 | " classes=num_class,\n",
428 | ")"
429 | ]
430 | },
431 | {
432 | "cell_type": "markdown",
433 | "metadata": {},
434 | "source": [
435 | "### Add top layer network"
436 | ]
437 | },
438 | {
439 | "cell_type": "code",
440 | "execution_count": 13,
441 | "metadata": {
442 | "ExecuteTime": {
443 | "end_time": "2020-04-28T00:15:22.439171Z",
444 | "start_time": "2020-04-28T00:15:22.437438Z"
445 | }
446 | },
447 | "outputs": [],
448 | "source": [
449 | "from tensorflow.keras import layers,Sequential\n",
450 | "from tensorflow.keras.models import Model"
451 | ]
452 | },
453 | {
454 | "cell_type": "code",
455 | "execution_count": 14,
456 | "metadata": {
457 | "ExecuteTime": {
458 | "end_time": "2020-04-28T00:15:34.516170Z",
459 | "start_time": "2020-04-28T00:15:34.476569Z"
460 | }
461 | },
462 | "outputs": [],
463 | "source": [
464 | "#Adding custom layers\n",
465 | "x = base_model.output\n",
466 | "x = layers.GlobalAveragePooling2D()(x)\n",
467 | "x = layers.Dropout(0.2)(x)\n",
468 | "x = layers.Dense(1024, activation=\"relu\")(x)\n",
469 | "\n",
470 | "predictions = layers.Dense(num_class, activation=\"softmax\")(x)\n",
471 | "model = Model(inputs=base_model.input, outputs=predictions)"
472 | ]
473 | },
474 | {
475 | "cell_type": "code",
476 | "execution_count": null,
477 | "metadata": {
478 | "ExecuteTime": {
479 | "end_time": "2020-04-28T00:15:35.928198Z",
480 | "start_time": "2020-04-28T00:15:35.905552Z"
481 | }
482 | },
483 | "outputs": [],
484 | "source": [
485 | "model.summary()"
486 | ]
487 | },
488 | {
489 | "cell_type": "code",
490 | "execution_count": 15,
491 | "metadata": {
492 | "ExecuteTime": {
493 | "end_time": "2020-04-28T00:15:39.773224Z",
494 | "start_time": "2020-04-28T00:15:39.741303Z"
495 | }
496 | },
497 | "outputs": [
498 | {
499 | "name": "stdout",
500 | "output_type": "stream",
501 | "text": [
502 | "Compiling Model.......\n"
503 | ]
504 | }
505 | ],
506 | "source": [
507 | "# Compile the model\n",
508 | "print('Compiling Model.......')\n",
509 | "model.compile(optimizer='adam',\n",
510 | " loss='categorical_crossentropy',\n",
511 | " metrics=['accuracy'])"
512 | ]
513 | },
514 | {
515 | "cell_type": "code",
516 | "execution_count": null,
517 | "metadata": {},
518 | "outputs": [],
519 | "source": []
520 | },
521 | {
522 | "cell_type": "markdown",
523 | "metadata": {},
524 | "source": [
525 | "## Effinet"
526 | ]
527 | },
528 | {
529 | "cell_type": "code",
530 | "execution_count": null,
531 | "metadata": {
532 | "ExecuteTime": {
533 | "end_time": "2020-04-05T00:46:28.470103Z",
534 | "start_time": "2020-04-05T00:46:28.468004Z"
535 | }
536 | },
537 | "outputs": [],
538 | "source": [
539 | "# !pip install -U --pre efficientnet"
540 | ]
541 | },
542 | {
543 | "cell_type": "code",
544 | "execution_count": null,
545 | "metadata": {
546 | "ExecuteTime": {
547 | "end_time": "2020-04-28T00:06:42.639757Z",
548 | "start_time": "2020-04-28T00:06:41.172821Z"
549 | }
550 | },
551 | "outputs": [],
552 | "source": [
553 | "from efficientnet.tfkeras import EfficientNetB1"
554 | ]
555 | },
556 | {
557 | "cell_type": "markdown",
558 | "metadata": {},
559 | "source": [
560 | "### Build Base model"
561 | ]
562 | },
563 | {
564 | "cell_type": "code",
565 | "execution_count": null,
566 | "metadata": {
567 | "ExecuteTime": {
568 | "end_time": "2020-04-28T00:06:45.748689Z",
569 | "start_time": "2020-04-28T00:06:43.400861Z"
570 | }
571 | },
572 | "outputs": [],
573 | "source": [
574 | "# get base models\n",
575 | "base_model = EfficientNetB1(\n",
576 | " input_shape=input_shape,\n",
577 | " include_top=False,\n",
578 | " weights='noisy-student',\n",
579 | " classes=num_class,\n",
580 | ")"
581 | ]
582 | },
583 | {
584 | "cell_type": "markdown",
585 | "metadata": {},
586 | "source": [
587 | "### Add top network layer to models"
588 | ]
589 | },
590 | {
591 | "cell_type": "code",
592 | "execution_count": null,
593 | "metadata": {
594 | "ExecuteTime": {
595 | "end_time": "2020-04-28T00:06:49.522922Z",
596 | "start_time": "2020-04-28T00:06:49.521182Z"
597 | }
598 | },
599 | "outputs": [],
600 | "source": [
601 | "from tensorflow.keras import layers,Sequential\n",
602 | "from tensorflow.keras.models import Model"
603 | ]
604 | },
605 | {
606 | "cell_type": "code",
607 | "execution_count": null,
608 | "metadata": {
609 | "ExecuteTime": {
610 | "end_time": "2020-04-28T00:06:50.134891Z",
611 | "start_time": "2020-04-28T00:06:50.083642Z"
612 | }
613 | },
614 | "outputs": [],
615 | "source": [
616 | "#Adding custom layers\n",
617 | "x = base_model.output\n",
618 | "x = layers.GlobalAveragePooling2D()(x)\n",
619 | "x = layers.Dropout(0.5)(x)\n",
620 | "x = layers.Dense(1024, activation=\"relu\")(x)\n",
621 | "\n",
622 | "predictions = layers.Dense(num_class, activation=\"softmax\")(x)\n",
623 | "model = Model(inputs=base_model.input, outputs=predictions)"
624 | ]
625 | },
626 | {
627 | "cell_type": "code",
628 | "execution_count": null,
629 | "metadata": {
630 | "ExecuteTime": {
631 | "end_time": "2020-04-28T00:06:50.996500Z",
632 | "start_time": "2020-04-28T00:06:50.950395Z"
633 | }
634 | },
635 | "outputs": [],
636 | "source": [
637 | "model.summary()"
638 | ]
639 | },
640 | {
641 | "cell_type": "code",
642 | "execution_count": null,
643 | "metadata": {
644 | "ExecuteTime": {
645 | "end_time": "2020-04-28T00:06:52.601344Z",
646 | "start_time": "2020-04-28T00:06:52.558985Z"
647 | }
648 | },
649 | "outputs": [],
650 | "source": [
651 | "# Compile the model\n",
652 | "print('Compiling Model.......')\n",
653 | "model.compile(optimizer='adam',\n",
654 | " loss='categorical_crossentropy',\n",
655 | " metrics=['accuracy'])"
656 | ]
657 | },
658 | {
659 | "cell_type": "code",
660 | "execution_count": null,
661 | "metadata": {},
662 | "outputs": [],
663 | "source": []
664 | },
665 | {
666 | "cell_type": "markdown",
667 | "metadata": {},
668 | "source": [
669 | "## Visualize The final model"
670 | ]
671 | },
672 | {
673 | "cell_type": "code",
674 | "execution_count": 16,
675 | "metadata": {
676 | "ExecuteTime": {
677 | "end_time": "2020-04-28T00:06:55.440845Z",
678 | "start_time": "2020-04-28T00:06:55.439197Z"
679 | }
680 | },
681 | "outputs": [],
682 | "source": [
683 | "import tensorflow as tf"
684 | ]
685 | },
686 | {
687 | "cell_type": "code",
688 | "execution_count": null,
689 | "metadata": {
690 | "ExecuteTime": {
691 | "end_time": "2020-04-28T00:06:58.089548Z",
692 | "start_time": "2020-04-28T00:06:56.350302Z"
693 | },
694 | "scrolled": true
695 | },
696 | "outputs": [],
697 | "source": [
698 | "model_viz = tf.keras.utils.plot_model(model,\n",
699 | " to_file='model.png',\n",
700 | " show_shapes=True,\n",
701 | " show_layer_names=True,\n",
702 | " rankdir='TB',\n",
703 | " expand_nested=True,\n",
704 | " dpi=55)\n",
705 | "model_viz"
706 | ]
707 | },
708 | {
709 | "cell_type": "code",
710 | "execution_count": null,
711 | "metadata": {},
712 | "outputs": [],
713 | "source": []
714 | },
715 | {
716 | "cell_type": "markdown",
717 | "metadata": {},
718 | "source": [
719 | "# Train Model"
720 | ]
721 | },
722 | {
723 | "cell_type": "code",
724 | "execution_count": 17,
725 | "metadata": {
726 | "ExecuteTime": {
727 | "end_time": "2020-04-28T04:27:13.684881Z",
728 | "start_time": "2020-04-28T04:27:13.683143Z"
729 | }
730 | },
731 | "outputs": [],
732 | "source": [
733 | "EPOCH = 2"
734 | ]
735 | },
736 | {
737 | "cell_type": "code",
738 | "execution_count": 18,
739 | "metadata": {
740 | "ExecuteTime": {
741 | "end_time": "2020-04-28T04:43:10.762055Z",
742 | "start_time": "2020-04-28T04:27:14.129033Z"
743 | }
744 | },
745 | "outputs": [
746 | {
747 | "name": "stdout",
748 | "output_type": "stream",
749 | "text": [
750 | "Epoch 1/2\n",
751 | "216/216 [==============================] - 164s 738ms/step - loss: 0.7961 - accuracy: 0.7359 - val_loss: 7.3778 - val_accuracy: 0.3472\n",
752 | "Epoch 2/2\n",
753 | "216/216 [==============================] - 140s 646ms/step - loss: 0.5758 - accuracy: 0.8083 - val_loss: 6.2847 - val_accuracy: 0.4398\n"
754 | ]
755 | }
756 | ],
757 | "source": [
758 | "history = model.fit(x=train_data,\n",
759 | " steps_per_epoch=len(train_generator),\n",
760 | " epochs=EPOCH,\n",
761 | " validation_data=val_data,\n",
762 | " validation_steps=len(val_generator), \n",
763 | " shuffle=True,\n",
764 | " verbose = 1)"
765 | ]
766 | },
767 | {
768 | "cell_type": "code",
769 | "execution_count": 19,
770 | "metadata": {
771 | "ExecuteTime": {
772 | "end_time": "2020-04-28T04:49:58.925288Z",
773 | "start_time": "2020-04-28T04:49:58.922875Z"
774 | }
775 | },
776 | "outputs": [
777 | {
778 | "data": {
779 | "text/plain": [
780 | "[0.7961055040359497, 0.5758333206176758]"
781 | ]
782 | },
783 | "execution_count": 19,
784 | "metadata": {},
785 | "output_type": "execute_result"
786 | }
787 | ],
788 | "source": [
789 | "history.history['loss']"
790 | ]
791 | },
792 | {
793 | "cell_type": "code",
794 | "execution_count": 20,
795 | "metadata": {
796 | "ExecuteTime": {
797 | "end_time": "2020-04-28T04:49:59.293485Z",
798 | "start_time": "2020-04-28T04:49:59.291038Z"
799 | }
800 | },
801 | "outputs": [
802 | {
803 | "data": {
804 | "text/plain": [
805 | "[0.7358818650245667, 0.8082826733589172]"
806 | ]
807 | },
808 | "execution_count": 20,
809 | "metadata": {},
810 | "output_type": "execute_result"
811 | }
812 | ],
813 | "source": [
814 | "history.history['accuracy']"
815 | ]
816 | },
817 | {
818 | "cell_type": "markdown",
819 | "metadata": {},
820 | "source": [
821 | "# Plot the training"
822 | ]
823 | },
824 | {
825 | "cell_type": "code",
826 | "execution_count": 21,
827 | "metadata": {
828 | "ExecuteTime": {
829 | "end_time": "2020-04-28T04:50:02.171980Z",
830 | "start_time": "2020-04-28T04:50:02.170248Z"
831 | }
832 | },
833 | "outputs": [],
834 | "source": [
835 | "from matplotlib import pyplot as plt"
836 | ]
837 | },
838 | {
839 | "cell_type": "code",
840 | "execution_count": 22,
841 | "metadata": {
842 | "ExecuteTime": {
843 | "end_time": "2020-04-28T04:50:02.464233Z",
844 | "start_time": "2020-04-28T04:50:02.361846Z"
845 | }
846 | },
847 | "outputs": [
848 | {
849 | "data": {
850 | "image/png": "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",
851 | "text/plain": [
852 | ""
853 | ]
854 | },
855 | "metadata": {
856 | "needs_background": "light"
857 | },
858 | "output_type": "display_data"
859 | }
860 | ],
861 | "source": [
862 | "# Plot history: MAE\n",
863 | "plt.plot(history.history['loss'], label='Training Loss')\n",
864 | "plt.plot(history.history['val_loss'], label='Validation Loss')\n",
865 | "plt.title('Training and Validation Loss')\n",
866 | "plt.ylabel('value')\n",
867 | "plt.xlabel('No. epoch')\n",
868 | "plt.legend(loc=\"upper left\")\n",
869 | "plt.show()"
870 | ]
871 | },
872 | {
873 | "cell_type": "code",
874 | "execution_count": 23,
875 | "metadata": {
876 | "ExecuteTime": {
877 | "end_time": "2020-04-28T04:50:03.056913Z",
878 | "start_time": "2020-04-28T04:50:02.958192Z"
879 | }
880 | },
881 | "outputs": [
882 | {
883 | "data": {
884 | "image/png": "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H1OnTuWUU07hjDPOaBLfT37yE3r16sX777/Phx9+yHe+8x1WrVpFeXk5V1xxBdOnTwfgqaee4tprr6W6upqCggKeffZZhgwZwmuvvUafPn2oqalh8ODBvP7663VXWCLtrbyymnVl22PO4reHDXtsQ7+dzdurmry2W5d09uyeTd/uWQwb0JM9umfTNy+LPXuEjXxesC47Mz0FR1YvmadrI4Hl7r4CwMzmAxOA2ETgQPdwugfBo/d2yc8ff49ln23a1d00cNDe3fnZtw/e4deVlpby2muvkZ6ezqZNm3jllVfIyMjgueee49prr+XRRx9t8pr333+fF198kbKyMoYMGcKll17a5D74t99+m/fee4+9996bMWPG8Oqrr1JUVMQll1zCyy+/zMCBA5k8eXKzcT344INMnjyZCRMmcO2111JZWUlmZiaXX345Rx99NI899hjV1dVs3ryZ9957jxtvvJHXXnuNgoICvvzyy1aPe+nSpbz77rt1t23efffd9O7dm23btjFixAhOP/10ampqmDZtWl28X375JWlpaZx77rk88MADzJgxg+eee46hQ4cqCUhSVFbX8MXm7azeGDbuZTGNe+1ZfVk5G7ZWNnltl4y04Ew9L5sD9+zO0YOzGpy91/7kZnWMK+JkRrkPsCpmvhQY1WibmcAzZnYZkAMcH29HZjYdmA4wYMCANg80WSZOnEh6epDpN27cyJQpU/joo48wMyorm/5xAZx88slkZWWRlZVF3759WbNmDf369WuwzciRI+uWff3rX6ekpITc3Fz222+/usZ38uTJzJkzp8n+KyoqWLRoEb/5zW/Iy8tj1KhRPP3005xyyim88MILzJsXPLI3PT2dHj16MG/ePCZOnEhBQQEAvXv3bvW4R44c2eDe/VtvvZXHHnsMgFWrVvHRRx+xbt06jjrqqLrtavd74YUXMmHCBGbMmMHdd9/NBRdc0Or7icSK7Wht0LDHdLqu2bSd9Vu20/hxLOlpRt+8LPp2z2bf/G6MHNibPboH83t0z2bPsLHv0TWzU92Vlup0NRmY6+6/NrMjgPvM7BB3b1BEc/c5wByAoqKiFp+kszNn7smSk5NTN/2Tn/yEY445hscee4ySkhLGjh0b9zVZWVl10+np6VRVNb3cTGSb5jz99NNs2LCBQw89FICtW7fStWtXTjnllIT3AZCRkUFNTfBr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",
885 | "text/plain": [
886 | ""
887 | ]
888 | },
889 | "metadata": {
890 | "needs_background": "light"
891 | },
892 | "output_type": "display_data"
893 | }
894 | ],
895 | "source": [
896 | "# Plot history: MSE\n",
897 | "plt.plot(history.history['accuracy'], label='Training Accuracy')\n",
898 | "plt.plot(history.history['val_accuracy'], label='Validation Accuracy')\n",
899 | "plt.title('Training and Validation Accuracy')\n",
900 | "plt.ylabel('value')\n",
901 | "plt.xlabel('No. epoch')\n",
902 | "plt.legend(loc=\"upper left\")\n",
903 | "plt.show()"
904 | ]
905 | },
906 | {
907 | "cell_type": "markdown",
908 | "metadata": {},
909 | "source": [
910 | "# Save Model"
911 | ]
912 | },
913 | {
914 | "cell_type": "code",
915 | "execution_count": 24,
916 | "metadata": {
917 | "ExecuteTime": {
918 | "end_time": "2020-04-28T04:50:05.626011Z",
919 | "start_time": "2020-04-28T04:50:05.624348Z"
920 | }
921 | },
922 | "outputs": [],
923 | "source": [
924 | "import os"
925 | ]
926 | },
927 | {
928 | "cell_type": "code",
929 | "execution_count": 26,
930 | "metadata": {
931 | "ExecuteTime": {
932 | "end_time": "2020-04-28T04:50:15.324841Z",
933 | "start_time": "2020-04-28T04:50:15.176405Z"
934 | }
935 | },
936 | "outputs": [
937 | {
938 | "name": "stdout",
939 | "output_type": "stream",
940 | "text": [
941 | "Saving Model At model\\medium_project\\model.h5...\n"
942 | ]
943 | }
944 | ],
945 | "source": [
946 | "MODEL_BASE_PATH = \"model\"\n",
947 | "PROJECT_NAME = \"medium_project\"\n",
948 | "SAVE_MODEL_NAME = \"model.h5\"\n",
949 | "save_model_path = os.path.join(MODEL_BASE_PATH, PROJECT_NAME, SAVE_MODEL_NAME)\n",
950 | "\n",
951 | "if os.path.exists(os.path.join(MODEL_BASE_PATH, PROJECT_NAME)) == False:\n",
952 | " os.makedirs(os.path.join(MODEL_BASE_PATH, PROJECT_NAME))\n",
953 | " \n",
954 | "print('Saving Model At {}...'.format(save_model_path))\n",
955 | "model.save(save_model_path,include_optimizer=False) \n",
956 | " "
957 | ]
958 | },
959 | {
960 | "cell_type": "markdown",
961 | "metadata": {},
962 | "source": [
963 | "# Evaluate Models"
964 | ]
965 | },
966 | {
967 | "cell_type": "code",
968 | "execution_count": 28,
969 | "metadata": {
970 | "ExecuteTime": {
971 | "end_time": "2020-04-28T01:13:52.722441Z",
972 | "start_time": "2020-04-28T01:13:40.664164Z"
973 | }
974 | },
975 | "outputs": [
976 | {
977 | "name": "stdout",
978 | "output_type": "stream",
979 | "text": [
980 | "Accuracy on training data: 0.4500 \n",
981 | "Loss on training data: 6.3208 \n",
982 | "\n",
983 | "Accuracy on test data: 0.4329 \n",
984 | "Loss on test data: 6.3644 \n",
985 | "\n"
986 | ]
987 | }
988 | ],
989 | "source": [
990 | "loss, acc = model.evaluate(train_data, steps=len(train_generator), verbose=0)\n",
991 | "print('Accuracy on training data: {:.4f} \\nLoss on training data: {:.4f}'.format(acc,loss),'\\n')\n",
992 | " \n",
993 | "loss, acc = model.evaluate(test_data, steps=len(test_generator), verbose=0)\n",
994 | "print('Accuracy on test data: {:.4f} \\nLoss on test data: {:.4f}'.format(acc,loss),'\\n') "
995 | ]
996 | },
997 | {
998 | "cell_type": "code",
999 | "execution_count": null,
1000 | "metadata": {},
1001 | "outputs": [],
1002 | "source": []
1003 | }
1004 | ],
1005 | "metadata": {
1006 | "interpreter": {
1007 | "hash": "ecf5722fdaf1897a315d257d89d94520bfcaa453217d5becf09b39e73618b0de"
1008 | },
1009 | "kernelspec": {
1010 | "display_name": "Python [conda env:tf2]",
1011 | "language": "python",
1012 | "name": "python3"
1013 | },
1014 | "language_info": {
1015 | "codemirror_mode": {
1016 | "name": "ipython",
1017 | "version": 3
1018 | },
1019 | "file_extension": ".py",
1020 | "mimetype": "text/x-python",
1021 | "name": "python",
1022 | "nbconvert_exporter": "python",
1023 | "pygments_lexer": "ipython3",
1024 | "version": "3.9.5"
1025 | },
1026 | "toc": {
1027 | "base_numbering": 1,
1028 | "nav_menu": {},
1029 | "number_sections": true,
1030 | "sideBar": true,
1031 | "skip_h1_title": false,
1032 | "title_cell": "Table of Contents",
1033 | "title_sidebar": "Contents",
1034 | "toc_cell": false,
1035 | "toc_position": {
1036 | "height": "calc(100% - 180px)",
1037 | "left": "10px",
1038 | "top": "150px",
1039 | "width": "409.6px"
1040 | },
1041 | "toc_section_display": true,
1042 | "toc_window_display": true
1043 | },
1044 | "varInspector": {
1045 | "cols": {
1046 | "lenName": 16,
1047 | "lenType": 16,
1048 | "lenVar": 40
1049 | },
1050 | "kernels_config": {
1051 | "python": {
1052 | "delete_cmd_postfix": "",
1053 | "delete_cmd_prefix": "del ",
1054 | "library": "var_list.py",
1055 | "varRefreshCmd": "print(var_dic_list())"
1056 | },
1057 | "r": {
1058 | "delete_cmd_postfix": ") ",
1059 | "delete_cmd_prefix": "rm(",
1060 | "library": "var_list.r",
1061 | "varRefreshCmd": "cat(var_dic_list()) "
1062 | }
1063 | },
1064 | "types_to_exclude": [
1065 | "module",
1066 | "function",
1067 | "builtin_function_or_method",
1068 | "instance",
1069 | "_Feature"
1070 | ],
1071 | "window_display": false
1072 | }
1073 | },
1074 | "nbformat": 4,
1075 | "nbformat_minor": 2
1076 | }
1077 |
--------------------------------------------------------------------------------