diff --git a/main.ipynb b/main.ipynb new file mode 100644 index 00000000..dc8573c3 --- /dev/null +++ b/main.ipynb @@ -0,0 +1,464 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "initial_id", + "metadata": { + "collapsed": true, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "initial_id", + "outputId": "f70acecb-9384-400b-a51d-ae28ae08690e" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Downloading data from https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz\n", + "\u001b[1m170498071/170498071\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 0us/step\n" + ] + } + ], + "source": [ + "\n", + "import numpy as np\n", + "from tensorflow import keras\n", + "from tensorflow.keras import layers\n", + "\n", + "#Importing dataset from CIFAR\n", + "from tensorflow.keras.datasets import cifar10\n", + "\n", + "\n", + "# Load CIFAR-10 dataset\n", + "(x_train, y_train), (x_test, y_test) = cifar10.load_data()\n" + ] + }, + { + "cell_type": "code", + "source": [ + "# TO DO: split 10% as x_test and y_test\n", + "# TO DO: split 10% as x_test and y_test" + ], + "metadata": { + "id": "YXLEBY_dR3WW" + }, + "id": "YXLEBY_dR3WW", + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "\"\"\"\n", + "## Prepare the data\n", + "\"\"\"\n", + "\n", + "# Model / data parameters\n", + "num_classes = 10\n", + "input_shape = (32, 32, 3)\n", + "\n", + "# Scale images to the [0, 1] range\n", + "x_train = x_train.astype(\"float32\") / 255\n", + "x_test = x_test.astype(\"float32\") / 255\n", + "\n", + "print(\"x_train shape:\", x_train.shape)\n", + "print(x_train.shape[0], \"train samples\")\n", + "print(x_test.shape[0], \"test samples\")" + ], + "metadata": { + "id": "ybCeahZeRzNy", + "outputId": "b2918ad2-acea-46b9-9907-5b9fae944393", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "id": "ybCeahZeRzNy", + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "x_train shape: (50000, 32, 32, 3)\n", + "50000 train samples\n", + "10000 test samples\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "# convert class vectors to binary class matrices\n", + "from tensorflow.keras.utils import to_categorical\n", + "\n", + "y_train_cat = to_categorical(y_train, num_classes)\n", + "y_test_cat = to_categorical(y_test, num_classes)" + ], + "metadata": { + "id": "i52IWTZHTej9" + }, + "id": "i52IWTZHTej9", + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "#checking shape of y after one-hot encoding\n", + "y_train_cat.shape" + ], + "metadata": { + "id": "5-MOpB56Ttn2", + "outputId": "0f305e02-6697-4f97-ee11-3cdbd3a860c8", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "id": "5-MOpB56Ttn2", + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(50000, 10)" + ] + }, + "metadata": {}, + "execution_count": 12 + } + ] + }, + { + "cell_type": "code", + "source": [ + "#checking types after one-hot encoding\n", + "y_train_cat.dtype" + ], + "metadata": { + "id": "trLbdlfTUJ-F", + "outputId": "6fb1704d-0bdc-488a-a7fc-0477eefe2e98", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "id": "trLbdlfTUJ-F", + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "dtype('float64')" + ] + }, + "metadata": {}, + "execution_count": 9 + } + ] + }, + { + "cell_type": "code", + "source": [ + "\"\"\"\n", + "## Build the model\n", + "\"\"\"\n", + "\n", + "model1 = keras.Sequential(\n", + " [\n", + " keras.Input(shape=input_shape),\n", + " layers.Conv2D(32, kernel_size=(3, 3), activation=\"relu\"),\n", + " layers.Conv2D(32, kernel_size=(3, 3), activation=\"relu\"),\n", + " layers.MaxPooling2D(pool_size=(2, 2)),\n", + " layers.Conv2D(64, kernel_size=(3, 3), activation=\"relu\"),\n", + " layers.Conv2D(64, kernel_size=(3, 3), activation=\"relu\"),\n", + " layers.MaxPooling2D(pool_size=(2, 2)),\n", + " layers.Conv2D(64, kernel_size=(3, 3), activation=\"relu\"),\n", + " layers.MaxPooling2D(pool_size=(2, 2)),\n", + " layers.Flatten(),\n", + " layers.Dropout(0.5),\n", + " layers.Dense(num_classes, activation=\"softmax\"),\n", + " ]\n", + ")\n", + "\n", + "model1.summary()\n", + "\n" + ], + "metadata": { + "id": "jtrBtsGGTN6b", + "outputId": "2dce3b71-aea4-488c-ec94-ef75b2081e1a", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 481 + } + }, + "id": "jtrBtsGGTN6b", + "execution_count": null, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1mModel: \"sequential\"\u001b[0m\n" + ], + "text/html": [ + "
Model: \"sequential\"\n",
+ "\n"
+ ]
+ },
+ "metadata": {}
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
+ "┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n",
+ "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
+ "│ conv2d (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m30\u001b[0m, \u001b[38;5;34m30\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m896\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ conv2d_1 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m9,248\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ max_pooling2d (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ conv2d_2 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m12\u001b[0m, \u001b[38;5;34m12\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m18,496\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ conv2d_3 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m10\u001b[0m, \u001b[38;5;34m10\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m36,928\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ max_pooling2d_1 (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m5\u001b[0m, \u001b[38;5;34m5\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ conv2d_4 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m3\u001b[0m, \u001b[38;5;34m3\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m36,928\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ max_pooling2d_2 (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m, \u001b[38;5;34m1\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ flatten (\u001b[38;5;33mFlatten\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ dropout (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ dense (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m10\u001b[0m) │ \u001b[38;5;34m650\u001b[0m │\n",
+ "└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
+ ],
+ "text/html": [
+ "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n", + "┃ Layer (type) ┃ Output Shape ┃ Param # ┃\n", + "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n", + "│ conv2d (Conv2D) │ (None, 30, 30, 32) │ 896 │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ conv2d_1 (Conv2D) │ (None, 28, 28, 32) │ 9,248 │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ max_pooling2d (MaxPooling2D) │ (None, 14, 14, 32) │ 0 │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ conv2d_2 (Conv2D) │ (None, 12, 12, 64) │ 18,496 │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ conv2d_3 (Conv2D) │ (None, 10, 10, 64) │ 36,928 │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ max_pooling2d_1 (MaxPooling2D) │ (None, 5, 5, 64) │ 0 │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ conv2d_4 (Conv2D) │ (None, 3, 3, 64) │ 36,928 │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ max_pooling2d_2 (MaxPooling2D) │ (None, 1, 1, 64) │ 0 │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ flatten (Flatten) │ (None, 64) │ 0 │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ dropout (Dropout) │ (None, 64) │ 0 │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ dense (Dense) │ (None, 10) │ 650 │\n", + "└─────────────────────────────────┴────────────────────────┴───────────────┘\n", + "\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m103,146\u001b[0m (402.91 KB)\n" + ], + "text/html": [ + "
Total params: 103,146 (402.91 KB)\n", + "\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m103,146\u001b[0m (402.91 KB)\n" + ], + "text/html": [ + "
Trainable params: 103,146 (402.91 KB)\n", + "\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n" + ], + "text/html": [ + "
Non-trainable params: 0 (0.00 B)\n", + "\n" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [ + "\"\"\"\n", + "## Train the model\n", + "\"\"\"\n", + "\n", + "batch_size = 128\n", + "epochs = 15\n", + "\n", + "model1.compile(\n", + " loss=\"categorical_crossentropy\",\n", + " optimizer=\"adam\",\n", + " metrics=[\"accuracy\"])\n", + "\n", + "model1.fit(\n", + " x_train, y_train_cat,\n", + " batch_size=batch_size,\n", + " epochs=epochs,\n", + " validation_split=0.1)\n", + "\n" + ], + "metadata": { + "id": "o6Bmg0sqWwTt", + "outputId": "7ffd7381-3fa7-4ea3-bb74-d78f413ce65a", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "id": "o6Bmg0sqWwTt", + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 1/15\n", + "\u001b[1m352/352\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 22ms/step - accuracy: 0.1896 - loss: 2.1313 - val_accuracy: 0.4260 - val_loss: 1.5931\n", + "Epoch 2/15\n", + "\u001b[1m352/352\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 9ms/step - accuracy: 0.4014 - loss: 1.6289 - val_accuracy: 0.4584 - val_loss: 1.5245\n", + "Epoch 3/15\n", + "\u001b[1m352/352\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 9ms/step - accuracy: 0.4753 - loss: 1.4501 - val_accuracy: 0.5580 - val_loss: 1.2213\n", + "Epoch 4/15\n", + "\u001b[1m352/352\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 9ms/step - accuracy: 0.5289 - loss: 1.3312 - val_accuracy: 0.5938 - val_loss: 1.1376\n", + "Epoch 5/15\n", + "\u001b[1m352/352\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 9ms/step - accuracy: 0.5597 - loss: 1.2548 - val_accuracy: 0.6040 - val_loss: 1.1069\n", + "Epoch 6/15\n", + "\u001b[1m352/352\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 9ms/step - accuracy: 0.5712 - loss: 1.2076 - val_accuracy: 0.6172 - val_loss: 1.0897\n", + "Epoch 7/15\n", + "\u001b[1m352/352\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 9ms/step - accuracy: 0.5928 - loss: 1.1578 - val_accuracy: 0.6454 - val_loss: 1.0245\n", + "Epoch 8/15\n", + "\u001b[1m352/352\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 9ms/step - accuracy: 0.6141 - loss: 1.1034 - val_accuracy: 0.6610 - val_loss: 0.9561\n", + "Epoch 9/15\n", + "\u001b[1m352/352\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 9ms/step - accuracy: 0.6275 - loss: 1.0645 - val_accuracy: 0.6724 - val_loss: 0.9369\n", + "Epoch 10/15\n", + "\u001b[1m352/352\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 9ms/step - accuracy: 0.6379 - loss: 1.0233 - val_accuracy: 0.6750 - val_loss: 0.9100\n", + "Epoch 11/15\n", + "\u001b[1m352/352\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 9ms/step - accuracy: 0.6621 - loss: 0.9703 - val_accuracy: 0.6854 - val_loss: 0.8999\n", + "Epoch 12/15\n", + "\u001b[1m352/352\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 9ms/step - accuracy: 0.6652 - loss: 0.9562 - val_accuracy: 0.6796 - val_loss: 0.9118\n", + "Epoch 13/15\n", + "\u001b[1m352/352\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 9ms/step - accuracy: 0.6766 - loss: 0.9230 - val_accuracy: 0.7026 - val_loss: 0.8477\n", + "Epoch 14/15\n", + "\u001b[1m352/352\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 9ms/step - accuracy: 0.6799 - loss: 0.9102 - val_accuracy: 0.7086 - val_loss: 0.8363\n", + "Epoch 15/15\n", + "\u001b[1m352/352\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 9ms/step - accuracy: 0.6943 - loss: 0.8764 - val_accuracy: 0.7084 - val_loss: 0.8323\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "