├── 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 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | "
pathfile_nametag
0flowers/daisy/100080576_f52e8ee070_n.jpg100080576_f52e8ee070_n.jpgdaisy
1flowers/daisy/10140303196_b88d3d6cec.jpg10140303196_b88d3d6cec.jpgdaisy
2flowers/daisy/10172379554_b296050f82_n.jpg10172379554_b296050f82_n.jpgdaisy
3flowers/daisy/10172567486_2748826a8b.jpg10172567486_2748826a8b.jpgdaisy
4flowers/daisy/10172636503_21bededa75_n.jpg10172636503_21bededa75_n.jpgdaisy
\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 | " \n", 403 | " \n", 404 | " \n", 405 | " \n", 406 | " \n", 407 | " \n", 408 | " \n", 409 | " \n", 410 | " \n", 411 | " \n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | " \n", 416 | " \n", 417 | " \n", 418 | " \n", 419 | " \n", 420 | " \n", 421 | " \n", 422 | " \n", 423 | " \n", 424 | " \n", 425 | " \n", 426 | " \n", 427 | "
pathtagset
489flowers/dandelion/5646743865_a8f20b60f7_n.jpgdandeliontrain
1061flowers/rose/7456197696_7e1558cc22_n.jpgrosetrain
2977flowers/rose/4684127262_6c3346188d.jpgrosetrain
\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 | --------------------------------------------------------------------------------