{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"Deep Learning con Keras - Lezione 2 - parte 1","provenance":[],"collapsed_sections":[],"authorship_tag":"ABX9TyOSki+rKHBfg+GZPAPFGLy+"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"code","execution_count":null,"metadata":{"id":"i52hvbIsnkTO"},"outputs":[],"source":["import numpy as np\n","import tensorflow as tf\n","import matplotlib.pyplot as plt"]},{"cell_type":"markdown","source":["# Preparazione dati"],"metadata":{"id":"Y1ZZvgWsmCvh"}},{"cell_type":"code","source":["# Carichiamo il dataset MNIST\n","# - train_images sono le immagini per la fase di addestramento\n","# - train_labels sono le etichette associate a queste immagini (numeri da 0 a 9) \n","\n","# test_images e test_labels sono simili a train_images e train_labels ma costituiscono \n","# i dati per la fase di test (ne parleremo dopo)\n","\n","(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()"],"metadata":{"id":"R_8lwtovTtrE","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1647948566016,"user_tz":-60,"elapsed":619,"user":{"displayName":"Gianluca Amato","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhEmlMukD8qDnxG1PlDxK7Dzm1rjUKZSz0BhiJc9w=s64","userId":"18269286707108730791"}},"outputId":"25dd8fb6-4b54-411c-ec63-f71093385f86"},"execution_count":null,"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":["# Occorre trasformare le etichette dal formato numerico originale ad un formato\n","# confrontabile con l'output del percettrone. Usiamo il metodo predefinito di\n","# tf.keras.utils.to_categorical.\n","\n","train_labels_ok = tf.keras.utils.to_categorical(train_labels)\n","test_labels_ok = tf.keras.utils.to_categorical(test_labels)"],"metadata":{"id":"UGt-pP9DgCyY"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# È prassi fornire i dati in input in maniera normalizzata, come numeri compresi\n","# tra 0 ed 1. Pertanto, anche se non strettamente necessario, dividiamo tutti i\n","# numeri che compongono una immagine per 255.\n","\n","train_images_ok = train_images / 255.0\n","test_images_ok = test_images / 255.0"],"metadata":{"id":"PU7lzXaZgxzI","executionInfo":{"status":"ok","timestamp":1647948702600,"user_tz":-60,"elapsed":797,"user":{"displayName":"Gianluca Amato","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhEmlMukD8qDnxG1PlDxK7Dzm1rjUKZSz0BhiJc9w=s64","userId":"18269286707108730791"}}},"execution_count":4,"outputs":[]},{"cell_type":"markdown","source":["# La prima rete"],"metadata":{"id":"AoMYAAdaBqDp"}},{"cell_type":"code","source":["# Costruiamo una rete neurale simile al percettrone. Non è esattamente uguale perché la funzione\n","# di attivazione hard_sigmoid è simile ma non identica alla step function usata nel percettrone.\n","# Il primo strato (Flatten) ha lo copo di trasformare una immagine di 28 x 28 pixel in un unico vettore\n","# di 784 elementi, il secondo (Dense) è lo strato di neuroni. Ci sono 10 neuroni, ognuno connesso\n","# a tutti i 784 pixel dell'immagine.\n","\n","network = tf.keras.models.Sequential([\n"," tf.keras.layers.Flatten(input_shape=(28, 28)),\n"," tf.keras.layers.Dense(10, activation='hard_sigmoid')\n","])"],"metadata":{"id":"ijqRtHB-dbLc","executionInfo":{"status":"ok","timestamp":1647948759785,"user_tz":-60,"elapsed":577,"user":{"displayName":"Gianluca Amato","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhEmlMukD8qDnxG1PlDxK7Dzm1rjUKZSz0BhiJc9w=s64","userId":"18269286707108730791"}}},"execution_count":6,"outputs":[]},{"cell_type":"code","source":["# Visualizziamo la struttura della rete. Notate che la rete ha 7850 parametri. Ognuno dei 10 neuroni\n","# di output ha infatti 784 pesi (uno per ogni pixel) ed un valore di bias. In totale quindi sono\n","# (784 + 1) * 10 = 7850 pesi. Notare che lo strato Flatten eseguo un compito fisso e non ha\n","# nessun peso associato.\n","\n","network.summary()"],"metadata":{"id":"LJQ31oMQbUl2","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1647948761205,"user_tz":-60,"elapsed":13,"user":{"displayName":"Gianluca Amato","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhEmlMukD8qDnxG1PlDxK7Dzm1rjUKZSz0BhiJc9w=s64","userId":"18269286707108730791"}},"outputId":"fed097f8-5c2a-46a4-f273-20c34ff55557"},"execution_count":7,"outputs":[{"output_type":"stream","name":"stdout","text":["Model: \"sequential\"\n","_________________________________________________________________\n"," Layer (type) Output Shape Param # \n","=================================================================\n"," flatten (Flatten) (None, 784) 0 \n"," \n"," dense (Dense) (None, 10) 7850 \n"," \n","=================================================================\n","Total params: 7,850\n","Trainable params: 7,850\n","Non-trainable params: 0\n","_________________________________________________________________\n"]}]},{"cell_type":"code","source":["# Prima di poter usare una rete, bisogna indicare dei parametri addizionali:\n","# - una funzione di loss, che specifica come valutare le differenze tra il vero valore degli\n","# output e quello predetto (mse = scarto quadrarico medio)\n","# - l'algoritmo di ottimizzazione che viene usato per aggiornare i pesi della rete \n","# nel tentativodi ridurre la funzione di loss (sgd = stochastic gradient descend)\n","# - metriche da visualizzare durante l'addestramento (in questo caso visualizziamo l'accuratezza, la\n","# percentuale di istanze classificate correttamente nell'insieme di addestramento)\n","\n","network.compile(optimizer='sgd', loss='mse', metrics=['accuracy'])"],"metadata":{"id":"ldsTGQkmef5M","executionInfo":{"status":"ok","timestamp":1647948763104,"user_tz":-60,"elapsed":244,"user":{"displayName":"Gianluca Amato","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhEmlMukD8qDnxG1PlDxK7Dzm1rjUKZSz0BhiJc9w=s64","userId":"18269286707108730791"}}},"execution_count":8,"outputs":[]},{"cell_type":"code","source":["# Lanciamo l'addestramento della rete:\n","# - batch_size è il numero di istanze su cui addestrare i pesi as ogni passo\n","# - epochs è il numero di volte per cui ripetere l'addestramento sull'intero\n","# insieme di training (ogni volta usando come punto di partenza i pesi trovati\n","# nell'epoca precedente)\n","# Restituisce la storia dell'addestramento\n","\n","history = network.fit(train_images_ok, train_labels_ok, epochs=15, batch_size=128)"],"metadata":{"id":"Bf9mOwmyfc39","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1647948785150,"user_tz":-60,"elapsed":20025,"user":{"displayName":"Gianluca Amato","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhEmlMukD8qDnxG1PlDxK7Dzm1rjUKZSz0BhiJc9w=s64","userId":"18269286707108730791"}},"outputId":"fe33cb1a-5a0d-48f0-94fa-979dc1efdf73"},"execution_count":9,"outputs":[{"output_type":"stream","name":"stdout","text":["Epoch 1/15\n","469/469 [==============================] - 2s 3ms/step - loss: 0.1625 - accuracy: 0.0907\n","Epoch 2/15\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0993 - accuracy: 0.2483\n","Epoch 3/15\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0890 - accuracy: 0.4139\n","Epoch 4/15\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0834 - accuracy: 0.5260\n","Epoch 5/15\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0790 - accuracy: 0.5973\n","Epoch 6/15\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0753 - accuracy: 0.6407\n","Epoch 7/15\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0721 - accuracy: 0.6712\n","Epoch 8/15\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0692 - accuracy: 0.6950\n","Epoch 9/15\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0667 - accuracy: 0.7138\n","Epoch 10/15\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0645 - accuracy: 0.7291\n","Epoch 11/15\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0625 - accuracy: 0.7394\n","Epoch 12/15\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0607 - accuracy: 0.7488\n","Epoch 13/15\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0591 - accuracy: 0.7575\n","Epoch 14/15\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0576 - accuracy: 0.7636\n","Epoch 15/15\n","469/469 [==============================] - 2s 4ms/step - loss: 0.0562 - accuracy: 0.7693\n"]}]},{"cell_type":"code","source":["# Valutiamo adesso il funzionamento della rete su immagini nuove, che non fanno\n","# parte dell'insieme di addestramento. Usiamo a tale scopo il metodo evaluate\n","# e l'insieme di test. Notiamo che l'accuratezza è simile a quella sull'insieme\n","# di addestramento, ma non sarà sempre così.\n","\n","network.evaluate(test_images_ok, test_labels_ok)"],"metadata":{"id":"aNpBfBmwk3Ee","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1647948821395,"user_tz":-60,"elapsed":758,"user":{"displayName":"Gianluca Amato","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhEmlMukD8qDnxG1PlDxK7Dzm1rjUKZSz0BhiJc9w=s64","userId":"18269286707108730791"}},"outputId":"5f47b561-5ead-4cf9-abba-718482934b1d"},"execution_count":10,"outputs":[{"output_type":"stream","name":"stdout","text":["313/313 [==============================] - 1s 2ms/step - loss: 0.0550 - accuracy: 0.7797\n"]},{"output_type":"execute_result","data":{"text/plain":["[0.055031999945640564, 0.779699981212616]"]},"metadata":{},"execution_count":10}]},{"cell_type":"code","source":["# Definiamo un funzione per visualizzare l'andamento dell'errore di addestramento\n","# e della funzione di loss nel corso delle epoche.\n","\n","def display_loss_and_accuracy(history):\n"," history_dict = history.history\n"," loss_values = history_dict['loss']\n"," accuracy_values = history_dict['accuracy']\n"," epochs = range(1, len(loss_values) + 1)\n","\n"," plt.plot(epochs, loss_values, 'bo', label='Training loss')\n"," plt.title('Training loss w.r.t epochs')\n"," plt.xlabel('Epochs')\n"," plt.ylabel('Loss')\n"," plt.legend()\n"," plt.show()\n","\n"," plt.plot(epochs, accuracy_values, 'bo', label='Accuracy')\n"," plt.title('Accuracy w.r.t. epochs')\n"," plt.xlabel('Epochs')\n"," plt.ylabel('Accuracy')\n"," plt.legend()\n"," plt.show()"],"metadata":{"id":"Npq2B-cdtew0","executionInfo":{"status":"ok","timestamp":1647948837340,"user_tz":-60,"elapsed":248,"user":{"displayName":"Gianluca Amato","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhEmlMukD8qDnxG1PlDxK7Dzm1rjUKZSz0BhiJc9w=s64","userId":"18269286707108730791"}}},"execution_count":12,"outputs":[]},{"cell_type":"code","source":["display_loss_and_accuracy (history)"],"metadata":{"id":"7ubrN-ehSgAt","colab":{"base_uri":"https://localhost:8080/","height":573},"executionInfo":{"status":"ok","timestamp":1647948840115,"user_tz":-60,"elapsed":639,"user":{"displayName":"Gianluca Amato","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhEmlMukD8qDnxG1PlDxK7Dzm1rjUKZSz0BhiJc9w=s64","userId":"18269286707108730791"}},"outputId":"76657101-a512-4ddd-9d32-3e7e98d65e9c"},"execution_count":13,"outputs":[{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"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\n"},"metadata":{"needs_background":"light"}},{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"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\n"},"metadata":{"needs_background":"light"}}]},{"cell_type":"markdown","source":["# Verso una rete più efficiente"],"metadata":{"id":"iyHP58VCglWk"}},{"cell_type":"code","source":["# Iniziamo semplicemente aumentando il numero di epoche. L'accuratezza aumenta,\n","# ma sempre più lentamente quanto più si va avanti con le epoche. \n","\n","network2 = tf.keras.models.Sequential([\n"," tf.keras.layers.Flatten(input_shape=(28, 28)),\n"," tf.keras.layers.Dense(10, activation='hard_sigmoid')\n","])\n","network2.compile(optimizer='sgd', loss='mse', metrics=['accuracy'])\n","history2 = network2.fit(train_images_ok, train_labels_ok, epochs=50, batch_size=128)"],"metadata":{"id":"6sySKWJMgwnp","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1647948932906,"user_tz":-60,"elapsed":72136,"user":{"displayName":"Gianluca Amato","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhEmlMukD8qDnxG1PlDxK7Dzm1rjUKZSz0BhiJc9w=s64","userId":"18269286707108730791"}},"outputId":"1677a9ae-43db-4e36-e234-6b7d4a397e04"},"execution_count":14,"outputs":[{"output_type":"stream","name":"stdout","text":["Epoch 1/50\n","469/469 [==============================] - 2s 3ms/step - loss: 0.1492 - accuracy: 0.1312\n","Epoch 2/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0974 - accuracy: 0.2821\n","Epoch 3/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0879 - accuracy: 0.4385\n","Epoch 4/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0826 - accuracy: 0.5450\n","Epoch 5/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0783 - accuracy: 0.6087\n","Epoch 6/50\n","469/469 [==============================] - 2s 4ms/step - loss: 0.0747 - accuracy: 0.6500\n","Epoch 7/50\n","469/469 [==============================] - 3s 6ms/step - loss: 0.0715 - accuracy: 0.6800\n","Epoch 8/50\n","469/469 [==============================] - 2s 5ms/step - loss: 0.0687 - accuracy: 0.7012\n","Epoch 9/50\n","469/469 [==============================] - 3s 6ms/step - loss: 0.0663 - accuracy: 0.7190\n","Epoch 10/50\n","469/469 [==============================] - 3s 6ms/step - loss: 0.0641 - accuracy: 0.7328\n","Epoch 11/50\n","469/469 [==============================] - 2s 4ms/step - loss: 0.0621 - accuracy: 0.7439\n","Epoch 12/50\n","469/469 [==============================] - 2s 4ms/step - loss: 0.0604 - accuracy: 0.7542\n","Epoch 13/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0587 - accuracy: 0.7611\n","Epoch 14/50\n","469/469 [==============================] - 2s 4ms/step - loss: 0.0573 - accuracy: 0.7677\n","Epoch 15/50\n","469/469 [==============================] - 2s 3ms/step - loss: 0.0560 - accuracy: 0.7741\n","Epoch 16/50\n","469/469 [==============================] - 2s 3ms/step - loss: 0.0547 - accuracy: 0.7789\n","Epoch 17/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0536 - accuracy: 0.7837\n","Epoch 18/50\n","469/469 [==============================] - 2s 4ms/step - loss: 0.0526 - accuracy: 0.7880\n","Epoch 19/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0516 - accuracy: 0.7919\n","Epoch 20/50\n","469/469 [==============================] - 2s 3ms/step - loss: 0.0507 - accuracy: 0.7962\n","Epoch 21/50\n","469/469 [==============================] - 2s 4ms/step - loss: 0.0499 - accuracy: 0.7991\n","Epoch 22/50\n","469/469 [==============================] - 2s 3ms/step - loss: 0.0491 - accuracy: 0.8020\n","Epoch 23/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0483 - accuracy: 0.8045\n","Epoch 24/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0476 - accuracy: 0.8070\n","Epoch 25/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0470 - accuracy: 0.8095\n","Epoch 26/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0464 - accuracy: 0.8114\n","Epoch 27/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0458 - accuracy: 0.8135\n","Epoch 28/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0452 - accuracy: 0.8148\n","Epoch 29/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0447 - accuracy: 0.8164\n","Epoch 30/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0442 - accuracy: 0.8178\n","Epoch 31/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0437 - accuracy: 0.8193\n","Epoch 32/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0433 - accuracy: 0.8207\n","Epoch 33/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0428 - accuracy: 0.8221\n","Epoch 34/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0424 - accuracy: 0.8229\n","Epoch 35/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0420 - accuracy: 0.8241\n","Epoch 36/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0416 - accuracy: 0.8254\n","Epoch 37/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0413 - accuracy: 0.8266\n","Epoch 38/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0409 - accuracy: 0.8277\n","Epoch 39/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0406 - accuracy: 0.8290\n","Epoch 40/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0402 - accuracy: 0.8300\n","Epoch 41/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0399 - accuracy: 0.8311\n","Epoch 42/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0396 - accuracy: 0.8320\n","Epoch 43/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0393 - accuracy: 0.8328\n","Epoch 44/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0391 - accuracy: 0.8338\n","Epoch 45/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0388 - accuracy: 0.8346\n","Epoch 46/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0385 - accuracy: 0.8353\n","Epoch 47/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0383 - accuracy: 0.8358\n","Epoch 48/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0380 - accuracy: 0.8365\n","Epoch 49/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0378 - accuracy: 0.8374\n","Epoch 50/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0376 - accuracy: 0.8381\n"]}]},{"cell_type":"code","source":["network2.evaluate(test_images_ok, test_labels_ok)"],"metadata":{"id":"NFIOJKQI0dGd","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1647949013896,"user_tz":-60,"elapsed":1296,"user":{"displayName":"Gianluca Amato","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhEmlMukD8qDnxG1PlDxK7Dzm1rjUKZSz0BhiJc9w=s64","userId":"18269286707108730791"}},"outputId":"8215975d-2104-4e00-f247-68a3d919e47c"},"execution_count":15,"outputs":[{"output_type":"stream","name":"stdout","text":["313/313 [==============================] - 1s 2ms/step - loss: 0.0366 - accuracy: 0.8466\n"]},{"output_type":"execute_result","data":{"text/plain":["[0.03662368655204773, 0.8465999960899353]"]},"metadata":{},"execution_count":15}]},{"cell_type":"code","source":["display_loss_and_accuracy(history2)"],"metadata":{"id":"9BhPFJSNiee6","colab":{"base_uri":"https://localhost:8080/","height":573},"executionInfo":{"status":"ok","timestamp":1647949015860,"user_tz":-60,"elapsed":755,"user":{"displayName":"Gianluca Amato","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhEmlMukD8qDnxG1PlDxK7Dzm1rjUKZSz0BhiJc9w=s64","userId":"18269286707108730791"}},"outputId":"ceffcd34-1af2-42eb-94c9-fd9289b5803c"},"execution_count":16,"outputs":[{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"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J0modgPnRcSvalsls8HBXUxmZpbJXUxmZpapYbqY9t9//5gwYUKtq2FmNqgsW7bsdxExJmtbwwSICRMm0NXVVetqmJkNKpLWltrmLiYzM8vkAGFmZpkcIMzMLFPD5CDMrH5t27aN7u5uXn311d53tlyMHDmScePGMWzYsD4f4wBhZrnr7u5mr732YsKECZS+75PlJSJYv3493d3dTJw4sc/HNX0X06JFMGECDBmS/F20qLcjzKxSr776Kq2trQ4ONSKJ1tbWiltwTd2CWLQI5syBrentZNauTdYBOjtLH2dmlXNwqK3+vP9N3YKYN++N4NBj69ak3Mys2TV1gHj66crKzWxwWr9+Pe3t7bS3t/O2t72NsWPHvr7+2muvlT22q6uLCy64oNfXOPbYY6tS13vvvZeTTz65Ks+1u5o6QIzPvA1L6XIzGxjVzg22trayfPlyli9fzrnnnstFF130+vrw4cPZvn17yWM7Ojq4+uqre32NBx54YPcqWYeaOkDMnw+jRr25bNSopNzMaqMnN7h2LUS8kRus9gUks2fP5txzz+Woo47i4osv5qGHHuKYY45h2rRpHHvssTz55JPAm3/RX3HFFXziE5/g+OOPZ9KkSW8KHKNHj359/+OPP57TTz+dQw45hM7OTnpmzb799ts55JBDOOKII7jgggt6bSls2LCB0047jalTp3L00Ufz6KOPAnDfffe93gKaNm0amzdv5rnnnuO4446jvb2dww47jPvvv3+336OmTlL3JKLnzUu6lcaPT4KDE9RmtVMuN1jt/5vd3d088MADtLS0sGnTJu6//36GDh3KXXfdxWWXXcatt966yzErV67knnvuYfPmzRx88MGcd955u4wt+NWvfsWKFSs48MADmTFjBr/4xS/o6OjgnHPOYenSpUycOJFZs2b1Wr/LL7+cadOmcdttt3H33Xfz8Y9/nOXLl/OVr3yFBQsWMGPGDLZs2cLIkSNZuHAhJ554IvPmzWPHjh1sLX4T+6GpAwQkHzgHBLP6MZC5wTPOOIOWlhYANm7cyNlnn81vf/tbJLFt27bMYz70oQ8xYsQIRowYwVvf+lZeeOEFxo0b96Z9pk+f/npZe3s7a9asYfTo0UyaNOn1cQizZs1i4cKFZev385///PUgdcIJJ7B+/Xo2bdrEjBkz+NznPkdnZycf/vCHGTduHEceeSSf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\n"},"metadata":{"needs_background":"light"}},{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"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\n"},"metadata":{"needs_background":"light"}}]},{"cell_type":"code","source":["# Aumentiamo il learning rate, ovvero la misura di quanto muoversi lungo la direzione\n","# del gradiente ad ogni passo. Nel parametro optimizer del metodo compile, invece\n","# di usare il metodo predefinito SGD (che ha learning rate 0.001), creiamo una\n","# nuova istanza della classe SGD specificando manualmente il learning rate (0.1).\n","\n","network3 = tf.keras.models.Sequential([\n"," tf.keras.layers.Flatten(input_shape=(28, 28)),\n"," tf.keras.layers.Dense(10, activation='hard_sigmoid')\n","])\n","network3.compile(optimizer=tf.keras.optimizers.SGD(0.1), loss='mse', metrics=['accuracy'])\n","history3 = network3.fit(train_images_ok, train_labels_ok, epochs=50, batch_size=128) "],"metadata":{"id":"DQfxTMRxljk2","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1647949083324,"user_tz":-60,"elapsed":64272,"user":{"displayName":"Gianluca Amato","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhEmlMukD8qDnxG1PlDxK7Dzm1rjUKZSz0BhiJc9w=s64","userId":"18269286707108730791"}},"outputId":"561916fa-534d-4e78-a7f3-0a6148e37e50"},"execution_count":17,"outputs":[{"output_type":"stream","name":"stdout","text":["Epoch 1/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0870 - accuracy: 0.5086\n","Epoch 2/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0574 - accuracy: 0.7503\n","Epoch 3/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0479 - accuracy: 0.8048\n","Epoch 4/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0426 - accuracy: 0.8234\n","Epoch 5/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0392 - accuracy: 0.8333\n","Epoch 6/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0368 - accuracy: 0.8415\n","Epoch 7/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0350 - accuracy: 0.8471\n","Epoch 8/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0336 - accuracy: 0.8516\n","Epoch 9/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0325 - accuracy: 0.8555\n","Epoch 10/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0315 - accuracy: 0.8585\n","Epoch 11/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0307 - accuracy: 0.8613\n","Epoch 12/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0300 - accuracy: 0.8632\n","Epoch 13/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0294 - accuracy: 0.8648\n","Epoch 14/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0288 - accuracy: 0.8665\n","Epoch 15/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0283 - accuracy: 0.8686\n","Epoch 16/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0279 - accuracy: 0.8697\n","Epoch 17/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0275 - accuracy: 0.8709\n","Epoch 18/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0271 - accuracy: 0.8720\n","Epoch 19/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0268 - accuracy: 0.8735\n","Epoch 20/50\n","469/469 [==============================] - 2s 4ms/step - loss: 0.0265 - accuracy: 0.8744\n","Epoch 21/50\n","469/469 [==============================] - 2s 4ms/step - loss: 0.0262 - accuracy: 0.8754\n","Epoch 22/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0259 - accuracy: 0.8763\n","Epoch 23/50\n","469/469 [==============================] - 2s 4ms/step - loss: 0.0257 - accuracy: 0.8773\n","Epoch 24/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0255 - accuracy: 0.8780\n","Epoch 25/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0252 - accuracy: 0.8790\n","Epoch 26/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0250 - accuracy: 0.8794\n","Epoch 27/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0248 - accuracy: 0.8801\n","Epoch 28/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0247 - accuracy: 0.8806\n","Epoch 29/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0245 - accuracy: 0.8814\n","Epoch 30/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0243 - accuracy: 0.8818\n","Epoch 31/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0242 - accuracy: 0.8825\n","Epoch 32/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0240 - accuracy: 0.8831\n","Epoch 33/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0239 - accuracy: 0.8836\n","Epoch 34/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0237 - accuracy: 0.8839\n","Epoch 35/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0236 - accuracy: 0.8844\n","Epoch 36/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0235 - accuracy: 0.8849\n","Epoch 37/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0234 - accuracy: 0.8853\n","Epoch 38/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0233 - accuracy: 0.8856\n","Epoch 39/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0231 - accuracy: 0.8860\n","Epoch 40/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0230 - accuracy: 0.8863\n","Epoch 41/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0229 - accuracy: 0.8867\n","Epoch 42/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0228 - accuracy: 0.8870\n","Epoch 43/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0227 - accuracy: 0.8875\n","Epoch 44/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0227 - accuracy: 0.8878\n","Epoch 45/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0226 - accuracy: 0.8881\n","Epoch 46/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0225 - accuracy: 0.8883\n","Epoch 47/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0224 - accuracy: 0.8887\n","Epoch 48/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0223 - accuracy: 0.8891\n","Epoch 49/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0222 - accuracy: 0.8893\n","Epoch 50/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0222 - accuracy: 0.8894\n"]}]},{"cell_type":"code","source":["network3.evaluate(test_images_ok, test_labels_ok)"],"metadata":{"id":"2EAi-rez1Dcy","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1647949092564,"user_tz":-60,"elapsed":1047,"user":{"displayName":"Gianluca Amato","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhEmlMukD8qDnxG1PlDxK7Dzm1rjUKZSz0BhiJc9w=s64","userId":"18269286707108730791"}},"outputId":"7327dc6a-ce90-4d68-aebd-d66b18abbe01"},"execution_count":18,"outputs":[{"output_type":"stream","name":"stdout","text":["313/313 [==============================] - 1s 2ms/step - loss: 0.0212 - accuracy: 0.8982\n"]},{"output_type":"execute_result","data":{"text/plain":["[0.02118261530995369, 0.8981999754905701]"]},"metadata":{},"execution_count":18}]},{"cell_type":"code","source":["# Ma se si aumenta troppo il learning rate, le cose non vanno molto bene. \n","\n","network4 = tf.keras.models.Sequential([\n"," tf.keras.layers.Flatten(input_shape=(28, 28)),\n"," tf.keras.layers.Dense(10, activation='hard_sigmoid')\n","])\n","network4.compile(optimizer=tf.keras.optimizers.SGD(20), loss='mse', metrics=['accuracy'])\n","history4 = network4.fit(train_images_ok, train_labels_ok, epochs=10, batch_size=128)"],"metadata":{"id":"Ib8ku5F_mPWw","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1647949118475,"user_tz":-60,"elapsed":21214,"user":{"displayName":"Gianluca Amato","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhEmlMukD8qDnxG1PlDxK7Dzm1rjUKZSz0BhiJc9w=s64","userId":"18269286707108730791"}},"outputId":"7d78c728-d6e6-4367-9c3f-99f36ac40796"},"execution_count":19,"outputs":[{"output_type":"stream","name":"stdout","text":["Epoch 1/10\n","469/469 [==============================] - 2s 3ms/step - loss: 0.0906 - accuracy: 0.2045\n","Epoch 2/10\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0895 - accuracy: 0.2093\n","Epoch 3/10\n","469/469 [==============================] - 2s 4ms/step - loss: 0.0895 - accuracy: 0.2091\n","Epoch 4/10\n","469/469 [==============================] - 2s 3ms/step - loss: 0.0894 - accuracy: 0.2092\n","Epoch 5/10\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0894 - accuracy: 0.2092\n","Epoch 6/10\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0894 - accuracy: 0.2092\n","Epoch 7/10\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0894 - accuracy: 0.2091\n","Epoch 8/10\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0894 - accuracy: 0.2091\n","Epoch 9/10\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0894 - accuracy: 0.2091\n","Epoch 10/10\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0894 - accuracy: 0.2092\n"]}]},{"cell_type":"code","source":["# Oltre a cambiare il learning rate, possiamo cambiare l'algoritmo di ottimizzazione\n","# Qui usiamo ADAM invece di SGD. ADAM cerca di cambia dinamicamente il valroe\n","# del learning rate sulla base della situazione.\n","\n","network5 = tf.keras.models.Sequential([\n"," tf.keras.layers.Flatten(input_shape=(28, 28)),\n"," tf.keras.layers.Dense(10, activation='hard_sigmoid')\n","])\n","network5.compile(optimizer='adam', loss='mse', metrics=['accuracy'])\n","history5 = network5.fit(train_images_ok, train_labels_ok, epochs=50, batch_size=128)"],"metadata":{"id":"WcTtHCWwlPOP","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1647949237288,"user_tz":-60,"elapsed":66600,"user":{"displayName":"Gianluca Amato","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhEmlMukD8qDnxG1PlDxK7Dzm1rjUKZSz0BhiJc9w=s64","userId":"18269286707108730791"}},"outputId":"24d41505-0c3c-4838-c08a-86f6b15484f0"},"execution_count":20,"outputs":[{"output_type":"stream","name":"stdout","text":["Epoch 1/50\n","469/469 [==============================] - 2s 3ms/step - loss: 0.0527 - accuracy: 0.7374\n","Epoch 2/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0266 - accuracy: 0.8756\n","Epoch 3/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0225 - accuracy: 0.8896\n","Epoch 4/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0206 - accuracy: 0.8964\n","Epoch 5/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0195 - accuracy: 0.9010\n","Epoch 6/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0187 - accuracy: 0.9035\n","Epoch 7/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0181 - accuracy: 0.9064\n","Epoch 8/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0176 - accuracy: 0.9079\n","Epoch 9/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0172 - accuracy: 0.9100\n","Epoch 10/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0169 - accuracy: 0.9119\n","Epoch 11/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0166 - accuracy: 0.9129\n","Epoch 12/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0163 - accuracy: 0.9136\n","Epoch 13/50\n","469/469 [==============================] - 2s 4ms/step - loss: 0.0161 - accuracy: 0.9150\n","Epoch 14/50\n","469/469 [==============================] - 2s 4ms/step - loss: 0.0159 - accuracy: 0.9158\n","Epoch 15/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0157 - accuracy: 0.9169\n","Epoch 16/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0156 - accuracy: 0.9179\n","Epoch 17/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0154 - accuracy: 0.9183\n","Epoch 18/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0153 - accuracy: 0.9190\n","Epoch 19/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0152 - accuracy: 0.9190\n","Epoch 20/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0151 - accuracy: 0.9195\n","Epoch 21/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0150 - accuracy: 0.9199\n","Epoch 22/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0149 - accuracy: 0.9204\n","Epoch 23/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0148 - accuracy: 0.9213\n","Epoch 24/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0148 - accuracy: 0.9212\n","Epoch 25/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0147 - accuracy: 0.9216\n","Epoch 26/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0146 - accuracy: 0.9217\n","Epoch 27/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0146 - accuracy: 0.9219\n","Epoch 28/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0145 - accuracy: 0.9228\n","Epoch 29/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0145 - accuracy: 0.9224\n","Epoch 30/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0144 - accuracy: 0.9227\n","Epoch 31/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0144 - accuracy: 0.9231\n","Epoch 32/50\n","469/469 [==============================] - 2s 4ms/step - loss: 0.0143 - accuracy: 0.9233\n","Epoch 33/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0143 - accuracy: 0.9230\n","Epoch 34/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0143 - accuracy: 0.9234\n","Epoch 35/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0142 - accuracy: 0.9236\n","Epoch 36/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0142 - accuracy: 0.9236\n","Epoch 37/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0141 - accuracy: 0.9241\n","Epoch 38/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0141 - accuracy: 0.9237\n","Epoch 39/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0141 - accuracy: 0.9242\n","Epoch 40/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0141 - accuracy: 0.9244\n","Epoch 41/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0140 - accuracy: 0.9245\n","Epoch 42/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0140 - accuracy: 0.9244\n","Epoch 43/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0140 - accuracy: 0.9245\n","Epoch 44/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0140 - accuracy: 0.9242\n","Epoch 45/50\n","469/469 [==============================] - 1s 2ms/step - loss: 0.0139 - accuracy: 0.9248\n","Epoch 46/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0139 - accuracy: 0.9247\n","Epoch 47/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0139 - accuracy: 0.9247\n","Epoch 48/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0139 - accuracy: 0.9249\n","Epoch 49/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0138 - accuracy: 0.9253\n","Epoch 50/50\n","469/469 [==============================] - 1s 3ms/step - loss: 0.0138 - accuracy: 0.9254\n"]}]},{"cell_type":"code","source":["network5.evaluate(test_images_ok, test_labels_ok)"],"metadata":{"id":"eNZx0hpR2TyE","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1647949240106,"user_tz":-60,"elapsed":851,"user":{"displayName":"Gianluca Amato","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhEmlMukD8qDnxG1PlDxK7Dzm1rjUKZSz0BhiJc9w=s64","userId":"18269286707108730791"}},"outputId":"177723e4-704e-493d-9f45-ebc3d3916fcb"},"execution_count":21,"outputs":[{"output_type":"stream","name":"stdout","text":["313/313 [==============================] - 1s 2ms/step - loss: 0.0143 - accuracy: 0.9210\n"]},{"output_type":"execute_result","data":{"text/plain":["[0.014344210736453533, 0.9210000038146973]"]},"metadata":{},"execution_count":21}]},{"cell_type":"markdown","source":["## Una rete multistrato"],"metadata":{"id":"0rTJm3ltUT-1"}},{"cell_type":"code","source":["# Costruiamo una rete neurale più complessa costituita da due strati e con una \n","# diversa funzione di attivazione.\n","\n","network6 = tf.keras.models.Sequential([\n"," tf.keras.layers.Flatten(input_shape=(28, 28)),\n"," tf.keras.layers.Dense(512, activation='relu'),\n"," tf.keras.layers.Dense(10, activation='softmax')\n","])\n","network6.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n","history6 = network6.fit(train_images_ok, train_labels_ok, epochs=30, batch_size=128)"],"metadata":{"id":"8SWt6Q4XUkBm","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1647949370631,"user_tz":-60,"elapsed":127507,"user":{"displayName":"Gianluca Amato","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhEmlMukD8qDnxG1PlDxK7Dzm1rjUKZSz0BhiJc9w=s64","userId":"18269286707108730791"}},"outputId":"d408a30c-b7e9-4870-bfec-653b356e75fd"},"execution_count":22,"outputs":[{"output_type":"stream","name":"stdout","text":["Epoch 1/30\n","469/469 [==============================] - 5s 10ms/step - loss: 0.2706 - accuracy: 0.9223\n","Epoch 2/30\n","469/469 [==============================] - 4s 9ms/step - loss: 0.1071 - accuracy: 0.9687\n","Epoch 3/30\n","469/469 [==============================] - 4s 9ms/step - loss: 0.0695 - accuracy: 0.9795\n","Epoch 4/30\n","469/469 [==============================] - 4s 9ms/step - loss: 0.0500 - accuracy: 0.9849\n","Epoch 5/30\n","469/469 [==============================] - 4s 9ms/step - loss: 0.0366 - accuracy: 0.9893\n","Epoch 6/30\n","469/469 [==============================] - 4s 9ms/step - loss: 0.0268 - accuracy: 0.9923\n","Epoch 7/30\n","469/469 [==============================] - 5s 10ms/step - loss: 0.0204 - accuracy: 0.9944\n","Epoch 8/30\n","469/469 [==============================] - 4s 9ms/step - loss: 0.0151 - accuracy: 0.9963\n","Epoch 9/30\n","469/469 [==============================] - 4s 9ms/step - loss: 0.0127 - accuracy: 0.9967\n","Epoch 10/30\n","469/469 [==============================] - 4s 8ms/step - loss: 0.0094 - accuracy: 0.9978\n","Epoch 11/30\n","469/469 [==============================] - 4s 9ms/step - loss: 0.0065 - accuracy: 0.9987\n","Epoch 12/30\n","469/469 [==============================] - 4s 9ms/step - loss: 0.0067 - accuracy: 0.9985\n","Epoch 13/30\n","469/469 [==============================] - 4s 9ms/step - loss: 0.0086 - accuracy: 0.9975\n","Epoch 14/30\n","469/469 [==============================] - 4s 9ms/step - loss: 0.0073 - accuracy: 0.9980\n","Epoch 15/30\n","469/469 [==============================] - 4s 9ms/step - loss: 0.0033 - accuracy: 0.9992\n","Epoch 16/30\n","469/469 [==============================] - 5s 10ms/step - loss: 0.0018 - accuracy: 0.9998\n","Epoch 17/30\n","469/469 [==============================] - 4s 9ms/step - loss: 0.0011 - accuracy: 0.9999\n","Epoch 18/30\n","469/469 [==============================] - 4s 9ms/step - loss: 5.9078e-04 - accuracy: 1.0000\n","Epoch 19/30\n","469/469 [==============================] - 4s 9ms/step - loss: 0.0011 - accuracy: 0.9998\n","Epoch 20/30\n","469/469 [==============================] - 4s 9ms/step - loss: 0.0189 - accuracy: 0.9939\n","Epoch 21/30\n","469/469 [==============================] - 5s 10ms/step - loss: 0.0063 - accuracy: 0.9978\n","Epoch 22/30\n","469/469 [==============================] - 4s 9ms/step - loss: 0.0015 - accuracy: 0.9997\n","Epoch 23/30\n","469/469 [==============================] - 4s 9ms/step - loss: 5.7242e-04 - accuracy: 0.9999\n","Epoch 24/30\n","469/469 [==============================] - 4s 8ms/step - loss: 2.3687e-04 - accuracy: 1.0000\n","Epoch 25/30\n","469/469 [==============================] - 4s 8ms/step - loss: 1.7312e-04 - accuracy: 1.0000\n","Epoch 26/30\n","469/469 [==============================] - 4s 9ms/step - loss: 1.4201e-04 - accuracy: 1.0000\n","Epoch 27/30\n","469/469 [==============================] - 4s 9ms/step - loss: 1.2420e-04 - accuracy: 1.0000\n","Epoch 28/30\n","469/469 [==============================] - 4s 9ms/step - loss: 1.0382e-04 - accuracy: 1.0000\n","Epoch 29/30\n","469/469 [==============================] - 4s 9ms/step - loss: 9.0042e-05 - accuracy: 1.0000\n","Epoch 30/30\n","469/469 [==============================] - 4s 9ms/step - loss: 7.8033e-05 - accuracy: 1.0000\n"]}]},{"cell_type":"code","source":["# Il numero di pesi è adesso molto più grande.\n","\n","network6.summary()"],"metadata":{"id":"jKh9JmlLUkBs","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1647949380465,"user_tz":-60,"elapsed":348,"user":{"displayName":"Gianluca Amato","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhEmlMukD8qDnxG1PlDxK7Dzm1rjUKZSz0BhiJc9w=s64","userId":"18269286707108730791"}},"outputId":"93302aa5-afa8-4708-d799-9e098763ee54"},"execution_count":23,"outputs":[{"output_type":"stream","name":"stdout","text":["Model: \"sequential_5\"\n","_________________________________________________________________\n"," Layer (type) Output Shape Param # \n","=================================================================\n"," flatten_5 (Flatten) (None, 784) 0 \n"," \n"," dense_5 (Dense) (None, 512) 401920 \n"," \n"," dense_6 (Dense) (None, 10) 5130 \n"," \n","=================================================================\n","Total params: 407,050\n","Trainable params: 407,050\n","Non-trainable params: 0\n","_________________________________________________________________\n"]}]},{"cell_type":"code","source":["# Notare che l'accuratezza sull'insieme di test adesso è minore che sull'insieme\n","# di addestramento.\n","\n","network6.evaluate(test_images_ok, test_labels_ok)"],"metadata":{"id":"UN4rFly9d_S_","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1647949384108,"user_tz":-60,"elapsed":1556,"user":{"displayName":"Gianluca Amato","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhEmlMukD8qDnxG1PlDxK7Dzm1rjUKZSz0BhiJc9w=s64","userId":"18269286707108730791"}},"outputId":"4c80ba03-245c-4fbf-f20d-d7316ecacece"},"execution_count":24,"outputs":[{"output_type":"stream","name":"stdout","text":["313/313 [==============================] - 1s 3ms/step - loss: 0.0766 - accuracy: 0.9831\n"]},{"output_type":"execute_result","data":{"text/plain":["[0.07663792371749878, 0.9830999970436096]"]},"metadata":{},"execution_count":24}]},{"cell_type":"code","source":["# Deteminiamo quali sono le immagini dove la nostra rete sbaglia (nell'insieme di test).\n","\n","test_predictions6 = network6.predict(test_images_ok)\n","np.where([ np.argmax(x) for x in test_predictions6] != test_labels)"],"metadata":{"id":"bNHeVJuKeWoJ","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1647949388758,"user_tz":-60,"elapsed":1685,"user":{"displayName":"Gianluca Amato","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhEmlMukD8qDnxG1PlDxK7Dzm1rjUKZSz0BhiJc9w=s64","userId":"18269286707108730791"}},"outputId":"ee1b56ec-4b81-4925-ab4d-639a04354ce5"},"execution_count":25,"outputs":[{"output_type":"execute_result","data":{"text/plain":["(array([ 115, 149, 247, 321, 340, 445, 449, 582, 619, 684, 691,\n"," 720, 882, 947, 951, 956, 965, 1014, 1039, 1112, 1156, 1226,\n"," 1232, 1242, 1247, 1319, 1328, 1393, 1395, 1494, 1522, 1530, 1549,\n"," 1609, 1681, 1754, 1790, 1878, 1901, 1941, 1984, 1987, 2004, 2035,\n"," 2053, 2070, 2098, 2109, 2118, 2130, 2135, 2182, 2272, 2293, 2387,\n"," 2408, 2488, 2597, 2607, 2648, 2654, 2720, 2730, 2810, 2877, 2915,\n"," 2921, 2939, 2953, 2995, 3073, 3117, 3225, 3289, 3422, 3503, 3520,\n"," 3558, 3559, 3567, 3597, 3751, 3780, 3796, 3808, 3818, 3838, 3853,\n"," 3906, 3943, 3976, 3985, 4027, 4065, 4078, 4163, 4176, 4199, 4201,\n"," 4248, 4271, 4289, 4294, 4425, 4497, 4536, 4601, 4731, 4740, 4761,\n"," 4807, 4823, 4860, 4879, 4880, 4956, 5331, 5457, 5642, 5676, 5734,\n"," 5749, 5936, 5937, 5955, 5972, 5973, 5981, 5982, 5997, 6011, 6023,\n"," 6024, 6059, 6555, 6559, 6571, 6574, 6576, 6597, 6625, 6755, 6783,\n"," 6847, 7216, 8062, 8094, 8246, 8277, 8311, 8325, 8527, 9009, 9015,\n"," 9024, 9587, 9634, 9664, 9679, 9692, 9700, 9729, 9745, 9749, 9770,\n"," 9792, 9793, 9839, 9944]),)"]},"metadata":{},"execution_count":25}]},{"cell_type":"code","source":["# Controlliamo ad esempio l'immagine 149\n","\n","print(\"Predizione: \", np.argmax(test_predictions6[149]))\n","print(\"Valore effettivo: \", test_labels[149])\n","\n","plt.imshow(test_images_ok[149], cmap= plt.cm.binary)"],"metadata":{"id":"t9MnUYDAeWoQ","colab":{"base_uri":"https://localhost:8080/","height":317},"executionInfo":{"status":"ok","timestamp":1647949403933,"user_tz":-60,"elapsed":269,"user":{"displayName":"Gianluca Amato","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhEmlMukD8qDnxG1PlDxK7Dzm1rjUKZSz0BhiJc9w=s64","userId":"18269286707108730791"}},"outputId":"c3181c46-cfaf-4171-b35b-9929884a8755"},"execution_count":27,"outputs":[{"output_type":"stream","name":"stdout","text":["Predizione: 9\n","Valore effettivo: 2\n"]},{"output_type":"execute_result","data":{"text/plain":[""]},"metadata":{},"execution_count":27},{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"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\n"},"metadata":{"needs_background":"light"}}]},{"cell_type":"markdown","source":["# Esercizio: classificazione del set di dati CIFAR 10\n","\n","CIFAR 10 è un insieme di 60.000 immagini 32x32 a colori, di cui 50.000 per l'addestramento e 10.000 per il test. Ogni immagine può appartenere ad una di 10 possibili categorie: \n","\n","* 0 \tairplane\n","* 1 \tautomobile\n","* 2 \tbird\n","* 3 \tcat\n","* 4 \tdeer\n","* 5 \tdog\n","* 6 \tfrog\n","* 7 \thorse\n","* 8 \tship\n","* 9 \ttruck"],"metadata":{"id":"Xh3-lMtQ8Fca"}},{"cell_type":"markdown","source":["## Preparazione dati"],"metadata":{"id":"ZuE5CLEw_Elt"}},{"cell_type":"code","source":["# Caricamento dell'insieme di dati\n","\n","(cifar_train_images, cifar_train_labels), (cifar_test_images, cifar_test_labels) = tf.keras.datasets.cifar10.load_data()"],"metadata":{"id":"qgacOOI48rqa","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1647949414444,"user_tz":-60,"elapsed":4859,"user":{"displayName":"Gianluca Amato","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhEmlMukD8qDnxG1PlDxK7Dzm1rjUKZSz0BhiJc9w=s64","userId":"18269286707108730791"}},"outputId":"eb6545b0-2521-42cd-c354-1e57061e00de"},"execution_count":28,"outputs":[{"output_type":"stream","name":"stdout","text":["Downloading data from https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz\n","170500096/170498071 [==============================] - 2s 0us/step\n","170508288/170498071 [==============================] - 2s 0us/step\n"]}]},{"cell_type":"code","source":["# cifar_train_images è un array a 4 dimensioni. L'ultima dimensione è il canale colore (Red, Green e Blue)\n","\n","cifar_train_images.shape"],"metadata":{"id":"B6wVoe-p8zT1","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1647949417975,"user_tz":-60,"elapsed":228,"user":{"displayName":"Gianluca Amato","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhEmlMukD8qDnxG1PlDxK7Dzm1rjUKZSz0BhiJc9w=s64","userId":"18269286707108730791"}},"outputId":"243005b0-dc1d-4428-df34-2f39f00cae95"},"execution_count":29,"outputs":[{"output_type":"execute_result","data":{"text/plain":["(50000, 32, 32, 3)"]},"metadata":{},"execution_count":29}]},{"cell_type":"code","source":["plt.imshow(cifar_train_images[0])"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":283},"id":"kLda9kQkLGpN","executionInfo":{"status":"ok","timestamp":1647949420220,"user_tz":-60,"elapsed":384,"user":{"displayName":"Gianluca Amato","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhEmlMukD8qDnxG1PlDxK7Dzm1rjUKZSz0BhiJc9w=s64","userId":"18269286707108730791"}},"outputId":"a049e98d-34c1-4131-b29d-8a2717711efb"},"execution_count":30,"outputs":[{"output_type":"execute_result","data":{"text/plain":[""]},"metadata":{},"execution_count":30},{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"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\n"},"metadata":{"needs_background":"light"}}]},{"cell_type":"code","source":[""],"metadata":{"id":"-7xFYZWCLJo-"},"execution_count":null,"outputs":[]}]}