File size: 47,526 Bytes
df3e474
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "f9755410",
   "metadata": {},
   "source": [
    "## Notebook para realizar la parte 2 del TFM: clasificación de imágenes según tipo de célula sanguínea\n",
    "\n",
    "Se tiene de entrada el dataset ____ y de salida se espera tener el acc del modelo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "3356fb49",
   "metadata": {},
   "outputs": [],
   "source": [
    "from keras.preprocessing.image import ImageDataGenerator\n",
    "from keras.models import Sequential\n",
    "from keras.layers import Conv2D, MaxPooling2D\n",
    "from keras.layers import Activation, Dropout, Flatten, Dense\n",
    "from keras import backend as K\n",
    "import matplotlib.pyplot as plt\n",
    "  \n",
    "img_width, img_height = 360, 363"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "2fbd9e15",
   "metadata": {},
   "outputs": [],
   "source": [
    "train_data_dir = '../../dataset/classification/PCB_Dataset_Split/train'\n",
    "validation_data_dir = '../../dataset/classification/PCB_Dataset_Split/val'\n",
    "\n",
    "nb_train_samples = 13671  \n",
    "nb_validation_samples = 1705 \n",
    "\n",
    "epochs = 10\n",
    "batch_size = 16"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "51cdcdda",
   "metadata": {},
   "outputs": [],
   "source": [
    "if K.image_data_format() == 'channels_first':\n",
    "    input_shape = (3, img_width, img_height)\n",
    "else:\n",
    "    input_shape = (img_width, img_height, 3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "16f72477",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Found 13671 images belonging to 8 classes.\n",
      "Found 1705 images belonging to 8 classes.\n"
     ]
    }
   ],
   "source": [
    "train_datagen = ImageDataGenerator(\n",
    "    rescale = 1. / 255,\n",
    "    shear_range = 0.2,\n",
    "    zoom_range = 0.2,\n",
    "    horizontal_flip = True)\n",
    "  \n",
    "val_datagen = ImageDataGenerator(rescale = 1. / 255)\n",
    "  \n",
    "train_generator = train_datagen.flow_from_directory(\n",
    "    train_data_dir,\n",
    "    target_size = (img_width, img_height),\n",
    "    batch_size = batch_size,\n",
    "    class_mode = 'categorical')\n",
    "  \n",
    "validation_generator = val_datagen.flow_from_directory(\n",
    "    validation_data_dir,\n",
    "    target_size = (img_width, img_height),\n",
    "    batch_size = batch_size,\n",
    "    class_mode = 'categorical')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "939e6d8a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      " Layer (type)                Output Shape              Param #   \n",
      "=================================================================\n",
      " conv2d (Conv2D)             (None, 359, 362, 32)      416       \n",
      "                                                                 \n",
      " activation (Activation)     (None, 359, 362, 32)      0         \n",
      "                                                                 \n",
      " max_pooling2d (MaxPooling2D  (None, 179, 181, 32)     0         \n",
      " )                                                               \n",
      "                                                                 \n",
      " conv2d_1 (Conv2D)           (None, 178, 180, 32)      4128      \n",
      "                                                                 \n",
      " activation_1 (Activation)   (None, 178, 180, 32)      0         \n",
      "                                                                 \n",
      " max_pooling2d_1 (MaxPooling  (None, 89, 90, 32)       0         \n",
      " 2D)                                                             \n",
      "                                                                 \n",
      " conv2d_2 (Conv2D)           (None, 88, 89, 64)        8256      \n",
      "                                                                 \n",
      " activation_2 (Activation)   (None, 88, 89, 64)        0         \n",
      "                                                                 \n",
      " max_pooling2d_2 (MaxPooling  (None, 44, 44, 64)       0         \n",
      " 2D)                                                             \n",
      "                                                                 \n",
      " flatten (Flatten)           (None, 123904)            0         \n",
      "                                                                 \n",
      " dense (Dense)               (None, 64)                7929920   \n",
      "                                                                 \n",
      " activation_3 (Activation)   (None, 64)                0         \n",
      "                                                                 \n",
      " dropout (Dropout)           (None, 64)                0         \n",
      "                                                                 \n",
      " dense_1 (Dense)             (None, 8)                 520       \n",
      "                                                                 \n",
      " activation_4 (Activation)   (None, 8)                 0         \n",
      "                                                                 \n",
      "=================================================================\n",
      "Total params: 7,943,240\n",
      "Trainable params: 7,943,240\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "# Modelo de prueba CNN\n",
    "\n",
    "model = Sequential()\n",
    "model.add(Conv2D(32, (2, 2), input_shape=input_shape))\n",
    "model.add(Activation('relu'))\n",
    "model.add(MaxPooling2D(pool_size=(2, 2)))\n",
    "  \n",
    "model.add(Conv2D(32, (2, 2)))\n",
    "model.add(Activation('relu'))\n",
    "model.add(MaxPooling2D(pool_size=(2, 2)))\n",
    "  \n",
    "model.add(Conv2D(64, (2, 2)))\n",
    "model.add(Activation('relu'))\n",
    "model.add(MaxPooling2D(pool_size=(2, 2)))\n",
    "  \n",
    "model.add(Flatten())\n",
    "model.add(Dense(64))\n",
    "model.add(Activation('relu'))\n",
    "model.add(Dropout(0.5))\n",
    "model.add(Dense(8))\n",
    "model.add(Activation('softmax'))\n",
    "\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "ac636271",
   "metadata": {},
   "outputs": [],
   "source": [
    "model.compile(loss = 'categorical_crossentropy',\n",
    "              optimizer = 'rmsprop',\n",
    "              metrics = ['accuracy'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "1857e44a",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\shiru\\AppData\\Local\\Temp\\ipykernel_17948\\2051623620.py:1: UserWarning: `Model.fit_generator` is deprecated and will be removed in a future version. Please use `Model.fit`, which supports generators.\n",
      "  history = model.fit_generator(\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/10\n",
      "854/854 [==============================] - 820s 952ms/step - loss: 1.0580 - accuracy: 0.6170 - val_loss: 0.4412 - val_accuracy: 0.8827\n",
      "Epoch 2/10\n",
      "854/854 [==============================] - 626s 733ms/step - loss: 0.6073 - accuracy: 0.7954 - val_loss: 0.3343 - val_accuracy: 0.8974\n",
      "Epoch 3/10\n",
      "854/854 [==============================] - 626s 733ms/step - loss: 0.5120 - accuracy: 0.8298 - val_loss: 0.2887 - val_accuracy: 0.9151\n",
      "Epoch 4/10\n",
      "854/854 [==============================] - 629s 736ms/step - loss: 0.4622 - accuracy: 0.8555 - val_loss: 0.3991 - val_accuracy: 0.8679\n",
      "Epoch 5/10\n",
      "854/854 [==============================] - 628s 735ms/step - loss: 0.4243 - accuracy: 0.8683 - val_loss: 0.4510 - val_accuracy: 0.8815\n",
      "Epoch 6/10\n",
      "854/854 [==============================] - 676s 791ms/step - loss: 0.4159 - accuracy: 0.8794 - val_loss: 0.2866 - val_accuracy: 0.9210\n",
      "Epoch 7/10\n",
      "854/854 [==============================] - 720s 843ms/step - loss: 0.3999 - accuracy: 0.8778 - val_loss: 0.3063 - val_accuracy: 0.9316\n",
      "Epoch 8/10\n",
      "854/854 [==============================] - 722s 845ms/step - loss: 0.4107 - accuracy: 0.8770 - val_loss: 0.3294 - val_accuracy: 0.9098\n",
      "Epoch 9/10\n",
      "854/854 [==============================] - 727s 851ms/step - loss: 0.3974 - accuracy: 0.8856 - val_loss: 0.2559 - val_accuracy: 0.9257\n",
      "Epoch 10/10\n",
      "854/854 [==============================] - 701s 821ms/step - loss: 0.3972 - accuracy: 0.8868 - val_loss: 0.2749 - val_accuracy: 0.9316\n"
     ]
    }
   ],
   "source": [
    "history = model.fit_generator(\n",
    "                        train_generator,\n",
    "                        steps_per_epoch = nb_train_samples // batch_size,\n",
    "                        epochs = epochs,\n",
    "                        validation_data = validation_generator,\n",
    "                        validation_steps = nb_validation_samples // batch_size)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "b3ed428f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Guardamos el modelo\n",
    "model.save(\n",
    "    '../../model/classification/image_classification_CNN.h5',\n",
    "    overwrite=True,\n",
    "    include_optimizer=True,\n",
    "    save_format=None,\n",
    "    signatures=None,\n",
    "    options=None,\n",
    "    save_traces=True,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "f2b819e1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dict_keys(['loss', 'accuracy', 'val_loss', 'val_accuracy'])\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Printeamos las gráficas de acc y loss\n",
    "print(history.history.keys())\n",
    "\n",
    "# acc\n",
    "plt.plot(history.history['accuracy'])\n",
    "plt.plot(history.history['val_accuracy'])\n",
    "plt.title('model accuracy')\n",
    "plt.ylabel('accuracy')\n",
    "plt.xlabel('epoch')\n",
    "plt.legend(['train', 'val'], loc='upper left')\n",
    "plt.show()\n",
    "\n",
    "# loss\n",
    "plt.plot(history.history['loss'])\n",
    "plt.plot(history.history['val_loss'])\n",
    "plt.title('model loss')\n",
    "plt.ylabel('loss')\n",
    "plt.xlabel('epoch')\n",
    "plt.legend(['train', 'val'], loc='upper left')\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}