{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":3004,"databundleVersionId":861823,"sourceType":"competition"}],"dockerImageVersionId":30626,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# First import the necessery libraries","metadata":{}},{"cell_type":"code","source":"import numpy as np \nimport pandas as pd \nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport random\nimport os\nimport cv2\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras.layers import Dense,Flatten\nfrom tensorflow.keras.layers import InputLayer, Conv2D, MaxPool2D, BatchNormalization, Dropout\nfrom keras.models import Sequential\nfrom sklearn.model_selection import train_test_split\n\n\nimport warnings\nwarnings.filterwarnings(\"ignore\")","metadata":{"execution":{"iopub.status.busy":"2023-12-31T20:02:27.383214Z","iopub.execute_input":"2023-12-31T20:02:27.383552Z","iopub.status.idle":"2023-12-31T20:02:41.944954Z","shell.execute_reply.started":"2023-12-31T20:02:27.383522Z","shell.execute_reply":"2023-12-31T20:02:41.944052Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Reading the Dataset","metadata":{}},{"cell_type":"code","source":"train_df = pd.read_csv(\"/kaggle/input/digit-recognizer/train.csv\")\ntest_df = pd.read_csv(\"/kaggle/input/digit-recognizer/test.csv\")","metadata":{"execution":{"iopub.status.busy":"2023-12-31T20:02:41.947061Z","iopub.execute_input":"2023-12-31T20:02:41.947658Z","iopub.status.idle":"2023-12-31T20:02:47.237967Z","shell.execute_reply.started":"2023-12-31T20:02:41.947625Z","shell.execute_reply":"2023-12-31T20:02:47.237158Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(train_df.shape)\ntrain_df.head()","metadata":{"execution":{"iopub.status.busy":"2023-12-31T20:02:47.239174Z","iopub.execute_input":"2023-12-31T20:02:47.239796Z","iopub.status.idle":"2023-12-31T20:02:47.265396Z","shell.execute_reply.started":"2023-12-31T20:02:47.239759Z","shell.execute_reply":"2023-12-31T20:02:47.264585Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(test_df.shape)\ntest_df.head()","metadata":{"execution":{"iopub.status.busy":"2023-12-31T20:02:47.267485Z","iopub.execute_input":"2023-12-31T20:02:47.267728Z","iopub.status.idle":"2023-12-31T20:02:47.283853Z","shell.execute_reply.started":"2023-12-31T20:02:47.267705Z","shell.execute_reply":"2023-12-31T20:02:47.282870Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"*\" * 10, 'Labels', \"*\" * 10)\ndisplay(train_df['label'].value_counts())\nprint(\"-\" * 30)\ndisplay(train_df['label'].describe())\nprint(\"=\" * 40)","metadata":{"execution":{"iopub.status.busy":"2023-12-31T20:02:47.284934Z","iopub.execute_input":"2023-12-31T20:02:47.285291Z","iopub.status.idle":"2023-12-31T20:02:47.314424Z","shell.execute_reply.started":"2023-12-31T20:02:47.285258Z","shell.execute_reply":"2023-12-31T20:02:47.313527Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Split the data into Features Matrix(X) & Target Vector(y)","metadata":{}},{"cell_type":"code","source":"X_train = train_df.drop(labels = [\"label\"],axis = 1) \ny_train = train_df[\"label\"]","metadata":{"execution":{"iopub.status.busy":"2023-12-31T20:02:47.315468Z","iopub.execute_input":"2023-12-31T20:02:47.315771Z","iopub.status.idle":"2023-12-31T20:02:47.399259Z","shell.execute_reply.started":"2023-12-31T20:02:47.315747Z","shell.execute_reply":"2023-12-31T20:02:47.398116Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Plot the Labels ","metadata":{}},{"cell_type":"code","source":"digits_counts = y_train.value_counts()\ndigits_counts.plot(kind = 'bar', color = sns.color_palette(\"Blues_r\"), title = \"Number of digit classes\", figsize = (12,6));","metadata":{"execution":{"iopub.status.busy":"2023-12-31T20:02:47.400360Z","iopub.execute_input":"2023-12-31T20:02:47.400635Z","iopub.status.idle":"2023-12-31T20:02:47.696443Z","shell.execute_reply.started":"2023-12-31T20:02:47.400610Z","shell.execute_reply":"2023-12-31T20:02:47.695475Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"    Seems like all the digits in the same range, So the label is Balanced","metadata":{}},{"cell_type":"markdown","source":"# Reshape the data to (28*28) ","metadata":{}},{"cell_type":"code","source":"X_train = X_train.values.reshape(-1,28,28,1)\ntest = test_df.values.reshape(-1,28,28,1)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"    Keras requires an extra dimension in the end which correspond to channels. MNIST images are gray scaled so it use only  one channel. ","metadata":{}},{"cell_type":"markdown","source":"# Plot some images","metadata":{}},{"cell_type":"code","source":"def plot_images(data, num_of_images):\n    plt.figure(figsize=(15,10))\n    for i in range(num_of_images):\n        index = random.randint(0,len(train_df)) # Get a random row index to display the img of whis row\n            \n        plt.subplot(1,num_of_images,i+1)\n        plt.imshow(data[index],cmap='gray') # Displaying the image in grayscale mode\n        plt.title(y_train[index]) # Since the test data don't contain the label,so I used the y_train\n        plt.axis('off')\n    \n    plt.show()\n    \nplot_images(X_train,5)","metadata":{"scrolled":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Convert the training data into train & validation","metadata":{}},{"cell_type":"code","source":"X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size = 0.2, random_state=42)\n\nprint(\"Train:\")\nprint(X_train.shape)\nprint(y_train.shape)\nprint(\"\\nTest:\")\nprint(X_val.shape)\nprint(y_val.shape)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Rescale the images & Image Augmentation","metadata":{}},{"cell_type":"code","source":"train_datagen = ImageDataGenerator(rescale=1./255,\n                                    rotation_range=15,\n                                    zoom_range = 0.15,  \n                                    width_shift_range=0.1, \n                                    height_shift_range=0.1)\n\nval_datagen = ImageDataGenerator(rescale=1./255)\n\ntrain_generator = train_datagen.flow(X_train, y_train, batch_size=16, shuffle=True)\nval_generator = val_datagen.flow(X_val, y_val, batch_size=16, shuffle=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"    The image augmentation help avoid overfitting in small datasets","metadata":{}},{"cell_type":"markdown","source":"# Making the Model","metadata":{}},{"cell_type":"code","source":"model = Sequential()\n\nmodel.add(InputLayer(input_shape=(28,28,1)))\n\nmodel.add(Conv2D(16, (3*3), activation=\"relu\"))\nmodel.add(MaxPool2D())\n\nmodel.add(Conv2D(32, (3*3), activation=\"relu\"))\nmodel.add(MaxPool2D())\n\nmodel.add(Flatten())\n\nmodel.add(Dense(256, activation=\"relu\"))\nmodel.add(Dense(10, activation=\"softmax\"))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(optimizer=keras.optimizers.Adam(learning_rate=1.5e-4),\n              loss='sparse_categorical_crossentropy',\n              metrics=['accuracy'])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit(train_generator, epochs=15, validation_data=val_generator)","metadata":{"scrolled":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Plot the accuracy","metadata":{}},{"cell_type":"code","source":"tarin_acc = history.history['accuracy']\nval_acc = history.history['val_accuracy']\n\nplt.plot(tarin_acc, c = 'b', label = 'training accuracy')\nplt.plot(val_acc, c = 'r', label = 'validation accuracy')\nplt.title('Model Accuracy', loc ='right')\nplt.legend()\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Plot the Loss","metadata":{}},{"cell_type":"code","source":"train_loss = history.history['loss']\nval_loss = history.history['val_loss']\n\nplt.plot(train_loss, c = 'b', label = 'training loss')\nplt.plot(val_loss, c = 'r', label = 'validation loss')\nplt.title('Model Loss', loc ='right')\nplt.legend()\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Submission ","metadata":{}},{"cell_type":"code","source":"results = model.predict(test)\n\nresults = np.argmax(results,axis = 1)\nresults = pd.Series(results,name=\"Label\")\n\nsubmission = pd.concat([pd.Series(range(1,28001),name = \"ImageId\"),results],axis = 1)\nsubmission.to_csv('Submission.csv',index=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}