{ "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": [ "(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()" ], "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": [ "x_train=x_train.reshape((x_train.shape[0], x_train.shape[1]*x_train.shape[2]))\n", "x_test=x_test.reshape((x_test.shape[0], x_test.shape[1]*x_test.shape[2]))" ], "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": [ "scaler = MinMaxScaler()\n", "x_train = scaler.fit_transform(x_train)\n", "x_test = scaler.fit_transform(x_test)" ], "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": [ "y_train = tf.keras.utils.to_categorical(y_train)\n", "y_test = tf.keras.utils.to_categorical(y_test)" ], "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": [ "mlp = tf.keras.Sequential([\n", " tf.keras.layers.Dense(\n", " 200, \n", " activation='sigmoid', \n", " kernel_initializer=tf.keras.initializers.TruncatedNormal(mean=0., stddev=0.1) , \n", " bias_initializer='zeros', \n", " input_shape=(784,),\n", " name=\"Hidden1\"\n", " ),\n", " tf.keras.layers.Dense(\n", " 100, \n", " activation='sigmoid', \n", " kernel_initializer=tf.keras.initializers.TruncatedNormal(mean=0., stddev=0.1) , \n", " bias_initializer='zeros', \n", " name=\"Hidden2\"\n", " ),\n", " tf.keras.layers.Dense(\n", " 60, \n", " activation='sigmoid', \n", " kernel_initializer=tf.keras.initializers.TruncatedNormal(mean=0., stddev=0.1) , \n", " bias_initializer='zeros', \n", " name=\"Hidden3\"\n", " ),\n", " tf.keras.layers.Dense(\n", " 30, \n", " activation='sigmoid', \n", " kernel_initializer=tf.keras.initializers.TruncatedNormal(mean=0., stddev=0.1), \n", " bias_initializer='zeros',\n", " name=\"Hidden4\"\n", " ),\n", " tf.keras.layers.Dense(\n", " 10, \n", " activation='softmax', \n", " kernel_initializer=tf.keras.initializers.TruncatedNormal(mean=0., stddev=0.1), \n", " bias_initializer='zeros',\n", " name=\"Output\"\n", " )\n", "])" ], "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": [ "mlp.summary()" ], "metadata": { "id": "vWZH-9NZkpKQ" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "Το πλήθος των εκπαιδεύσιμων παραμέτρων (βάρη, πολώσεις) είναι 185.000" ], "metadata": { "id": "VlXezy_7kuq5" } }, { "cell_type": "markdown", "source": [ "### B3. Παράμετροι εκπαίδευσης του δικτύου\n", "\n", "Ορίστε τις παραμέτρους εκπαίδευσης του δικτύου. Χρησιμοποιείστε συνάρτηση κόστους διασταυρούμενης επικύρωσης (cross-entropy loss), στοχαστική κατάβαση κλίσης και τη μετρική της ορθότητας (accuracy)" ], "metadata": { "id": "KVKYtoK9lGxb" } }, { "cell_type": "code", "source": [ "mlp.compile(optimizer='sgd', loss='categorical_crossentropy', metrics=['accuracy'])" ], "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": [ "hist_mlp = mlp.fit(x_train, y_train, epochs=100, batch_size=64)" ], "metadata": { "id": "y5upp8b8pREr" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "### Β5. Αποτελέσματα στο σύνολο εκπαίδευσης\n", "\n", "Πόσο χρόνο διαρκεί περίπου η κάθε εποχή; Ποια είναι η αρχική και τελική τιμή της συνάρτησης κόστους και της ορθότητας; Τι παρατήρηση έχετε να κάνετε όσον αφορά την εκπαίδευση; Πως κρίνετε το αποτέλεσμα της εκπαίδευσης του συγκεκριμένου βαθιού, πλήρως διασυνδεδεμένου δικτύου 4 επιπέδων σε σύγκριση με το αντίστοιχο δίκτυο 2 επιπέδων που δείξαμε στο εργαστήριο;" ], "metadata": { "id": "3iwCzHHpqSHN" } }, { "cell_type": "code", "source": [ "print(f\"Αρχική τιμή συνάρτησης κόστους: {hist_mlp.history['loss'][0]:.4f}\\tΤελική τιμή συνάρτησης κόστους: {hist_mlp.history['loss'][-1]:.4f}\")\n", "print(f\"Αρχική τιμή ορθότητας: {hist_mlp.history['accuracy'][0]:.2%}\\tΤελική τιμή ορθότητας: {hist_mlp.history['accuracy'][-1]:.2%}\")" ], "metadata": { "id": "cFc081_AquSj" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "Η εκπαίδευση διαρκεί περίπου 4 δευτερόλεπτα ανά εποχή. Παρατηρούμε ότι για αρκετές εποχές στην αρχή, η εκπαίδευση παραμένει \"κολλημένη\", δηλαδή δεν βελτιώνεται ούτε η συνάρτηση κόστους ούτε η ορθότητα με το πέρας των εποχών. Τέλος, παρά την προσθήκη των 2 ακόμα κρυφών επιπέδων, η ορθότητα στο σύνολο εκπαίδευσης όχι μόνο δεν βελτιώθηκε, αλλά αντίθετα υστερεί (88% ενάντι 96%)." ], "metadata": { "id": "zp1Z2uUpqUWT" } }, { "cell_type": "markdown", "source": [ "### Β6. Αποτελέσματα στο σύνολο ελέγχου\n", "\n", "Ποια είναι η τιμή της ορθότητας στο σύνολο ελέγχου;" ], "metadata": { "id": "NkAWuCgDv353" } }, { "cell_type": "code", "source": [ "_, mlp_acc = mlp.evaluate(x_test, y_test)\n", "\n", "print('Ορθότητα στο σύνολο ελέγχου: {:.2%}'.format(mlp_acc))" ], "metadata": { "id": "wlcIT41CwGbl" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "### Β7. Βελτίωση απόδοσης\n", "\n", "Με ποιον τρόπο θα μπορούσαμε να βελτιώσουμε την απόδοση του δικτύου;" ], "metadata": { "id": "dcx_TCEawhHv" } }, { "cell_type": "markdown", "source": [ "Όπως είπαμε και στο εργαστήριο, ένας από τους λόγους που κολλάει η εκπαίδευση σχετίζεται με την αρχικοποίηση των παραμέτρων (βάρη και πολώσεις). Όσο το πλήθος τους αυξάνεται, θα πρέπει να γίνεται προσεκτικότερη η επιλογή τους. Στη συγκεκριμένη περίπτωση, αν αυξήσουμε το εύρος της τυπικής απόκλισης της Truncated Normal από $0.1$ σε $0.5$ παρατηρούμε ότι η εκπαίδευση πλέον δεν κολλάει." ], "metadata": { "id": "TlF8y6Vbwr_4" } }, { "cell_type": "code", "source": [ "mlp = tf.keras.Sequential([\n", " tf.keras.layers.Dense(\n", " 200, \n", " activation='sigmoid', \n", " kernel_initializer=tf.keras.initializers.TruncatedNormal(mean=0., stddev=0.5) , \n", " bias_initializer='zeros', \n", " input_shape=(784,),\n", " name=\"Hidden1\"\n", " ),\n", " tf.keras.layers.Dense(\n", " 100, \n", " activation='sigmoid', \n", " kernel_initializer=tf.keras.initializers.TruncatedNormal(mean=0., stddev=0.5) , \n", " bias_initializer='zeros', \n", " name=\"Hidden2\"\n", " ),\n", " tf.keras.layers.Dense(\n", " 60, \n", " activation='sigmoid', \n", " kernel_initializer=tf.keras.initializers.TruncatedNormal(mean=0., stddev=0.5) , \n", " bias_initializer='zeros', \n", " name=\"Hidden3\"\n", " ),\n", " tf.keras.layers.Dense(\n", " 30, \n", " activation='sigmoid', \n", " kernel_initializer=tf.keras.initializers.TruncatedNormal(mean=0., stddev=0.5), \n", " bias_initializer='zeros',\n", " name=\"Hidden4\"\n", " ),\n", " tf.keras.layers.Dense(\n", " 10, \n", " activation='softmax', \n", " kernel_initializer=tf.keras.initializers.TruncatedNormal(mean=0., stddev=0.5), \n", " bias_initializer='zeros',\n", " name=\"Output\"\n", " )\n", "])\n", "\n", "mlp.compile(optimizer='sgd', loss='categorical_crossentropy', metrics=['accuracy'])\n", "\n", "hist_mlp = mlp.fit(x_train, y_train, epochs=100, batch_size=64)" ], "metadata": { "id": "cPJruNw4wsWz" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "Πλέον στο σύνολο δεδομένων εκπαίδευσης έχουμε μια ορθότητα που πλησιάζει το 96%, ίδια με το πολυεπίπεδο perceptron των δύο κρυφών επιπέδων που είδαμε στο εργαστήριο. Για να βελτιώσουμε και άλλο την απόδοση του δικτύου που εξετάζουμε στη συγκεκριμένη άσκηση, θα πρέπει να κάνουμε άλλες επιλογές όσον αφορά το πλήθος των κρυφών επιπέδων, την γεωμετρία τους κλπ." ], "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": [ "cnn = tf.keras.models.Sequential([\n", " tf.keras.layers.Conv2D(\n", " filters=32, # 32 φίλτρα (kernels)\n", " kernel_size=(6, 6), # 6x6 pixel μέγεθος kernel\n", " strides=(1, 1), # 1 βήμα για όλες τις διαστάσεις εισόδου\n", " padding='same', # same padding για να μην αλλάξουν οι διαστάσεις\n", " activation='relu', \n", " kernel_initializer=tf.keras.initializers.TruncatedNormal(mean=0., stddev=0.1),\n", " bias_initializer=tf.keras.initializers.Constant(0.1),\n", " input_shape=(28, 28, 1), # εικόνα εισόδου 28x28 pixel, 1 κανάλι (χρώμα)\n", " name='Convolutional1'\n", " ),\n", " tf.keras.layers.Conv2D(\n", " filters=64, # 64 φίλτρα (kernels)\n", " kernel_size=(3, 3), # 3x3 pixel μέγεθος kernel\n", " strides=(1, 1), # 1 βήμα για όλες τις διαστάσεις εισόδου\n", " padding='same', # same padding για να μην αλλάξουν οι διαστάσεις\n", " activation='relu', \n", " kernel_initializer=tf.keras.initializers.TruncatedNormal(mean=0., stddev=0.1),\n", " bias_initializer=tf.keras.initializers.Constant(0.1),\n", " name='Convolutional2'\n", " ),\n", " tf.keras.layers.AveragePooling2D(\n", " pool_size=(2, 2), # Παράθυρο μεγέθους 2x2\n", " strides=(2, 2), # Βήμα παραθύρου 2 (και στις 2 διαστάσεις)\n", " padding='same',\n", " name='Pooling1'\n", " ),\n", " tf.keras.layers.Flatten(name=\"Flatten\"),\n", " tf.keras.layers.Dense(\n", " 1024, \n", " activation='relu', \n", " kernel_initializer=tf.keras.initializers.TruncatedNormal(mean=0., stddev=0.5), \n", " bias_initializer=tf.keras.initializers.Constant(0.5),\n", " name=\"Hidden1\"\n", " ),\n", " tf.keras.layers.Dense(\n", " 10, \n", " activation='softmax', \n", " kernel_initializer=tf.keras.initializers.TruncatedNormal(mean=0., stddev=0.5), \n", " bias_initializer=tf.keras.initializers.Constant(0.5),\n", " name=\"Output\"\n", " )\n", "], name=\"ConvolutionalNetwork\")\n", "\n" ], "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": [ "cnn.summary()" ], "metadata": { "id": "cBVhdYszF3U9" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "Παρατηρούμε ότι το πλήθος των παραμέτρων είναι σχεδόν 12,9 εκατομμύρια. Ενώ στο συνελικτικό τμήμα του δικτύου (μέχρι το Flatten) έχουμε λίγες παραμέτρους εξαιτίας της ιδιότητας του διαμοιρασμού βαρών (weight sharing) της συνέλιξης, αυτές αυξάνουν κατά πολύ όταν περνάμε στο πλήρως συνδεδεμένο τμήμα του δικτύου, μιας και θα πρέπει να δοθούν ως είσοδος (με βάρος) σε κάθε έναν από τους 1.024 νευρώνες του πρώτου κρυφού επιπέδου." ], "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": [ "cnn.compile(optimizer='adadelta', loss='categorical_crossentropy', metrics=['accuracy'])" ], "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": [ "hist_cnn = cnn.fit(x_train, y_train, epochs=100, batch_size=64)" ], "metadata": { "id": "xUs4CX9TMRqt" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "### Γ5. Αποτελέσματα στο σύνολο εκπαίδευσης\n", "\n", "Πόσο χρόνο διαρκεί περίπου η κάθε εποχή; Ποια είναι η αρχική και τελική τιμή της συνάρτησης κόστους και της ορθότητας; Τι παρατήρηση έχετε να κάνετε όσον αφορά την εκπαίδευση;" ], "metadata": { "id": "LX317cJCNZbS" } }, { "cell_type": "code", "source": [ "print(f\"Αρχική τιμή συνάρτησης κόστους: {hist_cnn.history['loss'][0]:.4f}\\tΤελική τιμή συνάρτησης κόστους: {hist_cnn.history['loss'][-1]:.4f}\")\n", "print(f\"Αρχική τιμή ορθότητας: {hist_cnn.history['accuracy'][0]:.2%}\\tΤελική τιμή ορθότητας: {hist_cnn.history['accuracy'][-1]:.2%}\")" ], "metadata": { "id": "zGwLU3LKNfYd" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "Τώρα πλέον η κάθε εποχή διαρκεί 17 με 18 sec (αντί 4 του βαθιού πολυεπίπεδου perceptron). Αυτό οφείλεται στο γεγονός ότι οι παράμετροι είναι κατά δύο τάξεις μεγέθους περισσότεροι (12,9 εκ. έναντι 185 χιλιάδων). Αν και στις πρώτες εποχές τόσο η συνάρτηση κόστους όσο και η ορθότητα βελτιώνονται γρήγορα, κατόπιν βελτιώνονται αρκετά αργά, επιτυγχάνοντας υποδεέστερη απόδοση όσον αφορά την ορθότητα στο σύνολο εκπαίδευσης σε σύγκριση με το συνελικτικό δίκτυο που εξετάσαμε στο εργαστήριο (93% έναντι 100%), αλλά και σε σύγκριση με το βαθύ πολυεπίπεδο perceptron που εξετάσαμε προηγουμένως." ], "metadata": { "id": "GPYM3ZAEwIcG" } }, { "cell_type": "markdown", "source": [ "### Γ6. Αποτελέσματα στο σύνολο ελέγχου\n", "\n", "Ποια είναι η τιμή της ορθότητας στο σύνολο ελέγχου;" ], "metadata": { "id": "87HDQfYONpPm" } }, { "cell_type": "code", "source": [ "_, cnn_acc = cnn.evaluate(x_test, y_test)\n", "\n", "print('Ορθότητα στο σύνολο ελέγχου: {:.2%}'.format(cnn_acc))" ], "metadata": { "id": "ZszBdW3ONsl4" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "## Δ. Συγκρίσεις\n", "\n", "Συγκρίνετε τα δύο βαθιά δίκτυα (πολυεπίπεδο perceptron και συνελικτικό δίκτυο) στο συγκερκιμένο πρόβλημα" ], "metadata": { "id": "p39KmoHIkkcP" } }, { "cell_type": "markdown", "source": [ "Το βαθύ συνελικτικό δίκτυο έχει πολύ μεγαλύτερο πλήθος παραμέτρων (δύο τάξεις μεγέθους περισσότερες). Έτσι η κάθε εποχή παίρνει περισσότερο χρόνο να ολοκληρωθεί. Επίσης, μετά τις πρώτες εποχές, συγκλίνει αργά, πράγμα που οφείλεται στο γεγονός ότι είναι \"μεγάλο\" για το συγκεκριμένο πρόβλημα (έχει 12,9 εκ. παραμέτρους έναντι 3,2 εκ. παραμέτρων του βαθιού συνελικτικού δικτύου που δείξαμε στο εργαστήριο). Συνεπώς, θα πρέπει να ελαττώσουμε το πλήθος των παραμέτρων του, εφαρμόζοντας επιπρόσθετη χωρική υποδειγματοληψία. Φυσικά, και σε αυτή την περίπτωση, θα μπορούσαμε να εξετάσουμε καλύτερη αρχικοποίηση των παραμέτρων του δικτύου καθώς και διαφορετικό αλγόριθμο μάθησης. " ], "metadata": { "id": "nOBYiTqaOJLQ" } } ], "metadata": { "accelerator": "GPU", "colab": { "name": "Άσκηση 11 Deep Learning on MNIST - Solution.ipynb", "provenance": [] }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" } }, "nbformat": 4, "nbformat_minor": 0 }