{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-01-02T14:03:28.994662Z","iopub.execute_input":"2022-01-02T14:03:28.995621Z","iopub.status.idle":"2022-01-02T14:03:29.037936Z","shell.execute_reply.started":"2022-01-02T14:03:28.995471Z","shell.execute_reply":"2022-01-02T14:03:29.036855Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt                                    # Visualization\n\n\nimport tensorflow as tf                                            # It is the lovely tensorflow :) There is no need for any explaination <3\nfrom tensorflow.keras.models import Sequential                     # Keras api model class\nfrom tensorflow.keras import datasets                              # For downloading full cifar 10\nfrom keras.layers import Dense                                     # Fully connected layer class\nfrom tensorflow.keras.utils import to_categorical, plot_model      # For One hot encoding\n\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\n\nfrom tensorflow.keras.layers import Conv2D                         # 2 dimentional convolution layer\nfrom tensorflow.keras.layers import MaxPooling2D                   # Max pooling layer\nfrom tensorflow.keras.layers import Flatten                        # Flatten the dimentions of the output of previous layers\nfrom tensorflow.keras.layers import BatchNormalization\nfrom tensorflow.keras.layers import Dropout","metadata":{"execution":{"iopub.status.busy":"2022-01-02T14:18:30.304873Z","iopub.execute_input":"2022-01-02T14:18:30.305154Z","iopub.status.idle":"2022-01-02T14:18:36.215528Z","shell.execute_reply.started":"2022-01-02T14:18:30.305123Z","shell.execute_reply":"2022-01-02T14:18:36.214544Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"(X_train, y_train), (X_test, y_test) = datasets.cifar10.load_data()\ny_train = to_categorical(y_train)\ny_test = to_categorical(y_test)\n\nX_train = X_train.astype('float32')\nX_test = X_test.astype('float32')\n# normalize to range 0-1\nX_train = X_train / 255.0\nX_test = X_test / 255.0","metadata":{"execution":{"iopub.status.busy":"2022-01-02T14:18:49.820843Z","iopub.execute_input":"2022-01-02T14:18:49.821162Z","iopub.status.idle":"2022-01-02T14:18:59.226641Z","shell.execute_reply.started":"2022-01-02T14:18:49.821129Z","shell.execute_reply":"2022-01-02T14:18:59.225656Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\"\"\"\nThis cell is copied from tensorflow documentation just to check the data and labels loaded correct and properly.\n\"\"\"\n\nclass_names = ['airplane', 'automobile', 'bird', 'cat', 'deer',\n               'dog', 'frog', 'horse', 'ship', 'truck']\nclass_names = np.array(class_names)\n\nplt.figure(figsize=(10,10))\nfor i in range(25):\n    plt.subplot(5,5,i+1)\n    plt.xticks([])\n    plt.yticks([])\n    plt.grid(False)\n    plt.imshow(X_train[i])\n    # The CIFAR labels happen to be arrays, \n    # which is why you need the extra index\n    plt.xlabel(class_names[y_train[i]==1])\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-01-02T14:19:15.131526Z","iopub.execute_input":"2022-01-02T14:19:15.131801Z","iopub.status.idle":"2022-01-02T14:19:16.420980Z","shell.execute_reply.started":"2022-01-02T14:19:15.131769Z","shell.execute_reply":"2022-01-02T14:19:16.420154Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nmodel = Sequential()\n\n# Convolutional Layer\nmodel.add(Conv2D(filters=32, kernel_size=(3, 3), input_shape=(32, 32, 3), activation='relu', padding='same'))\nmodel.add(BatchNormalization())\nmodel.add(Conv2D(filters=32, kernel_size=(3, 3), input_shape=(32, 32, 3), activation='relu', padding='same'))\nmodel.add(BatchNormalization())\n# Pooling layer\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n# Dropout layers\nmodel.add(Dropout(0.25))\n\nmodel.add(Conv2D(filters=64, kernel_size=(3, 3), input_shape=(32, 32, 3), activation='relu', padding='same'))\nmodel.add(BatchNormalization())\nmodel.add(Conv2D(filters=64, kernel_size=(3, 3), input_shape=(32, 32, 3), activation='relu', padding='same'))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.25))\n\nmodel.add(Conv2D(filters=128, kernel_size=(3, 3), input_shape=(32, 32, 3), activation='relu', padding='same'))\nmodel.add(BatchNormalization())\nmodel.add(Conv2D(filters=128, kernel_size=(3, 3), input_shape=(32, 32, 3), activation='relu', padding='same'))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.25))\n\nmodel.add(Flatten())\n# model.add(Dropout(0.2))\nmodel.add(Dense(128, activation='relu'))\nmodel.add(Dropout(0.25))\nmodel.add(Dense(10, activation='softmax'))\n\nMETRICS = ['accuracy']\nmodel.compile(loss='categorical_crossentropy', optimizer='adam', metrics=METRICS)\n\n","metadata":{"execution":{"iopub.status.busy":"2022-01-02T14:19:27.747769Z","iopub.execute_input":"2022-01-02T14:19:27.748225Z","iopub.status.idle":"2022-01-02T14:19:30.924540Z","shell.execute_reply.started":"2022-01-02T14:19:27.748177Z","shell.execute_reply":"2022-01-02T14:19:30.923609Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"execution":{"iopub.status.busy":"2022-01-02T14:19:59.739914Z","iopub.execute_input":"2022-01-02T14:19:59.740451Z","iopub.status.idle":"2022-01-02T14:19:59.781674Z","shell.execute_reply.started":"2022-01-02T14:19:59.740415Z","shell.execute_reply":"2022-01-02T14:19:59.780389Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit(X_train, y_train, validation_data = (X_test, y_test),epochs=50, batch_size=64, verbose=1) # Fit model","metadata":{"execution":{"iopub.status.busy":"2022-01-02T14:20:14.241809Z","iopub.execute_input":"2022-01-02T14:20:14.242165Z","iopub.status.idle":"2022-01-02T14:26:21.539948Z","shell.execute_reply.started":"2022-01-02T14:20:14.242121Z","shell.execute_reply":"2022-01-02T14:26:21.538960Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"_, accuracy = model.evaluate(X_test, y_test, verbose=0)\nprint('CNN model Accuracy trained and tested on all data: %.3f' % (accuracy * 100.0))","metadata":{"execution":{"iopub.status.busy":"2022-01-02T14:26:21.542496Z","iopub.execute_input":"2022-01-02T14:26:21.542849Z","iopub.status.idle":"2022-01-02T14:26:23.167063Z","shell.execute_reply.started":"2022-01-02T14:26:21.542804Z","shell.execute_reply":"2022-01-02T14:26:23.165884Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def display_training_curves(training, validation, title, subplot):\n  ax = plt.subplot(subplot)\n  ax.plot(training)\n  ax.plot(validation)\n  ax.set_title('model '+ title)\n  ax.set_ylabel(title)\n  ax.set_xlabel('epoch')\n  ax.legend(['training', 'validation'])\n\nplt.subplots(figsize=(10,10))\nplt.tight_layout()\ndisplay_training_curves(history.history['accuracy'], history.history['val_accuracy'], 'accuracy', 211)\ndisplay_training_curves(history.history['loss'], history.history['val_loss'], 'loss', 212)","metadata":{"execution":{"iopub.status.busy":"2022-01-02T14:26:23.170536Z","iopub.execute_input":"2022-01-02T14:26:23.170801Z","iopub.status.idle":"2022-01-02T14:26:23.733184Z","shell.execute_reply.started":"2022-01-02T14:26:23.170768Z","shell.execute_reply":"2022-01-02T14:26:23.732246Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = Sequential()\n\n# Convolutional Layer\nmodel.add(Conv2D(filters=32, kernel_size=(3, 3), input_shape=(32, 32, 3), activation='relu', padding='same'))\nmodel.add(BatchNormalization())\nmodel.add(Conv2D(filters=32, kernel_size=(3, 3), input_shape=(32, 32, 3), activation='relu', padding='same'))\nmodel.add(BatchNormalization())\n# Pooling layer\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n# Dropout layers\nmodel.add(Dropout(0.25))\n\nmodel.add(Conv2D(filters=64, kernel_size=(3, 3), input_shape=(32, 32, 3), activation='relu', padding='same'))\nmodel.add(BatchNormalization())\nmodel.add(Conv2D(filters=64, kernel_size=(3, 3), input_shape=(32, 32, 3), activation='relu', padding='same'))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.25))\n\nmodel.add(Conv2D(filters=128, kernel_size=(3, 3), input_shape=(32, 32, 3), activation='relu', padding='same'))\nmodel.add(BatchNormalization())\nmodel.add(Conv2D(filters=128, kernel_size=(3, 3), input_shape=(32, 32, 3), activation='relu', padding='same'))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.25))\n\nmodel.add(Flatten())\n# model.add(Dropout(0.2))\nmodel.add(Dense(128, activation='relu'))\nmodel.add(Dropout(0.25))\nmodel.add(Dense(10, activation='softmax'))\n\nMETRICS = ['accuracy']\nmodel.compile(loss='categorical_crossentropy', optimizer='adam', metrics=METRICS)\n","metadata":{"execution":{"iopub.status.busy":"2022-01-02T15:16:32.459977Z","iopub.execute_input":"2022-01-02T15:16:32.460284Z","iopub.status.idle":"2022-01-02T15:16:32.655813Z","shell.execute_reply.started":"2022-01-02T15:16:32.460250Z","shell.execute_reply":"2022-01-02T15:16:32.654845Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"datagen = ImageDataGenerator(\n        width_shift_range=0.1,\n        height_shift_range=0.1,\n        horizontal_flip=True,\n        rotation_range=20\n        )  # randomly flip images\n\n\ndatagen.fit(X_train)\n\ndatagenerator = datagen.flow(X_train, y_train, batch_size=64)\n\nhistory = model.fit(datagenerator, epochs=50, validation_data=(X_test, y_test), verbose=1)","metadata":{"execution":{"iopub.status.busy":"2022-01-02T15:16:32.657762Z","iopub.execute_input":"2022-01-02T15:16:32.658141Z","iopub.status.idle":"2022-01-02T15:47:08.441862Z","shell.execute_reply.started":"2022-01-02T15:16:32.658108Z","shell.execute_reply":"2022-01-02T15:47:08.440544Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"_, accuracy = model.evaluate(X_test, y_test, verbose=0)\nprint('CNN model Accuracy trained and tested on all data: %.3f' % (accuracy * 100.0))","metadata":{"execution":{"iopub.status.busy":"2022-01-02T15:47:13.981123Z","iopub.execute_input":"2022-01-02T15:47:13.981446Z","iopub.status.idle":"2022-01-02T15:47:15.605151Z","shell.execute_reply.started":"2022-01-02T15:47:13.981412Z","shell.execute_reply":"2022-01-02T15:47:15.604008Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def display_training_curves(training, validation, title, subplot):\n  ax = plt.subplot(subplot)\n  ax.plot(training)\n  ax.plot(validation)\n  ax.set_title('model '+ title)\n  ax.set_ylabel(title)\n  ax.set_xlabel('epoch')\n  ax.legend(['training', 'validation'])\n\nplt.subplots(figsize=(10,10))\nplt.tight_layout()\ndisplay_training_curves(history.history['accuracy'], history.history['val_accuracy'], 'accuracy', 211)\ndisplay_training_curves(history.history['loss'], history.history['val_loss'], 'loss', 212)","metadata":{"execution":{"iopub.status.busy":"2022-01-02T15:47:18.499805Z","iopub.execute_input":"2022-01-02T15:47:18.500117Z","iopub.status.idle":"2022-01-02T15:47:19.078453Z","shell.execute_reply.started":"2022-01-02T15:47:18.500075Z","shell.execute_reply":"2022-01-02T15:47:19.077161Z"},"trusted":true},"execution_count":null,"outputs":[]}]}