{"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":"markdown","source":"The dataset is called MNIST and refers to handwritten digit recognition. You can find more about it on Yann LeCun's website (Director of AI Research, Facebook). He is one of the pioneers of what we've been talking about and of more complex approaches that are widely used today, such as covolutional neural networks (CNNs). \n\nThe dataset provides 70,000 images (28x28 pixels) of handwritten digits (1 digit per image). \n\nThe goal is to write an algorithm that detects which digit is written. Since there are only 10 digits (0, 1, 2, 3, 4, 5, 6, 7, 8, 9), this is a classification problem with 10 classes. \n\nOur goal would be to build a neural network with 2 hidden layers.","metadata":{"id":"gK7UaSKgcR_0"}},{"cell_type":"markdown","source":"# import Libraries","metadata":{"id":"T94H8egd-zH3"}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\nimport seaborn as sns\n%matplotlib inline\nimport tensorflow as tf\nfrom keras.preprocessing.image import ImageDataGenerator\n\n\nimport warnings\nwarnings.filterwarnings(\"ignore\")","metadata":{"id":"qgfc4kOo-hid","execution":{"iopub.status.busy":"2022-07-15T07:45:37.325615Z","iopub.execute_input":"2022-07-15T07:45:37.326031Z","iopub.status.idle":"2022-07-15T07:45:39.287958Z","shell.execute_reply.started":"2022-07-15T07:45:37.325945Z","shell.execute_reply":"2022-07-15T07:45:39.286978Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data Preparation","metadata":{"id":"C_GJbiiA_Al4"}},{"cell_type":"code","source":"train=pd.read_csv('../input/digit-recognizer/train.csv')\ntest=pd.read_csv('../input/digit-recognizer/test.csv')","metadata":{"id":"Mrw9MfD3-42G","execution":{"iopub.status.busy":"2022-07-15T07:45:39.290166Z","iopub.execute_input":"2022-07-15T07:45:39.290930Z","iopub.status.idle":"2022-07-15T07:45:43.050154Z","shell.execute_reply.started":"2022-07-15T07:45:39.290887Z","shell.execute_reply":"2022-07-15T07:45:43.049075Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train","metadata":{"id":"eCm3T5VI_X5h","outputId":"a166fded-b5df-4c8b-da7a-4f0442fe8af1","execution":{"iopub.status.busy":"2022-07-15T07:45:43.051859Z","iopub.execute_input":"2022-07-15T07:45:43.052784Z","iopub.status.idle":"2022-07-15T07:45:43.093854Z","shell.execute_reply.started":"2022-07-15T07:45:43.052716Z","shell.execute_reply":"2022-07-15T07:45:43.091895Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test","metadata":{"id":"RwMqjD00_j5F","outputId":"0384e63e-aedd-41fc-c73b-561e3acd5278","execution":{"iopub.status.busy":"2022-07-15T07:45:43.097539Z","iopub.execute_input":"2022-07-15T07:45:43.098282Z","iopub.status.idle":"2022-07-15T07:45:43.134211Z","shell.execute_reply.started":"2022-07-15T07:45:43.098226Z","shell.execute_reply":"2022-07-15T07:45:43.131536Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train = train.iloc[:,1:]\nY_train = train.iloc[:,0]\nX_train","metadata":{"id":"-UXWQmmNAbQG","outputId":"a7d2eaaa-f9c4-44d8-d3e4-a237b3932c70","execution":{"iopub.status.busy":"2022-07-15T07:45:43.138056Z","iopub.execute_input":"2022-07-15T07:45:43.138833Z","iopub.status.idle":"2022-07-15T07:45:43.179257Z","shell.execute_reply.started":"2022-07-15T07:45:43.138782Z","shell.execute_reply":"2022-07-15T07:45:43.178367Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Y_train.head()","metadata":{"id":"ABPLLQ_oB_BN","outputId":"df5385b5-f188-4358-81df-f3e2e1198707","execution":{"iopub.status.busy":"2022-07-15T07:45:43.183150Z","iopub.execute_input":"2022-07-15T07:45:43.183854Z","iopub.status.idle":"2022-07-15T07:45:43.195636Z","shell.execute_reply.started":"2022-07-15T07:45:43.183803Z","shell.execute_reply":"2022-07-15T07:45:43.194020Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sns.set(rc = {'figure.figsize':(15,8)})\nsns.countplot(x='label', data=train)","metadata":{"id":"e2SkfrrcAz0j","outputId":"0f4faadc-4b7c-47da-95ba-6ef40c22ad52","execution":{"iopub.status.busy":"2022-07-15T07:45:43.200278Z","iopub.execute_input":"2022-07-15T07:45:43.200896Z","iopub.status.idle":"2022-07-15T07:45:43.552435Z","shell.execute_reply.started":"2022-07-15T07:45:43.200859Z","shell.execute_reply":"2022-07-15T07:45:43.551533Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Y_train.describe()","metadata":{"id":"91tt2LDeCxdm","outputId":"c0852e50-14ea-4313-cd88-062bf3f5c8ac","execution":{"iopub.status.busy":"2022-07-15T07:45:43.554253Z","iopub.execute_input":"2022-07-15T07:45:43.554966Z","iopub.status.idle":"2022-07-15T07:45:43.579388Z","shell.execute_reply.started":"2022-07-15T07:45:43.554924Z","shell.execute_reply":"2022-07-15T07:45:43.577998Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Dealing with Null Values","metadata":{"id":"PRL8HkJpBqcc"}},{"cell_type":"code","source":"X_train.isna().sum()","metadata":{"id":"m7GBdhKBBt8A","outputId":"24b730d0-4910-49e9-bb80-6f1cf82427c8","execution":{"iopub.status.busy":"2022-07-15T07:45:43.580775Z","iopub.execute_input":"2022-07-15T07:45:43.581705Z","iopub.status.idle":"2022-07-15T07:45:43.646082Z","shell.execute_reply.started":"2022-07-15T07:45:43.581665Z","shell.execute_reply":"2022-07-15T07:45:43.645224Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test.isna().sum()","metadata":{"id":"mxFEDu6tDUGq","outputId":"8608f89d-942a-4367-d1f4-0817ba63fb5d","execution":{"iopub.status.busy":"2022-07-15T07:45:43.652940Z","iopub.execute_input":"2022-07-15T07:45:43.655395Z","iopub.status.idle":"2022-07-15T07:45:43.698766Z","shell.execute_reply.started":"2022-07-15T07:45:43.655356Z","shell.execute_reply":"2022-07-15T07:45:43.697907Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train=train.dropna()\nX_train = train.iloc[:,1:].values\nY_train = train.iloc[:,0].values\nX_train.shape,Y_train.shape","metadata":{"id":"ES6jPlswD5D_","outputId":"a3073090-8d99-404b-f1b9-2c8578ff7459","execution":{"iopub.status.busy":"2022-07-15T07:45:43.702554Z","iopub.execute_input":"2022-07-15T07:45:43.705021Z","iopub.status.idle":"2022-07-15T07:45:43.872134Z","shell.execute_reply.started":"2022-07-15T07:45:43.704983Z","shell.execute_reply":"2022-07-15T07:45:43.871233Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n# PREVIEW IMAGES\nplt.figure(figsize=(15,4.5))\nfor i in range(30):  \n    plt.subplot(3, 10, i+1)\n    plt.imshow(X_train[i].reshape((28,28)),cmap=plt.cm.binary)\n    plt.axis('off')\nplt.subplots_adjust(wspace=-0.1, hspace=-0.1)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-07-15T07:45:43.876051Z","iopub.execute_input":"2022-07-15T07:45:43.876626Z","iopub.status.idle":"2022-07-15T07:45:45.902158Z","shell.execute_reply.started":"2022-07-15T07:45:43.876589Z","shell.execute_reply":"2022-07-15T07:45:45.901078Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test=test.dropna()\ntest=test.values\ntest.shape","metadata":{"id":"pUPLCUq9RlGE","outputId":"4bacbf1b-7b55-4e42-b8f1-defa1785fd51","execution":{"iopub.status.busy":"2022-07-15T07:45:45.903741Z","iopub.execute_input":"2022-07-15T07:45:45.904120Z","iopub.status.idle":"2022-07-15T07:45:45.999758Z","shell.execute_reply.started":"2022-07-15T07:45:45.904080Z","shell.execute_reply":"2022-07-15T07:45:45.998612Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train = X_train.reshape(X_train.shape[0], 28, 28)\n\nfor i in range(6, 9):\n    plt.subplot(330 + (i+1))\n    plt.imshow(X_train[i], cmap=plt.get_cmap('gray'))\n    plt.title(Y_train[i]);","metadata":{"execution":{"iopub.status.busy":"2022-07-15T07:45:46.001324Z","iopub.execute_input":"2022-07-15T07:45:46.001801Z","iopub.status.idle":"2022-07-15T07:45:46.379086Z","shell.execute_reply.started":"2022-07-15T07:45:46.001759Z","shell.execute_reply":"2022-07-15T07:45:46.378179Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Normalize and Reshape","metadata":{"id":"hFcrD5eeR_QT"}},{"cell_type":"code","source":"X_train = X_train / 255.0\ntest = test / 255.0\n\nX_train = X_train.reshape(-1,28,28,1)\ntest = test.reshape(-1,28,28,1)","metadata":{"id":"uomxbHkiSC2M","execution":{"iopub.status.busy":"2022-07-15T07:45:46.380431Z","iopub.execute_input":"2022-07-15T07:45:46.380888Z","iopub.status.idle":"2022-07-15T07:45:46.555539Z","shell.execute_reply.started":"2022-07-15T07:45:46.380852Z","shell.execute_reply":"2022-07-15T07:45:46.554524Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Encoding \n\n(ex : 2 -> [0,0,1,0,0,0,0,0,0,0])","metadata":{"id":"zt0KRZq5ce9P"}},{"cell_type":"code","source":"from keras.utils.np_utils import to_categorical\nY_train = to_categorical(Y_train, num_classes = 10)","metadata":{"id":"4ChX26ttS3l-","execution":{"iopub.status.busy":"2022-07-15T07:45:46.557094Z","iopub.execute_input":"2022-07-15T07:45:46.557721Z","iopub.status.idle":"2022-07-15T07:45:46.564049Z","shell.execute_reply.started":"2022-07-15T07:45:46.557676Z","shell.execute_reply":"2022-07-15T07:45:46.563006Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Y_train","metadata":{"id":"gbk3WJdAc0CJ","outputId":"7124d925-13cc-4fde-df06-b0929cb43285","execution":{"iopub.status.busy":"2022-07-15T07:45:46.565866Z","iopub.execute_input":"2022-07-15T07:45:46.566296Z","iopub.status.idle":"2022-07-15T07:45:46.576718Z","shell.execute_reply.started":"2022-07-15T07:45:46.566253Z","shell.execute_reply":"2022-07-15T07:45:46.575663Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# spliting Data in training and testing set","metadata":{"id":"PyAaSeqSdQkz"}},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nX_train, X_val, Y_train, Y_val = train_test_split(X_train, Y_train, test_size = 0.1, random_state=2)","metadata":{"id":"IXwlKGaoc8V1","execution":{"iopub.status.busy":"2022-07-15T07:45:46.578345Z","iopub.execute_input":"2022-07-15T07:45:46.578857Z","iopub.status.idle":"2022-07-15T07:45:47.000627Z","shell.execute_reply.started":"2022-07-15T07:45:46.578822Z","shell.execute_reply":"2022-07-15T07:45:46.999598Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualize the digit","metadata":{"id":"n0Wjh_2Ie29A"}},{"cell_type":"code","source":"g = plt.imshow(X_train[0][:,:,0])","metadata":{"id":"67_AtHtUeebE","outputId":"886139e7-a24d-4201-8a4b-4d22b88488f5","execution":{"iopub.status.busy":"2022-07-15T07:45:47.002236Z","iopub.execute_input":"2022-07-15T07:45:47.002687Z","iopub.status.idle":"2022-07-15T07:45:47.227407Z","shell.execute_reply.started":"2022-07-15T07:45:47.002642Z","shell.execute_reply":"2022-07-15T07:45:47.226396Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Building the CNN**","metadata":{"id":"w7aXmQFbgD-8"}},{"cell_type":"markdown","source":"## Initializing CNN","metadata":{"id":"3DHysRZ-smwU"}},{"cell_type":"code","source":"cnn=tf.keras.models.Sequential()","metadata":{"id":"jnTQrHsxgGaI","execution":{"iopub.status.busy":"2022-07-15T07:45:47.228709Z","iopub.execute_input":"2022-07-15T07:45:47.229053Z","iopub.status.idle":"2022-07-15T07:45:48.116963Z","shell.execute_reply.started":"2022-07-15T07:45:47.229014Z","shell.execute_reply":"2022-07-15T07:45:48.115073Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Step 1  Convolution","metadata":{"id":"ZT3qkJcQtJH3"}},{"cell_type":"code","source":"\ncnn.add(tf.keras.layers.Conv2D(filters=32, kernel_size=(5,5),padding = 'Same',activation='relu',input_shape = (28,28,1)))\ncnn.add(tf.keras.layers.Conv2D(filters=32, kernel_size=(5,5),padding = 'Same',activation='relu'))","metadata":{"id":"K7KfXf_FtNGI","execution":{"iopub.status.busy":"2022-07-15T07:45:48.118491Z","iopub.execute_input":"2022-07-15T07:45:48.118865Z","iopub.status.idle":"2022-07-15T07:45:48.152711Z","shell.execute_reply.started":"2022-07-15T07:45:48.118827Z","shell.execute_reply":"2022-07-15T07:45:48.151865Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Step 2  Pooling","metadata":{"id":"RGHBQc-x2kdL"}},{"cell_type":"code","source":"from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPool2D\ncnn.add(tf.keras.layers.MaxPool2D(pool_size=(2,2)))\ncnn.add(tf.keras.layers.Dropout(0.25))","metadata":{"id":"EGnoH8Mt2nE4","execution":{"iopub.status.busy":"2022-07-15T07:45:48.154063Z","iopub.execute_input":"2022-07-15T07:45:48.154393Z","iopub.status.idle":"2022-07-15T07:45:48.169312Z","shell.execute_reply.started":"2022-07-15T07:45:48.154359Z","shell.execute_reply":"2022-07-15T07:45:48.168496Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Step 3 Adding 2nd Layer","metadata":{"id":"x7KPIx7v3IJq"}},{"cell_type":"code","source":"cnn.add(tf.keras.layers.Conv2D(filters = 64, kernel_size = (3,3),padding = 'Same',activation ='relu'))","metadata":{"id":"ol1nLASi3Mq0","execution":{"iopub.status.busy":"2022-07-15T07:45:48.170535Z","iopub.execute_input":"2022-07-15T07:45:48.170950Z","iopub.status.idle":"2022-07-15T07:45:48.185605Z","shell.execute_reply.started":"2022-07-15T07:45:48.170914Z","shell.execute_reply":"2022-07-15T07:45:48.184657Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Step 4 Adding 3rd Layer","metadata":{"id":"y0RJ6keO3XVw"}},{"cell_type":"code","source":"cnn.add(tf.keras.layers.Conv2D(filters = 64, kernel_size = (3,3),padding = 'Same',activation ='relu'))","metadata":{"id":"QaKILXv53dyt","execution":{"iopub.status.busy":"2022-07-15T07:45:48.187277Z","iopub.execute_input":"2022-07-15T07:45:48.187690Z","iopub.status.idle":"2022-07-15T07:45:48.203049Z","shell.execute_reply.started":"2022-07-15T07:45:48.187650Z","shell.execute_reply":"2022-07-15T07:45:48.202147Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Step 5 Again Pooling","metadata":{"id":"diL7Hygz3mco"}},{"cell_type":"code","source":"cnn.add(tf.keras.layers.MaxPool2D(pool_size=(2,2), strides=(2,2)))\ncnn.add(tf.keras.layers.Dropout(0.25))","metadata":{"id":"H3XuFvZI3qZw","execution":{"iopub.status.busy":"2022-07-15T07:45:48.204417Z","iopub.execute_input":"2022-07-15T07:45:48.205012Z","iopub.status.idle":"2022-07-15T07:45:48.216156Z","shell.execute_reply.started":"2022-07-15T07:45:48.204977Z","shell.execute_reply":"2022-07-15T07:45:48.215324Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Step 6 Flatting","metadata":{"id":"SMeAnMcK35mm"}},{"cell_type":"code","source":"cnn.add(tf.keras.layers.Flatten())","metadata":{"id":"DUKgHwaI3-So","execution":{"iopub.status.busy":"2022-07-15T07:45:48.218173Z","iopub.execute_input":"2022-07-15T07:45:48.218672Z","iopub.status.idle":"2022-07-15T07:45:48.228645Z","shell.execute_reply.started":"2022-07-15T07:45:48.218637Z","shell.execute_reply":"2022-07-15T07:45:48.227517Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Step 7 Full Connection","metadata":{"id":"4GL3npkX41EF"}},{"cell_type":"code","source":"cnn.add(tf.keras.layers.Dense(units=256,activation='relu'))\ncnn.add(tf.keras.layers.Dropout(0.5))","metadata":{"id":"oKQQjX5j44Aa","execution":{"iopub.status.busy":"2022-07-15T07:45:48.230509Z","iopub.execute_input":"2022-07-15T07:45:48.231443Z","iopub.status.idle":"2022-07-15T07:45:48.442075Z","shell.execute_reply.started":"2022-07-15T07:45:48.231408Z","shell.execute_reply":"2022-07-15T07:45:48.441079Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Step 8 Output Layer","metadata":{"id":"lNJmETFh5e3C"}},{"cell_type":"code","source":"cnn.add(tf.keras.layers.Dense(10, activation = \"softmax\"))","metadata":{"id":"piMNUOR85x_H","execution":{"iopub.status.busy":"2022-07-15T07:45:48.448098Z","iopub.execute_input":"2022-07-15T07:45:48.448391Z","iopub.status.idle":"2022-07-15T07:45:48.462506Z","shell.execute_reply.started":"2022-07-15T07:45:48.448365Z","shell.execute_reply":"2022-07-15T07:45:48.461479Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Set the Optimizer","metadata":{"id":"MHCzDsOU6EAQ"}},{"cell_type":"code","source":"from tensorflow.keras.optimizers import RMSprop\noptimizer = RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0)","metadata":{"id":"ttr7R_Xj6Gjv","execution":{"iopub.status.busy":"2022-07-15T07:45:48.463735Z","iopub.execute_input":"2022-07-15T07:45:48.464168Z","iopub.status.idle":"2022-07-15T07:45:48.471418Z","shell.execute_reply.started":"2022-07-15T07:45:48.464130Z","shell.execute_reply":"2022-07-15T07:45:48.470159Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Compiling the CNN","metadata":{"id":"-5dDlYC36-B-"}},{"cell_type":"code","source":"cnn.compile(optimizer = optimizer , loss = \"categorical_crossentropy\", metrics=[\"accuracy\"])","metadata":{"id":"IO2R0Lhs7C4s","execution":{"iopub.status.busy":"2022-07-15T07:45:48.472891Z","iopub.execute_input":"2022-07-15T07:45:48.473568Z","iopub.status.idle":"2022-07-15T07:45:48.487671Z","shell.execute_reply.started":"2022-07-15T07:45:48.473529Z","shell.execute_reply":"2022-07-15T07:45:48.486792Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Set a learning rate annealer","metadata":{"id":"zGv-2ibI7RTu"}},{"cell_type":"code","source":"from keras.callbacks import ReduceLROnPlateau\nlearning_rate_reduction = ReduceLROnPlateau(monitor='val_acc', \n                                            patience=3, \n                                            verbose=1, \n                                            factor=0.5, \n                                            min_lr=0.00001)","metadata":{"id":"2JKRPB2P7Sn3","execution":{"iopub.status.busy":"2022-07-15T07:45:48.489996Z","iopub.execute_input":"2022-07-15T07:45:48.490651Z","iopub.status.idle":"2022-07-15T07:45:48.496654Z","shell.execute_reply.started":"2022-07-15T07:45:48.490615Z","shell.execute_reply":"2022-07-15T07:45:48.495531Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Set the number of epochs","metadata":{"id":"y5c04au17kDq"}},{"cell_type":"code","source":"epochs = 100\nbatch_size = 64","metadata":{"id":"YlE3mwhF7nYr","execution":{"iopub.status.busy":"2022-07-15T07:45:48.499056Z","iopub.execute_input":"2022-07-15T07:45:48.499668Z","iopub.status.idle":"2022-07-15T07:45:48.506217Z","shell.execute_reply.started":"2022-07-15T07:45:48.499633Z","shell.execute_reply":"2022-07-15T07:45:48.505249Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Data Augmentation\n\nset input mean to 0 over the dataset\n\nset each sample mean to 0\n\ndivide inputs by std of the dataset\n\ndivide each input by its std\n\napply ZCA whitening\n\nrandomly rotate images in the range (degrees, 0 to 180)\n\nRandomly zoom image\n\nrandomly shift images horizontally (fraction of total width)\n\nrandomly shift images vertically (fraction of total height)\n\nrandomly flip images\n\nrandomly flip images","metadata":{"id":"EYb098ed743V"}},{"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator\n\ndatagen = ImageDataGenerator(\n        featurewise_center=False,\n        samplewise_center=False,\n        featurewise_std_normalization=False,  \n        samplewise_std_normalization=False, \n        zca_whitening=False, \n        rotation_range=10, \n        zoom_range = 0.1, \n        width_shift_range=0.1,\n        height_shift_range=0.1, \n        horizontal_flip=False, \n        vertical_flip=False) \n\n\ndatagen.fit(X_train)","metadata":{"id":"_-fcPME37-Zu","execution":{"iopub.status.busy":"2022-07-15T07:45:48.507766Z","iopub.execute_input":"2022-07-15T07:45:48.508108Z","iopub.status.idle":"2022-07-15T07:45:48.607954Z","shell.execute_reply.started":"2022-07-15T07:45:48.508074Z","shell.execute_reply":"2022-07-15T07:45:48.606937Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Training the CNN on the Training set and evaluating it on the Test set","metadata":{"id":"YAShSSQr9Hp2"}},{"cell_type":"code","source":"model = cnn.fit(datagen.flow(X_train,Y_train, batch_size=batch_size),\n                              epochs = epochs, validation_data = (X_val,Y_val),\n                              verbose = 2, steps_per_epoch=X_train.shape[0] // batch_size\n                              , callbacks=[learning_rate_reduction])","metadata":{"id":"kHXoltEX9MdT","outputId":"d3616960-f878-4047-8331-deaf1e9ef0c6","execution":{"iopub.status.busy":"2022-07-15T07:45:48.609734Z","iopub.execute_input":"2022-07-15T07:45:48.610119Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Confusion Matrics","metadata":{}},{"cell_type":"code","source":"def plot_confusion_matrix(cm, classes,normalize=False,title='Confusion matrix',cmap=plt.cm.Blues):\n    plt.imshow(cm, interpolation='nearest', cmap=cmap)\n    plt.title(title)\n    plt.colorbar()\n    tick_marks = np.arange(len(classes))\n    plt.xticks(tick_marks, classes, rotation=45)\n    plt.yticks(tick_marks, classes)\n\n    if normalize:\n        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n\n    thresh = cm.max() / 2.\n    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):\n        plt.text(j, i, cm[i, j],\n                 horizontalalignment=\"center\",\n                 color=\"white\" if cm[i, j] > thresh else \"black\")\n\n    plt.tight_layout()\n    plt.ylabel('True label')\n    plt.xlabel('Predicted label')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import confusion_matrix\nimport itertools\n# Predict the values from the validation dataset\nY_pred = cnn.predict(X_val)\n# Convert predictions classes to one hot vectors \nY_pred_classes = np.argmax(Y_pred,axis = 1) \n# Convert validation observations to one hot vectors\nY_true = np.argmax(Y_val,axis = 1) \n# compute the confusion matrix\nconfusion_mtx = confusion_matrix(Y_true, Y_pred_classes) \n# plot the confusion matrix\nplot_confusion_matrix(confusion_mtx, classes = range(10)) ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Submission","metadata":{"id":"hLJ9aAdV_ISF"}},{"cell_type":"code","source":"test_pred = pd.DataFrame( cnn.predict([test]))\ntest_pred = pd.DataFrame(test_pred.idxmax(axis = 1))\ntest_pred.index.name = 'ImageId'\ntest_pred = test_pred.rename(columns = {0: 'Label'}).reset_index()\ntest_pred['ImageId'] = test_pred['ImageId'] + 1\n\ntest_pred.head()","metadata":{"id":"p_pLckMxBP_P","outputId":"bf7f0504-42e5-4a2b-eb54-6936cd6ef7a1","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_pred.to_csv('submission1.csv', index = False)","metadata":{"id":"NTYwQoevBfMH","trusted":true},"execution_count":null,"outputs":[]}]}