aboutsummaryrefslogtreecommitdiff
path: root/backend/microservice/classificationCNN.ipynb
blob: b79577e18f2ec32e5d7c159af6a0e7ed753b2c68 (plain) (blame)
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
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "classificationCNN.ipynb",
      "provenance": [],
      "collapsed_sections": []
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    },
    "accelerator": "GPU"
  },
  "cells": [
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {
        "id": "0g9hqhtBez9M"
      },
      "outputs": [],
      "source": [
        "from keras.datasets import mnist"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "(X_train, y_train), (X_test, y_test) = mnist.load_data()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "mnHLMwq5fFYN",
        "outputId": "6d82dea4-9ae0-4ef7-bc88-fbd3a933965a"
      },
      "execution_count": 2,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz\n",
            "11493376/11490434 [==============================] - 0s 0us/step\n",
            "11501568/11490434 [==============================] - 0s 0us/step\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "X_train.shape"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "88HYktIFfFTd",
        "outputId": "65562967-3667-4adb-a239-1b4dde68cb61"
      },
      "execution_count": 3,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(60000, 28, 28)"
            ]
          },
          "metadata": {},
          "execution_count": 3
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "import keras.backend as K"
      ],
      "metadata": {
        "id": "iAkFNG3wfFPD"
      },
      "execution_count": 4,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# (60000, 1, 28, 28)\n",
        "# (60000, 28, 28, 1)\n",
        "img_size = X_train.shape[1]\n",
        "if K.image_data_format() == 'channels_first':\n",
        "    X_train = X_train.reshape(X_train.shape[0], 1, img_size, img_size)\n",
        "    X_test = X_test.reshape(X_test.shape[0], 1, img_size, img_size)\n",
        "else:\n",
        "    X_train = X_train.reshape(X_train.shape[0], img_size, img_size, 1)\n",
        "    X_test = X_test.reshape(X_test.shape[0], img_size, img_size, 1)"
      ],
      "metadata": {
        "id": "QBL_5PO7fFMa"
      },
      "execution_count": 5,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "X_train.shape"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "oirq1wVlfFJ5",
        "outputId": "60d7801c-98ed-48c0-ee57-67afbf800fe3"
      },
      "execution_count": 6,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(60000, 28, 28, 1)"
            ]
          },
          "metadata": {},
          "execution_count": 6
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "X_train = X_train / 255"
      ],
      "metadata": {
        "id": "FO4wGXXDfFHm"
      },
      "execution_count": 7,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "X_test = X_test / 255"
      ],
      "metadata": {
        "id": "9w3bEQ4gfFFS"
      },
      "execution_count": 8,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "y_train.shape"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "OjdLctDtfFCO",
        "outputId": "17b5ad38-f66e-41a5-8935-d0de7481652c"
      },
      "execution_count": 9,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(60000,)"
            ]
          },
          "metadata": {},
          "execution_count": 9
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "y_train[0]"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "EhodYEHRfFAN",
        "outputId": "f45d6cee-c132-4674-d179-d661872b7e2a"
      },
      "execution_count": 10,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "5"
            ]
          },
          "metadata": {},
          "execution_count": 10
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "from tensorflow.keras.utils import to_categorical"
      ],
      "metadata": {
        "id": "j8ssc39YfE97"
      },
      "execution_count": 11,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "num_classes = 10\n",
        "y_train = to_categorical(y_train, num_classes)\n",
        "y_test = to_categorical(y_test, num_classes)"
      ],
      "metadata": {
        "id": "F0KAsy7SfE7k"
      },
      "execution_count": 12,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "y_train.shape"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "jz5cSWzvfE4z",
        "outputId": "2dddc1bb-759c-47d9-fc2e-7175105fd7ad"
      },
      "execution_count": 13,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(60000, 10)"
            ]
          },
          "metadata": {},
          "execution_count": 13
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "y_train[0]"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "fhKVJUBQfE2a",
        "outputId": "9178a8a4-fff6-498a-80f7-fa87f21e70a3"
      },
      "execution_count": 14,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "array([0., 0., 0., 0., 0., 1., 0., 0., 0., 0.], dtype=float32)"
            ]
          },
          "metadata": {},
          "execution_count": 14
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "from keras.models import Sequential\n",
        "from keras.layers import Conv2D, MaxPooling2D, Dense, Flatten, Dropout"
      ],
      "metadata": {
        "id": "rvdolRvLfEzg"
      },
      "execution_count": 15,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "input_shape = X_train.shape[1:]\n",
        "input_shape"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Q4e_AIYxfEw_",
        "outputId": "6d92e152-2a60-4b5e-c1e7-de84a9ffdca1"
      },
      "execution_count": 16,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(28, 28, 1)"
            ]
          },
          "metadata": {},
          "execution_count": 16
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "model = Sequential()\n",
        "model.add(Conv2D(32, kernel_size=(3,3), strides=(1,1), padding='same', activation='relu', input_shape=input_shape))\n",
        "model.add(MaxPooling2D(pool_size=(2,2)))\n",
        "model.add(Conv2D(64, kernel_size=(3,3), strides=(1,1), padding='same', activation='relu'))\n",
        "model.add(MaxPooling2D(pool_size=(2,2)))\n",
        "#\n",
        "model.add(Dropout(0.2))\n",
        "model.add(Flatten())\n",
        "model.add(Dense(units=64, activation='relu'))\n",
        "#\n",
        "model.add(Dropout(0.5))\n",
        "model.add(Dense(units=num_classes, activation='softmax'))\n",
        "model.summary()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "-mYbag3yfhsZ",
        "outputId": "8641dd4a-424e-48eb-c21e-1c7f3906dc4b"
      },
      "execution_count": 17,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Model: \"sequential\"\n",
            "_________________________________________________________________\n",
            " Layer (type)                Output Shape              Param #   \n",
            "=================================================================\n",
            " conv2d (Conv2D)             (None, 28, 28, 32)        320       \n",
            "                                                                 \n",
            " max_pooling2d (MaxPooling2D  (None, 14, 14, 32)       0         \n",
            " )                                                               \n",
            "                                                                 \n",
            " conv2d_1 (Conv2D)           (None, 14, 14, 64)        18496     \n",
            "                                                                 \n",
            " max_pooling2d_1 (MaxPooling  (None, 7, 7, 64)         0         \n",
            " 2D)                                                             \n",
            "                                                                 \n",
            " dropout (Dropout)           (None, 7, 7, 64)          0         \n",
            "                                                                 \n",
            " flatten (Flatten)           (None, 3136)              0         \n",
            "                                                                 \n",
            " dense (Dense)               (None, 64)                200768    \n",
            "                                                                 \n",
            " dropout_1 (Dropout)         (None, 64)                0         \n",
            "                                                                 \n",
            " dense_1 (Dense)             (None, 10)                650       \n",
            "                                                                 \n",
            "=================================================================\n",
            "Total params: 220,234\n",
            "Trainable params: 220,234\n",
            "Non-trainable params: 0\n",
            "_________________________________________________________________\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])"
      ],
      "metadata": {
        "id": "9hbTVxflfhoG"
      },
      "execution_count": 18,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "history = model.fit(X_train, y_train, batch_size=128, epochs=10, validation_split=0.2)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "g8ZGgOkYfhkA",
        "outputId": "97821855-ca96-4f67-fe78-b6cf8220361e"
      },
      "execution_count": 19,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Epoch 1/10\n",
            "375/375 [==============================] - 15s 12ms/step - loss: 0.4360 - accuracy: 0.8645 - val_loss: 0.0841 - val_accuracy: 0.9750\n",
            "Epoch 2/10\n",
            "375/375 [==============================] - 4s 10ms/step - loss: 0.1489 - accuracy: 0.9557 - val_loss: 0.0564 - val_accuracy: 0.9842\n",
            "Epoch 3/10\n",
            "375/375 [==============================] - 4s 10ms/step - loss: 0.1126 - accuracy: 0.9669 - val_loss: 0.0462 - val_accuracy: 0.9863\n",
            "Epoch 4/10\n",
            "375/375 [==============================] - 4s 10ms/step - loss: 0.0923 - accuracy: 0.9732 - val_loss: 0.0424 - val_accuracy: 0.9877\n",
            "Epoch 5/10\n",
            "375/375 [==============================] - 4s 10ms/step - loss: 0.0776 - accuracy: 0.9761 - val_loss: 0.0384 - val_accuracy: 0.9891\n",
            "Epoch 6/10\n",
            "375/375 [==============================] - 4s 10ms/step - loss: 0.0724 - accuracy: 0.9785 - val_loss: 0.0417 - val_accuracy: 0.9883\n",
            "Epoch 7/10\n",
            "375/375 [==============================] - 4s 10ms/step - loss: 0.0640 - accuracy: 0.9803 - val_loss: 0.0365 - val_accuracy: 0.9895\n",
            "Epoch 8/10\n",
            "375/375 [==============================] - 4s 10ms/step - loss: 0.0593 - accuracy: 0.9827 - val_loss: 0.0380 - val_accuracy: 0.9898\n",
            "Epoch 9/10\n",
            "375/375 [==============================] - 4s 10ms/step - loss: 0.0523 - accuracy: 0.9837 - val_loss: 0.0353 - val_accuracy: 0.9899\n",
            "Epoch 10/10\n",
            "375/375 [==============================] - 4s 10ms/step - loss: 0.0502 - accuracy: 0.9850 - val_loss: 0.0425 - val_accuracy: 0.9889\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "from matplotlib import pyplot as plt"
      ],
      "metadata": {
        "id": "WlhMk7cWfhhD"
      },
      "execution_count": 20,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "plt.plot(history.epoch, history.history['loss'])\n",
        "plt.plot(history.epoch, history.history['val_loss'])"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 284
        },
        "id": "E3ZNW5o8fpXH",
        "outputId": "8d517369-aa8b-4963-9310-ad4555996786"
      },
      "execution_count": 21,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[<matplotlib.lines.Line2D at 0x7f2c402cc8d0>]"
            ]
          },
          "metadata": {},
          "execution_count": 21
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD5CAYAAAAp8/5SAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3de3Sc9X3n8fdXMxrdb4NlA5LsEWAu5maDJNKwkARoYtouzrbpKaTpsr0shy1s2U32tKTNSfeQzTlp0s0JZ5duy1LSJk3KpjTb9aY0JOXSNNkAlsEQbOMgG9uSMbZsXSzrfvnuH88jaSRL9sga+xnNfF7nzNFznflKx/78nvk9l5+5OyIikr+Koi5ARETOLQW9iEieU9CLiOQ5Bb2ISJ5T0IuI5DkFvYhInotnspGZbQYeBWLAE+7+hUW2+yXgaaDV3dvNLAXsBvaEm7zk7vef7rNWrVrlqVQqo+JFRCSwffv2Y+5ev9C6Mwa9mcWAx4CfBbqAbWa21d13zduuCngIeHneW+x1942ZFptKpWhvb890cxERAczswGLrMum6aQM63H2fu48BTwFbFtjuc8AfASNnVaWIiJwTmQR9A9CZNt8VLpthZjcATe7+9wvs32xmr5nZP5nZLQt9gJndZ2btZtbe3d2dae0iIpKBZZ+MNbMi4MvApxZYfRhY6+6bgE8C3zSz6vkbufvj7t7i7i319Qt2MYmIyFnKJOgPAU1p843hsmlVwDXAi2a2H3gfsNXMWtx91N2PA7j7dmAvcHk2ChcRkcxkEvTbgPVm1mxmCeBuYOv0Snfvd/dV7p5y9xTwEnBXeNVNfXgyFzO7BFgP7Mv6byEiIos641U37j5hZg8CzxJcXvmku+80s0eAdnffeprdbwUeMbNxYAq43917slG4iIhkxnLtMcUtLS2uyytFRJbGzLa7e8tC6/Lmzti+oTEe/ce3efNQf9SliIjklIzujF0JYkXGo8/9lCl3rmmoibocEZGckTdH9FWlxVx1UTXb9usUgIhIurwJeoDWVJLXDvYxPjkVdSkiIjkjr4K+rTnJ8Pik+ulFRNLkVdC3ppIA6r4REUmTV0FfX1VC86oKXnmnN+pSRERyRl4FPUBrqo5t+3uYmsqt+wNERKKSd0Hf1nwB/cPjvH30ZNSliIjkhPwL+rCf/hX104uIAHkY9E3JMtZUl7DtHQW9iAjkYdCbGa2pJNv295Brz/EREYlC3gU9BNfTH+4foat3OOpSREQil5dBr+vpRURm5WXQX7GmiurSOK+on15EJD+DvqjIaEkldeWNiAgZBr2ZbTazPWbWYWYPn2a7XzIzN7OWtGWfDvfbY2YfyUbRmWhrTrKve5BjJ0fP10eKiOSkMwZ9OObrY8CdwAbgHjPbsMB2VcBDwMtpyzYQjDF7NbAZ+JPpMWTPtel++nYd1YtIgcvkiL4N6HD3fe4+BjwFbFlgu88BfwSMpC3bAjzl7qPu/g7QEb7fOXdtQw2lxUV67o2IFLxMgr4B6Eyb7wqXzTCzG4Amd//7pe4b7n+fmbWbWXt3d3dGhZ9JIl7ExqZaXXkjIgVv2SdjzawI+DLwqbN9D3d/3N1b3L2lvr5+uSXNaEsl2fluPydHJ7L2niIiK00mQX8IaEqbbwyXTasCrgFeNLP9wPuAreEJ2TPte061NieZcnj1gLpvRKRwZRL024D1ZtZsZgmCk6tbp1e6e7+7r3L3lLungJeAu9y9PdzubjMrMbNmYD3wStZ/i0XcsLaOWJHpenoRKWjxM23g7hNm9iDwLBADnnT3nWb2CNDu7ltPs+9OM/sWsAuYAB5w98ks1X5GFSVxrr64WtfTi0hBO2PQA7j7M8Az85Z9dpFtPzhv/vPA58+yvmVrSyX52ksHGJ2YpCR+Xq7sFBHJKXl5Z2y61uYkYxNT/KRLA4aLSGHK/6DXQCQiUuDyPuiTFQkuW12pgUhEpGDlfdBDcFTffqCXSQ0YLiIFqCCCvq25joGRCfa8NxB1KSIi511BBP1MP/07xyOuRETk/CuIoG+sK+fimlK27dcdsiJSeAoi6CF4Pv0rGjBcRApQwQR9a3OS7oFRDhwfiroUEZHzqmCCvk3X04tIgSqYoL9sdSV15cW6nl5ECk7BBL1ZMGC4BiIRkUJTMEEPQffN/uNDHD0xcuaNRUTyREEFfWuz+ulFpPAUVNBffXE1ZcUx9dOLSEEpqKAvjhVx47o6XtGNUyJSQDIKejPbbGZ7zKzDzB5eYP39ZvYTM9thZj80sw3h8pSZDYfLd5jZn2b7F1iq1lSSt947Qf/weNSliIicF2cMejOLAY8BdwIbgHumgzzNN939WnffCHwR+HLaur3uvjF83Z+tws9Wa3MdrgHDRaSAZHJE3wZ0uPs+dx8DngK2pG/g7ifSZiuAnH3OwKamOopjphOyIlIwMgn6BqAzbb4rXDaHmT1gZnsJjuh/J21Vs5m9Zmb/ZGa3LPQBZnafmbWbWXt3d/cSyl+6skSMaxpqdEJWRApG1k7Guvtj7n4p8HvAZ8LFh4G17r4J+CTwTTOrXmDfx929xd1b6uvrs1XSotpSSd7o6mdkfPKcf5aISNQyCfpDQFPafGO4bDFPAR8FcPdRdz8eTm8H9gKXn12p2dOaSjI2OcWOzr6oSxEROecyCfptwHozazazBHA3sDV9AzNbnzb788Db4fL68GQuZnYJsB7Yl43Cl6MlVQeg7hsRKQjxM23g7hNm9iDwLBADnnT3nWb2CNDu7luBB83sDmAc6AXuDXe/FXjEzMaBKeB+d488XWvLE1x5YZVOyIpIQThj0AO4+zPAM/OWfTZt+qFF9vtb4G+XU+C50ppK8u1Xu5iYnCIeK6j7xkSkwBRswrU2Jxkcm2T3YQ0YLiL5rWCDXgORiEihKNigv7CmlKZkmU7IikjeK9igh6CffpsGDBeRPFfQQd+WSnJ8cIy93YNRlyIics4UdNBPD0Si4QVFJJ8VdNBfsqqCVZUJ9dOLSF4r6KA3M1pTSV15IyJ5raCDHoITsl29wxzuH466FBGRc6Lgg75tesBwdd+ISJ4q+KC/6qJqKkviOiErInmr4IM+VmTcsK6Obe9oaEERyU8FH/QAbak69hwZoHdwLOpSRESyTkFPcEIWoF0DhotIHlLQA9c31ZKIFamfXkTyUkZBb2abzWyPmXWY2cMLrL/fzH5iZjvM7IdmtiFt3afD/faY2UeyWXy2lBbHuL6pRlfeiEheOmPQh0MBPgbcCWwA7kkP8tA33f1ad98IfBH4crjvBoKhB68GNgN/Mj20YK5pTSV581A/Q2MTUZciIpJVmRzRtwEd7r7P3ccIBv/ekr6Bu59Im60Aph8HuQV4Khwk/B2gI3y/nNPanGRiytlxUAOGi0h+ySToG4DOtPmucNkcZvaAme0lOKL/nSXue5+ZtZtZe3d3d6a1Z9WN6+ow00AkIpJ/snYy1t0fc/dLgd8DPrPEfR939xZ3b6mvr89WSUtSXVrMVRdWq59eRPJOJkF/CGhKm28Mly3mKeCjZ7lvpNqak7x2sI/xyamoSxERyZpMgn4bsN7Mms0sQXBydWv6Bma2Pm3254G3w+mtwN1mVmJmzcB64JXll31utKaSDI9P8uah/qhLERHJmviZNnD3CTN7EHgWiAFPuvtOM3sEaHf3rcCDZnYHMA70AveG++40s28Bu4AJ4AF3nzxHv8uytTbXAcFAJJvW1kVcjYhIdliujZfa0tLi7e3tkX3+h/74RS6tr+SJe1siq0FEZKnMbLu7LxhcujN2ntZUHe0Hepiayq0GUETkbCno52lNJekbGqej+2TUpYiIZIWCfh4NRCIi+UZBP8/aZDmrq0oU9CKSNxT085gZrc1Jtu3vIddOVIuInA0F/QJuak5yuH+Erl4NGC4iK5+CfgHTA5Ho+fQikg8U9Au4Yk0V1aUaMFxE8oOCfgFFRUZLKqkTsiKSFxT0i2hNJdnbPcjxk6NRlyIisiwK+kW0zTz3RgOGi8jKpqBfxLUNtZTEi9R9IyIrnoJ+EYl4ERubanVCVkRWPAX9adzUnGTnu/2cHNWA4SKycinoT6O1OcmUw6sH1E8vIiuXgv40blhbR6zI1H0jIitaRkFvZpvNbI+ZdZjZwwus/6SZ7TKzN8zsOTNbl7Zu0sx2hK+t8/fNZRUlca6+WAOGi8jKdsagN7MY8BhwJ7ABuMfMNszb7DWgxd2vA54Gvpi2btjdN4avu7JU93nTmkqyo7OP0YmcHQFRROS0MjmibwM63H2fu48BTwFb0jdw9xfcfSicfQlozG6Z0WlNJRmdmNKA4SKyYmUS9A1AZ9p8V7hsMb8J/EPafKmZtZvZS2b20YV2MLP7wm3au7u7Myjp/GlNBTdOvazuGxFZobJ6MtbMPgG0AF9KW7wuHLD248BXzOzS+fu5++Pu3uLuLfX19dksadkuqCzh0voKtinoRWSFyiToDwFNafON4bI5zOwO4A+Au9x95gEx7n4o/LkPeBHYtIx6I9HWfAHtB3qZ1IDhIrICZRL024D1ZtZsZgngbmDO1TNmtgn4M4KQP5q2vM7MSsLpVcDNwK5sFX++tDXXMTAywZ73BqIuRURkyc4Y9O4+ATwIPAvsBr7l7jvN7BEzm76K5ktAJfA38y6jvApoN7PXgReAL7j7igt6DUQiIitZPJON3P0Z4Jl5yz6bNn3HIvv9P+Da5RSYCxrryrm4ppRX9vdw7/tTUZcjIrIkujM2Q63NSba9owHDRWTlUdBnqDWV5OjAKAd7hs68sYhIDlHQZ6itOein1/X0IrLSKOgzdFl9JbXlxbqeXkRWHAV9hoqKjNZUUlfeiMiKo6BfgrZUkv3Hhzg6MBJ1KSIiGVPQL0Fr2E+/7R0NRCIiK4eCfgmuvriasuKYum9EZEVR0C9BcayIG9bVaiASEVlRFPRL1JpKsvu9E5wYGY+6FBGRjCjol6gtlcQdtu9XP72IrAwK+iXatLaOeJHxivrpRWSFUNAvUVkixrWNNbpxSkRWDAX9WWhLJXmjq5+RcQ0YLiK5T0F/FlpTScYmp3i9sy/qUkREzkhBfxZawgHDdT29iKwEGQW9mW02sz1m1mFmDy+w/pNmtsvM3jCz58xsXdq6e83s7fB1bzaLj0pteYIr1lTxiq68EZEV4IxBb2Yx4DHgTmADcI+ZbZi32WtAi7tfBzwNfDHcNwn8IXAT0Ab8oZnVZa/86LQ217F9fw8Tk1NRlyIiclqZHNG3AR3uvs/dx4CngC3pG7j7C+4+PSLHS0BjOP0R4Pvu3uPuvcD3gc3ZKT1arakkg2OT7D6sAcNFJLdlEvQNQGfafFe4bDG/CfzDUvY1s/vMrN3M2ru7uzMoKXrTA5HoenoRyXVZPRlrZp8AWoAvLWU/d3/c3VvcvaW+vj6bJZ0zF9WU0ZQs0/X0IpLzMgn6Q0BT2nxjuGwOM7sD+APgLncfXcq+K9X0QCQaMFxEclkmQb8NWG9mzWaWAO4GtqZvYGabgD8jCPmjaaueBT5sZnXhSdgPh8vyQlsqyfHBMfYdG4y6FBGRRZ0x6N19AniQIKB3A99y951m9oiZ3RVu9iWgEvgbM9thZlvDfXuAzxE0FtuAR8JleWF2IJK8+ZVEJA/FM9nI3Z8Bnpm37LNp03ecZt8ngSfPtsBcdsmqClZVJnhlfw93t62NuhwRkQXpzthlMDNa1iU1EImI5DQF/TK1Nifp6h3mcP9w1KWIiCxIQb9Mbanwenod1YtIjlLQL9NVF1VRWRLXA85EJGcp6JcpHivihnV1bHtHDzgTkdykoM+CtlQde44M0Dc0FnUpIiKnUNBnQWvYT9+uxxaLSA5S0GfB9U21JGJF6qcXkZykoM+C0uIY1zXW8LKuvBGRHKSgz5LW5iRvHupnaGwi6lJEROZQ0GdJWyrJxJSz46AGDBeR3KKgz5IbU3WYaSASEck9CvosqS4t5qoLq3VCVkRyjoI+i9qak7x6oI9xDRguIjlEQZ9Frakkw+OT7Hz3RNSliIjMyCjozWyzme0xsw4ze3iB9bea2atmNmFmH5u3bjIcjGRmQJJ81dpcB2ggEhHJLWcMejOLAY8BdwIbgHvMbMO8zQ4C/wb45gJvMezuG8PXXQuszxurq0pJXVCu6+lFJKdkckTfBnS4+z53HwOeArakb+Du+939DaDgO6dbU0naD/QwNaUBw0UkN2QS9A1AZ9p8V7gsU6Vm1m5mL5nZRxfawMzuC7dp7+7uXsJb557W5iR9Q+P86Q/2MjI+GXU5IiLn5WTsOndvAT4OfMXMLp2/gbs/7u4t7t5SX19/Hko6d37u2ou4Zf0qvvjdPdz2xy/yrfZOJnQVjohEKJOgPwQ0pc03hssy4u6Hwp/7gBeBTUuob8WpLInz9d+8iW/81k3UV5Xwu0+/wUe+8gO+++Zh3NWdIyLnXyZBvw1Yb2bNZpYA7gYyunrGzOrMrCScXgXcDOw622JXkpsvW8XfPXAzf/qJGzAz7v+rV/noYz/iRx3Hoi5NRArMGYPe3SeAB4Fngd3At9x9p5k9YmZ3AZhZq5l1Ab8M/JmZ7Qx3vwpoN7PXgReAL7h7QQQ9gJmx+ZqL+O5Dt/DFj11H98Aov/rEy/zqEy/xeqeeiSMi54flWndCS0uLt7e3R13GOTEyPsk3Xj7IYy900DM4xp3XXMinPnwFl62ujLo0EVnhzGx7eD701HUK+vPv5OgET/zzPv7nD/YxPD7Jx25s5KE7Lqehtizq0kRkhVLQ56jjJ0f5kxf38vUfHwDg135mHb/9wUu5oLIk4spEZKVR0Oe4Q33DPPqPP+Xp7V2UFcf4t7dewm/dcgmVJfGoSxORFUJBv0J0HB3gv37vp/zDm++RrEjwwIcu41dvWktpcSzq0kQkxynoV5jXO/v40rN7+GHHMRpqy3jojvX84qYG4jE9bFREFna6oFdy5KDrm2r5q98KbrpaVZnQTVcisiwK+hymm65EJBsU9DlON12JyHKpj36F0U1XIrIQnYzNQ7rpSkTSKejzmG66EhFQ0BcE3XQlUtgU9AUk/aarqtI4H7xiNbdfuZoPXF5PXUUi6vJE5BxR0Beg1zv7+PpLB3jhraMcHxyjyODGdXV86MrV3H7lGi5fU4mZRV2miGSJgr6ATU05bxzq5/ndR3juraPsfPcEAA21Zdx+1Wo+dOVqfuaSC/SYBZEVTkEvM97rH+GFPUd5bvdRftRxjOHxScqKY9x82aog+K9YzYU1pVGXKSJLtOygN7PNwKNADHjC3b8wb/2twFeA64C73f3ptHX3Ap8JZ/+Lu//l6T5LQX/+jIxP8tK+4zz/VhD8h/qGAbj64mpuv3I1t121husaaigqUhePSK5bVtCbWQz4KfCzQBfBGLL3pA8JaGYpoBr4T8DW6aA3syTQDrQADmwHbnT33sU+T0EfDXfn7aMneW73UZ5/6wjbD/Qy5bCqMjFzQvdfrF9FVWlx1KWKyAJOF/SZXHvXBnS4+77wzZ4CtpA2yLe77w/XTc3b9yPA9929J1z/fWAz8NdL/B3kHDMzLl9TxeVrqvh3H7yU3sExfvB2N8/tPsr3dr7H09u7KI4Zbc1JbrtyDbdfuZrUqoqoyxaRDGQS9A1AZ9p8F3BThu+/0L4N8zcys/uA+wDWrl2b4VvLuVRXkWDLxga2bGxgYnKKVw/28dxbR3h+91E+951dfO47u7ikvoLbrljNbVetpjWVpFiPURbJSTlxN427Pw48DkHXTcTlyDzxWBFtzUnampN8+s6r6OwZCvr13zrK1358gCd++A5VJXFuvaKe265YzQevqNeduSI5JJOgPwQ0pc03hssycQj44Lx9X8xwX8lRTcly7n1/invfn2JwdIIfdhzjhTD4//6Nw5jBpqZabrtyNbdduYarLqrSNfsiEcrkZGyc4GTs7QTBvQ34uLvvXGDbvwC+M+9k7HbghnCTVwlOxvYs9nk6GbtyTU05O989wfNvBSd0X+/qB6C+qoSNTbVsbKplU1Mt1zXV6tEMIlmWjcsrf47g8skY8KS7f97MHgHa3X2rmbUC/xuoA0aA99z96nDf3wB+P3yrz7v7V0/3WQr6/HF0YIQX3+rmpX3H2dHZx75jgwCYwfrVlWH417GxqZbL11RqqESRZdANU5IT+obGeL2rnx0H+9jR2cuOzj56h8YBKCuOcW1jDZvCI/+Na2u5qEaPXBbJ1HIvr1w5Jschpuu8c1VteYIPXF7PBy6vB4Jr9w/2DLGjs4/XDvaxo7OPr/5oP2OTwVW6a6pL5hz1X9dYQ4W6fESWLH/+14wOwH+7EdZ/GFp+HS6+IegjkJxlZqy7oIJ1F1SwZWNw1e3oxCS73j3Bjs6+mdezO48AUGRw+ZoqNq2tnWkALltdSUx37oqcVv503Zw8Cs9/Dn7yNIwPwYXXQctvwLUfg5Kq7Bcq503P4Bivd/bxWhj8r3f20T8cdPlUJGJc1xh09Uyf7F1drWf1SOEprD76kX5441uw/S/gyJuQqIRrfzk4yr/o+qzVKdFxd945NjjnqH/XuyeYmAr+LV9cUzoT/Bub6ri2oYayhJ7OKfmtsIJ+mjt0tUP7k7Dz2zAxEnTntPwGXPOLkNDt+/lkZHySnXO6fHrp7Ake0hYrMq5YU8Ul9RUkKxLUlidIlhdTV5Ggrjx8VRRTV56gPBHTNf+yIhVm0Kcb7oXX/xds/yp0vwUl1XDdrwRH+Wuuzu5nSc44dnKU19OO+rt6h+kdGqMvvNJnIYl4EXXlQegnK+Y2AvOng0ajmMqSuBoHiZyCfpo7HHwpOMrf9X9gchQa24Kj/Ks/CsW6nK8QTE45/cPj9AyO0Tc0Rs/gGL1DY/QOjdMbTvcMjgfrwoahb2iMqUX+qxTHLPyWkNYQVCRmGoz0RiFZkWBNdakGepGsU9AvZKgHdnwzOMo/3gGltXD9PcFRfv0V5/7zZUWZmnJOjIyHjcJsgzC/gegdHJ+zfHKR1mFVZYKGunIaa8toqCujobaMxrrZaT0OWpZKQX867rD/h8FR/u7/C1PjsPb9wVH+hrsgrodzydmZmnIGRifmNAo9g+O81z9MV+8wh/qGOdQ7TFffMGMTc5/wXV0ap7GufE4j0FhXRkNtsKyuvFjdRTKHgj5TJ7thxzeCK3Z634GyJGz8ONz467Dqsmhqkrw3NeUcGxzlUHr4z5keYnBscs4+5YkYDWnfBhrqyoKGIWwU6itLNDJYgVHQL9XUFLzzT8FR/p5nYGoCUrcE3TpX/kuIJ6KtTwqKe3BOoeuUhmBoZr533gnmRKyIi2tLZxuC2vI5XUMX1ZTq2UJ5RkG/HANH4LWvw6t/CX0HoXwVbPoE3HgvJC+JujoRAAZHJ+Z0BXX1Ds35hnB0YHTO9kUG1WXF1JYVU1OeoCacri0PflaXFVNbngjXF8/8rCkrpiSuE8m5SEGfDVOTsPeF4Cj/p98Fn4RLPhQc5V/xc3rGjuS0kfFJDvePhOE/xKG+EfqmrygaHqd/eJz+obGZ6dPFQllxjNow9GvCxqEmbBjmzJclZrcrL6ZKl6GeUwr6bDvxLrwaHuWfOASVa2DTrwVH+bUaClFWtumTyP1D4/QNj9E/PD7TIJwYHl+ggZjdbmR8/rDRs2JFRnVpfKZBqCkrpq68mDXVpayuLmVNdQlrqktZU1XK6uoSXYK6RAr6c2VqEt7+fnCU//b3gmWX3QE3/GtouBGqLoIi9YNK4RgZn5xpGPqnG4WZBiJoEKbXTd/LcHRg9JSrjgBqyopnwn91VVpDUF0SNgyl1FeWkIjr/xgo6M+Pvk549WvB6+R7wbLickheGlyxc8G8V1lttPWK5Ijpk81HToxy5MQIR06McHRgdvrIiVGOhssmFrgv4YKKxOw3gqq5DcF047CqsiTvn3KajRGmNgOPEoww9YS7f2He+hLga8CNwHHgV9x9v5mlgN3AnnDTl9z9/tN91ooN+mmTE3Dwx3BsDxzfG9yMdbwDeg8E/frTylcFgT+/EUheomv3RRYwNeX0DI3NaQDSG4IjA8H0sZOjp5xjKLJgSMvFvh0kyxOUFscoiReRiBdREi+ipDhGIlZEccxWxLmFZQW9mcUIxoz9WaCLYMzYe9x9V9o2vw1c5+73m9ndwL9y918Jg/477n5NpsWu+KBfzMQY9O4Pg//t8GfYEJw8MrudFUFN02zwr1oPF1waTFc3qitI5AwmJqc4djKtQRgIG4K0xuHowCg9g2MZvZ8ZQfDHY7ONQLyIRDyWNh2sLymeXV8Sn9dwpO9fHM7H0qbjRVSXxrmkvvKsfu/ljjDVBnS4+77wzZ4CtgC70rbZAvzncPpp4L/bSmgCz6d4AuovD17zjfSHob93bkPQ+TKMnUx7j9KgK2g6+Fetn20QypPn73cRyWHxWBEX1pRyYc3pxyUYnZike2CUIyeC0B+bmGJ0YjL8OX96amb96PjsstGJSUYnphgYmeDYxNjcfcYnGZsMpjPtId/YVMvfPXBzFv4Kc2US9A1AZ9p8F3DTYtu4+4SZ9QMXhOuazew14ATwGXf/5/kfYGb3AfcBrF1bgFetlNZAww3BK517cLR/7O3ZLqDjHXB01+yNXNPKkmldQJcGjUDtuuC9S6qDwVd0o5fIjJJ4jMa6chrrys/p57g745MehP745KkNR9p0eeLcDPp3rocSPAysdffjZnYj8HdmdrW7n0jfyN0fBx6HoOvmHNe0cphB1YXBq/mWuesmx4MbuOY3AvtegNe/ufD7xUqCwC8Ng3+6ATjltdDytGXxUg3TKJIhMyMRNxLxIiojGvM4k089BDSlzTeGyxbapsvM4kANcNyDEwCjAO6+3cz2ApcDedgJf57FisMunEtPXTd6Enr2Bg3B6ED4OpE2nfbq75ydHjkRPNTtTIqKz9AoLLC8tDpYNv0No7RaJ51Fxkdg4HDwOvFucBB11S9k/WMyCfptwHozayYI9LuBj8/bZitwL/Bj4GPA8+7uZlYP9Lj7pJldAqwH9mWtellYSWUwbOLZDJ04MRoE/oINwyKNxeiJoIvpeMfssonhM39WrCStAUj/WbPI8gXWF5/j8WGnpoIxiMcGg/MlYyfD6cG506MDacsHF9huen4oqBirtd8AAAWjSURBVLn8gqC7rXz6lT4/PX1BMF9aq5PwK407DB0PwnsmyA/DwLvhzzDYh3vm7nfR9dEEfdjn/iDwLMHllU+6+04zewRod/etwJ8DXzezDqCHoDEAuBV4xMzGgSngfnfvOfVTJGfES6CyPngtx+T43IZguvGY+dl/6vxI2GBML0s/Eb2YWGKRBqHm1OVYGLanCeXReWE+Ppj572yxoJFNTL8qgld1w+x0oiJoOIaOw1BvcAK+a1swn37OZc77FgVhf0ojULd4A1FWB7FouglO4R78bpNjwb+LyfFgemo8uOkwXhoM+lNcHvz7y/VuwflH4aeE+Lsw8F7wO85hUFEP1RcFV9Y1tUHVxcF81UVQfXHw8xzQDVOSu6YmF2kkFmssFvg5NrDwexfFZwO5JC2UE/OnT7NuZr/wZyxx9iHlHjSKwz2zjcDQ8bT5noXXTYws/p4lNYt8Ywi/JcDC4Ts9nb58ciwtrMeC+0VmpsfD/ebvk/aeGbMg8KeDv7jsNNPpP0tPs26B/RZ6NtX8o/BTfoYhPtx76r7F5WlhfeHc4J7+WXXhOX0m1nIvrxSJRlEsODItqzv795ianP1Wgc0Gc65dgWQWfOsorYa6VOb7jQ2d2iDMNAo9s+tOHoGjbwXzp/uWEksEr6L47HQsvvDyRDnEak+/faw4OKczPR0rnrvcioLGamIk+KYzPhy+hub9HIaRviBwx4eCo+rp9UtqSEJF8bmNwNRUcEf76Y7Ca9fC2psWPgovrcnpbyIKeslvRbHgcRP5+siJRHnwqm0687bTJkZhuC8I2ZngTQR/qxwOq0VNji/QQKRNT5ym8Ziehtkj8fN4FH6+KOhFCk28BKrWRF1F9kx/UyitjrqSnKVT+SIieU5BLyKS5xT0IiJ5TkEvIpLnFPQiInlOQS8ikucU9CIieU5BLyKS53LuWTdm1g0cWMZbrAKOZamclU5/i7n095hLf49Z+fC3WOfuCz6NMOeCfrnMrH2xB/sUGv0t5tLfYy79PWbl+99CXTciInlOQS8ikufyMegfj7qAHKK/xVz6e8ylv8esvP5b5F0fvYiIzJWPR/QiIpJGQS8ikufyJujNbLOZ7TGzDjN7OOp6omRmTWb2gpntMrOdZvZQ1DVFzcxiZvaamX0n6lqiZma1Zva0mb1lZrvN7GeirilKZvYfw/8nb5rZX5tZadQ1ZVteBL2ZxYDHgDuBDcA9ZrYh2qoiNQF8yt03AO8DHijwvwfAQ8DuqIvIEY8C33X3K4HrKeC/i5k1AL8DtLj7NUAMuDvaqrIvL4IeaAM63H2fu48BTwFbIq4pMu5+2N1fDacHCP4jN0RbVXTMrBH4eeCJqGuJmpnVALcCfw7g7mPu3hdtVZGLA2VmFgfKgXcjrifr8iXoG4DOtPkuCjjY0plZCtgEvBxtJZH6CvC7wFTUheSAZqAb+GrYlfWEmVVEXVRU3P0Q8MfAQeAw0O/u34u2quzLl6CXBZhZJfC3wH9w9xNR1xMFM/sF4Ki7b4+6lhwRB24A/oe7bwIGgYI9p2VmdQTf/puBi4EKM/tEtFVlX74E/SGgKW2+MVxWsMysmCDkv+Hu3466ngjdDNxlZvsJuvRuM7O/irakSHUBXe4+/Q3vaYLgL1R3AO+4e7e7jwPfBt4fcU1Zly9Bvw1Yb2bNZpYgOJmyNeKaImNmRtAHu9vdvxx1PVFy90+7e6O7pwj+XTzv7nl3xJYpd38P6DSzK8JFtwO7IiwpageB95lZefj/5nby8OR0POoCssHdJ8zsQeBZgrPmT7r7zojLitLNwK8BPzGzHeGy33f3ZyKsSXLHvwe+ER4U7QN+PeJ6IuPuL5vZ08CrBFervUYePg5Bj0AQEclz+dJ1IyIii1DQi4jkOQW9iEieU9CLiOQ5Bb2ISJ5T0IuI5DkFvYhInvv/6DI6sAOzFEIAAAAASUVORK5CYII=\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "plt.plot(history.epoch, history.history['accuracy'])\n",
        "plt.plot(history.epoch, history.history['val_accuracy'])"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 283
        },
        "id": "25zeWoN6fpTt",
        "outputId": "028d6a2f-eb96-4fd7-e3fb-5e08813c14b9"
      },
      "execution_count": 22,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[<matplotlib.lines.Line2D at 0x7f2bd51797d0>]"
            ]
          },
          "metadata": {},
          "execution_count": 22
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "model.evaluate(X_test, y_test)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "NSNK9zcwfpQc",
        "outputId": "47ccee65-0885-4c7e-86bc-05cf390f69bd"
      },
      "execution_count": 23,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "313/313 [==============================] - 1s 4ms/step - loss: 0.0326 - accuracy: 0.9894\n"
          ]
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[0.032551269978284836, 0.9894000291824341]"
            ]
          },
          "metadata": {},
          "execution_count": 23
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.metrics import confusion_matrix, classification_report\n",
        "import numpy as np"
      ],
      "metadata": {
        "id": "DRxul_2efpL3"
      },
      "execution_count": 24,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "y_test.shape"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "RnzBynjHfvNj",
        "outputId": "820fc2b7-28d5-4e3f-906e-bf5b3502f06d"
      },
      "execution_count": 25,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(10000, 10)"
            ]
          },
          "metadata": {},
          "execution_count": 25
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "y_true = np.argmax(y_test, axis=1)\n",
        "y_pred = np.argmax(model.predict(X_test), axis=1)\n",
        "\n",
        "confusion_matrix(y_true, y_pred)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "fqD4k5PPfvHT",
        "outputId": "d67d6653-cc41-4fbc-98f7-19bec5c78a93"
      },
      "execution_count": 26,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "array([[ 977,    1,    0,    0,    0,    0,    0,    1,    1,    0],\n",
              "       [   0, 1134,    1,    0,    0,    0,    0,    0,    0,    0],\n",
              "       [   3,    1, 1023,    0,    0,    0,    0,    5,    0,    0],\n",
              "       [   0,    0,    1, 1001,    0,    4,    0,    2,    2,    0],\n",
              "       [   0,    0,    0,    0,  981,    0,    0,    0,    0,    1],\n",
              "       [   2,    1,    0,    3,    0,  883,    1,    1,    0,    1],\n",
              "       [   7,    3,    0,    0,    1,    5,  941,    0,    1,    0],\n",
              "       [   0,    2,    2,    0,    0,    0,    0, 1020,    1,    3],\n",
              "       [   8,    1,    4,    1,    3,    1,    1,    4,  946,    5],\n",
              "       [   0,    2,    0,    0,    8,    3,    0,    8,    0,  988]])"
            ]
          },
          "metadata": {},
          "execution_count": 26
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "print(classification_report(y_true, y_pred))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "k_ywfr01fvAv",
        "outputId": "386065f9-6fac-4fea-c76f-f6dfc49718b6"
      },
      "execution_count": 27,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "              precision    recall  f1-score   support\n",
            "\n",
            "           0       0.98      1.00      0.99       980\n",
            "           1       0.99      1.00      0.99      1135\n",
            "           2       0.99      0.99      0.99      1032\n",
            "           3       1.00      0.99      0.99      1010\n",
            "           4       0.99      1.00      0.99       982\n",
            "           5       0.99      0.99      0.99       892\n",
            "           6       1.00      0.98      0.99       958\n",
            "           7       0.98      0.99      0.99      1028\n",
            "           8       0.99      0.97      0.98       974\n",
            "           9       0.99      0.98      0.98      1009\n",
            "\n",
            "    accuracy                           0.99     10000\n",
            "   macro avg       0.99      0.99      0.99     10000\n",
            "weighted avg       0.99      0.99      0.99     10000\n",
            "\n"
          ]
        }
      ]
    }
  ]
}