{ "cells": [ { "cell_type": "markdown", "metadata": { "collapsed": true, "id": "WHTxLAU-1EM0" }, "source": [ "# Άσκηση 11 Deep Learning on MNIST\n", "\n", "Στην άσκηση αυτή θα συγκρίνουμε ένα βαθύ δίκτυο πρόσθιας τροφοδότησης με ένα συνελικτικό δίκτυο στο MNIST. \n", "\n", "\n", "![](https://miro.medium.com/max/990/0*94t_5cPF9mvBj20z.png)\n", "\n", "Η συλλογή δεδομένων χειρόγραφων ψηφίων [MNIST](http://yann.lecun.com/exdb/mnist/) (Modified National Institute of Standards and Technology database) είναι από τα διασημότερα datasets της Μηχανικής Μάθησης. \n", "\n", "Έχει δημιουργηθεί από τους πρωτοπόρους της Τεχνητής Νοημοσύνης Yann LeCun, Corinna Cortes, και Chris Burges.\n", "\n", "Ξεκινάμε, εισάγοντας τις βιβλιοθήκες που πρόκειται να χρησιμοποιήσουμε\n" ] }, { "cell_type": "code", "source": [ "from sklearn.preprocessing import MinMaxScaler\n", "\n", "import tensorflow as tf\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "print(\"Έκδοση Tensorflow: \" + tf.__version__)" ], "metadata": { "id": "_Vio83TeEO-E" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "## Α. Φόρτωση και προεπεξεργασία των δεδομένων" ], "metadata": { "id": "Dt8d47iXdrw8" } }, { "cell_type": "markdown", "source": [ "### Α1. Μεταφόρτωση του dataset\n", "\n", "Μεταφορτώστε το MNIST dataset τη μέθοδο [load_dataset()](https://www.tensorflow.org/api_docs/python/tf/keras/datasets/mnist/load_data) του submodule keras.datasets.mnist, όπως δείξαμε στο εργαστήριο" ], "metadata": { "id": "9jZvdBK1cLI-" } }, { "cell_type": "code", "source": [ "" ], "metadata": { "id": "X42gcRzScY-u" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "### Α2. Μετατρέψετε τις δισδιάστατες εικόνες σε μονοδιάστατα διανύσματα\n", "\n", "Με χρήση της μεθόδου [reshape()](https://numpy.org/doc/stable/reference/generated/numpy.ndarray.reshape.html?highlight=reshape#numpy.ndarray.reshape) του NumPy." ], "metadata": { "id": "IrhspGUccjEQ" } }, { "cell_type": "code", "source": [ "" ], "metadata": { "id": "nHncIPmFciqi" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "### Α3. Κανονικοποιείστε γραμμικά τις τιμές των pixel στο $[0,1]$\n", "\n", "Χρησιμοποιώντας την κλάση [MinMaxScaler](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MinMaxScaler.html) από το preprocessing module του scikit-learn." ], "metadata": { "id": "WEfAD8_nc258" } }, { "cell_type": "code", "source": [ "" ], "metadata": { "id": "6rCZk6tQc3Nq" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "### Α4. Κωδικοποιείστε τις τιμές εξόδου σε μορφή διανύσματος one-hot\n", "\n", "Με χρήση της μεθόδου [to_cetegorical()](https://www.tensorflow.org/api_docs/python/tf/keras/utils/to_categorical) του submodule keras.utils του Tensorflow.\n" ], "metadata": { "id": "5-FTsxeKdP5c" } }, { "cell_type": "code", "source": [ "" ], "metadata": { "id": "TK9_5fGfdctI" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "## Β. Βαθύ, πλήρως-συνδεδεμένο πολυεπίπεδο perceptron\n", "\n", "Αρχικά, θα κατασκευάσουμε ένα πολυεπίπεδο percetpron με 5 επίπεδα (4 κρυφά και 1 επίπεδο εξόδου) για να επιλύσουμε το πρόβλημα ταξινόμησης στο MNIST dataset. Τα κρυφά επίπεδα θα επιλέξουμε να έχουν 200, 100, 60 και 30 νευρώνες αντίστοιχα και σιγμοειδή συνάρτηση ενεργοποίησης. Το επίπεδο εξόδου θα έχει συνάρτηση ενεργοποίησης την softmax.\n" ], "metadata": { "id": "Cji6SjVTbqk5" } }, { "cell_type": "markdown", "source": [ "### Β1. Κατασκευή δικτύου\n", "\n", "Χρησιμοποιείστε την [ακολουθιακή διεπαφή](https://www.tensorflow.org/api_docs/python/tf/keras/Sequential) του keras. Αρχικοποιείστε τα βάρη όλων των επιπέδων χρησιμοποιώντας την [TruncatedNormal](https://www.tensorflow.org/api_docs/python/tf/keras/initializers/TruncatedNormal) από το submodule keras.initializers με μέση τιμή $0$ και τυπική απόκλιση $0.1$.\n", "\n" ], "metadata": { "id": "Zma85tswOAyZ" } }, { "cell_type": "code", "source": [ "" ], "metadata": { "id": "jEzheQDJfWNZ" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "### Β2. Αρχιτεκτονική δικτύου\n", "\n", "\n", "Εμφανίστε την αρχιτεκτονική του δικτύου, χρησιμοποιώντας τη μέθοδο *summary()*. Ποιο το πλήθος των εκπαιδεύσιμων παραμέτρων;\n", "\n" ], "metadata": { "id": "NhZ72WdqcAlj" } }, { "cell_type": "code", "source": [ "" ], "metadata": { "id": "vWZH-9NZkpKQ" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "" ], "metadata": { "id": "VlXezy_7kuq5" } }, { "cell_type": "markdown", "source": [ "### B3. Παράμετροι εκπαίδευσης του δικτύου\n", "\n", "Ορίστε τις παραμέτρους εκπαίδευσης του δικτύου. Χρησιμοποιείστε συνάρτηση κόστους διασταυρούμενης επικύρωσης (cross-entropy loss), στοχαστική κατάβαση κλίσης και τη μετρική της ορθότητας (accuracy)" ], "metadata": { "id": "KVKYtoK9lGxb" } }, { "cell_type": "code", "source": [ "" ], "metadata": { "id": "HDLWJPwhlpbj" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "### B4. Εκπαιδεύστε το δίκτυο\n", "\n", "Εκπαιδεύστε το δίκτυο στα δεδομένα εκπαίδευσης για 100 εποχές με μέγεθος δέσμης (`batch_size`) 64. " ], "metadata": { "id": "qradHXaMotkD" } }, { "cell_type": "code", "source": [ "" ], "metadata": { "id": "y5upp8b8pREr" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "### Β5. Αποτελέσματα στο σύνολο εκπαίδευσης\n", "\n", "Πόσο χρόνο διαρκεί περίπου η κάθε εποχή; Ποια είναι η αρχική και τελική τιμή της συνάρτησης κόστους και της ορθότητας; Τι παρατήρηση έχετε να κάνετε όσον αφορά την εκπαίδευση; Πως κρίνετε το αποτέλεσμα της εκπαίδευσης του συγκεκριμένου βαθιού, πλήρως διασυνδεδεμένου δικτύου 4 επιπέδων σε σύγκριση με το αντίστοιχο δίκτυο 2 επιπέδων που δείξαμε στο εργαστήριο;" ], "metadata": { "id": "3iwCzHHpqSHN" } }, { "cell_type": "code", "source": [ "" ], "metadata": { "id": "cFc081_AquSj" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "" ], "metadata": { "id": "zp1Z2uUpqUWT" } }, { "cell_type": "markdown", "source": [ "### Β6. Αποτελέσματα στο σύνολο ελέγχου\n", "\n", "Ποια είναι η τιμή της ορθότητας στο σύνολο ελέγχου;" ], "metadata": { "id": "NkAWuCgDv353" } }, { "cell_type": "code", "source": [ "" ], "metadata": { "id": "wlcIT41CwGbl" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "### Β7. Βελτίωση απόδοσης\n", "\n", "Με ποιον τρόπο θα μπορούσαμε να βελτιώσουμε την απόδοση του δικτύου;" ], "metadata": { "id": "dcx_TCEawhHv" } }, { "cell_type": "markdown", "source": [ "" ], "metadata": { "id": "TlF8y6Vbwr_4" } }, { "cell_type": "code", "source": [ "" ], "metadata": { "id": "cPJruNw4wsWz" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "" ], "metadata": { "id": "7w32KHU00yHk" } }, { "cell_type": "markdown", "source": [ "## Γ. Βαθύ συνελικτικό δίκτυο\n", "\n", "Πριν προχωρήσουμε με το βαθύ συνελικτικό δίκτυο, θα μετασχηματίσουμε τα δεδομένα της εισόδου από διάνυσμα σε δισδιάστατη εικόνα 1 χρώματος." ], "metadata": { "id": "hu6D8hCkit7i" } }, { "cell_type": "code", "source": [ "x_train = x_train.reshape((x_train.shape[0], 28, 28, 1))\n", "x_test = x_test.reshape((x_test.shape[0], 28, 28, 1))" ], "metadata": { "id": "NFQMDJtCYmP8" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "Στη συνέχεια θα φτιάξουμε ένα βαθύ συνελικτικό δίκτυο που θα αποτελείται από ένα επίπεδο δισδιάστατης συνέλιξης 32 φίλτρων διάστασης $6\\times 6$ και ημιγραμμική συνάρτηση ενεργοποίησης ακολουθούμενο από ένα ακόμα επίπεδο δισδιάστατης συνέλιξης 64 φίλτρων διάστασης $3\\times 3$ με ίδια τα υπόλοιπα χαρακτηριστικά. Κατόπιν, ακολουθεί ένα επίπεδο χωρικής υποδειγματοληψίας μέσης τιμής διάστασης $2\\times 2$. Τέλος στο συνελικτικό δίκτυο θα προσθέσουμε και μια πλήρως διασυνδεδεμένη κεφαλή (head), αποτελούμενη από επίπεδο Flatten, ένα πυκνό επίπεδο 1024 νευρώνων με ημιγραμμική συνάρτηση ενεργοποίησης και το επίπεδο εξόδου 10 νευρώνων με συνάρτηση ενεργοποίησης softmax.\n" ], "metadata": { "id": "xZLq8vyhi6ZZ" } }, { "cell_type": "markdown", "source": [ "### Γ1. Κατασκευή δικτύου\n", "\n", "Χρησιμοποιώντας την ακολουθιακή διεπαφή, κατασκευάστε το παραπάνω δίκτυο. Αρχικοποιείστε τα βάρη όλων των επιπέδων χρησιμοποιώντας την TruncatedNormal από το submodule keras.initializers με μέση τιμή $0$ και τυπική απόκλιση $0.1$ για τα συνελικτικά επίπεδα και τυπική απόκλιση $0.5$ για τα πυκνά επίπεδα. Τις πολώσεις αρχικοποιήστε τις σε σταθερή τιμή $0.1$ για τα συνελικτικά επίπεδα και $0.5$ για τα πυκνά επίπεδα, χρησιμοποιώντας την κλάση [Constant](https://www.tensorflow.org/api_docs/python/tf/keras/initializers/Constant) του submodule keras.initializers του tensorflow. Τέλος, στα συνελικτικά επίπεδα θεωρείστε ότι έχουμε βήμα 1 σε όλες τις διαστάσεις και same padding, ενώ στο επίπεδο υποδειγματοληψίας ([AveragePooling2D](https://www.tensorflow.org/api_docs/python/tf/keras/layers/AveragePooling2D)) χρησιμοποιείστε βήμα 2 σε όλες τις διαστάσεις (και same padding)." ], "metadata": { "id": "SQOrXpPT-Oti" } }, { "cell_type": "code", "source": [ "" ], "metadata": { "id": "JDN7zZKq-X8I" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "### Γ2. Αρχιτεκτονική δικτύου\n", "\n", "\n", "Εμφανίστε την αρχιτκτονική του δικτύου, χρησιμοποιώντας τη μέθοδο *summary()*. Ποιο το πλήθος των εκπαιδεύσιμων παραμέτρων;\n" ], "metadata": { "id": "K45CbR22F3DC" } }, { "cell_type": "code", "source": [ "" ], "metadata": { "id": "cBVhdYszF3U9" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "" ], "metadata": { "id": "jwLSoUUQIkko" } }, { "cell_type": "markdown", "source": [ "### Γ3. Παράμετροι εκπαίδευσης του δικτύου\n", "\n", "Ορίστε τις παραμέτρους εκπαίδευσης του δικτύου. Χρησιμοποιείστε συνάρτηση κόστους διασταυρούμενης επικύρωσης (cross-entropy loss), κατάβαση κλίσης [Adadelta](https://www.tensorflow.org/api_docs/python/tf/keras/optimizers/Adadelta) και τη μετρική της ορθότητας (accuracy)" ], "metadata": { "id": "ay5Lv3N1KT5v" } }, { "cell_type": "code", "source": [ "" ], "metadata": { "id": "crMg1a2oKjSc" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "### Γ4. Εκπαιδεύστε το δίκτυο\n", "\n", "Εκπαιδεύστε το δίκτυο στα δεδομένα εκπαίδευσης για 100 εποχές με μέγεθος δέσμης (`batch_size`) 64. " ], "metadata": { "id": "XpLV5Bb_MGgM" } }, { "cell_type": "code", "source": [ "" ], "metadata": { "id": "xUs4CX9TMRqt" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "### Γ5. Αποτελέσματα στο σύνολο εκπαίδευσης\n", "\n", "Πόσο χρόνο διαρκεί περίπου η κάθε εποχή; Ποια είναι η αρχική και τελική τιμή της συνάρτησης κόστους και της ορθότητας; Τι παρατήρηση έχετε να κάνετε όσον αφορά την εκπαίδευση;" ], "metadata": { "id": "LX317cJCNZbS" } }, { "cell_type": "code", "source": [ "" ], "metadata": { "id": "zGwLU3LKNfYd" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "" ], "metadata": { "id": "GPYM3ZAEwIcG" } }, { "cell_type": "markdown", "source": [ "### Γ6. Αποτελέσματα στο σύνολο ελέγχου\n", "\n", "Ποια είναι η τιμή της ορθότητας στο σύνολο ελέγχου;" ], "metadata": { "id": "87HDQfYONpPm" } }, { "cell_type": "code", "source": [ "" ], "metadata": { "id": "ZszBdW3ONsl4" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "## Δ. Συγκρίσεις\n", "\n", "Συγκρίνετε τα δύο βαθιά δίκτυα (πολυεπίπεδο perceptron και συνελικτικό δίκτυο) στο συγκερκιμένο πρόβλημα" ], "metadata": { "id": "p39KmoHIkkcP" } }, { "cell_type": "markdown", "source": [ "" ], "metadata": { "id": "nOBYiTqaOJLQ" } } ], "metadata": { "accelerator": "GPU", "colab": { "name": "Άσκηση 11 Deep Learning on MNIST.ipynb", "provenance": [] }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" } }, "nbformat": 4, "nbformat_minor": 0 }