{"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":"import tensorflow as tf\nimport numpy as np\nimport pandas as pd\nfrom tensorflow.keras import Sequential\nfrom tensorflow.keras.layers import *\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom sklearn.model_selection import train_test_split\nimport matplotlib.pyplot as plt\nimport datetime\nfrom tensorflow.keras.optimizers import RMSprop","metadata":{"id":"glbefNsmA7la","execution":{"iopub.status.busy":"2021-06-03T11:47:16.025620Z","iopub.execute_input":"2021-06-03T11:47:16.025961Z","iopub.status.idle":"2021-06-03T11:47:16.032543Z","shell.execute_reply.started":"2021-06-03T11:47:16.025929Z","shell.execute_reply":"2021-06-03T11:47:16.031440Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"path_train = \"../input/digit-recognizer/train.csv\"\npath_test = \"../input/digit-recognizer/test.csv\"","metadata":{"id":"8YejYLNAA8de","execution":{"iopub.status.busy":"2021-06-03T11:47:16.033957Z","iopub.execute_input":"2021-06-03T11:47:16.034483Z","iopub.status.idle":"2021-06-03T11:47:16.045211Z","shell.execute_reply.started":"2021-06-03T11:47:16.034445Z","shell.execute_reply":"2021-06-03T11:47:16.044323Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train = pd.read_csv(path_train,delimiter=',', index_col=False)\n\ntraining_labels = df_train.iloc[:,0].astype('int')\ntraining_labels = np.array(training_labels)\n\ntraining_images = df_train.iloc[:,1:]\ntraining_images = np.array(training_images)\ntraining_images = training_images.astype('float').reshape(training_images.shape[0], 28, 28)","metadata":{"id":"6o2jrQ8gBIg9","execution":{"iopub.status.busy":"2021-06-03T11:47:16.047016Z","iopub.execute_input":"2021-06-03T11:47:16.047376Z","iopub.status.idle":"2021-06-03T11:47:18.252906Z","shell.execute_reply.started":"2021-06-03T11:47:16.047319Z","shell.execute_reply":"2021-06-03T11:47:18.251995Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_test = pd.read_csv(path_test,delimiter=',', index_col=False)\n\ntesting_images = np.array(df_test)\ntesting_images = testing_images.astype('float').reshape(testing_images.shape[0], 28, 28)","metadata":{"id":"nHVRZDeYgzsj","execution":{"iopub.status.busy":"2021-06-03T11:47:18.254509Z","iopub.execute_input":"2021-06-03T11:47:18.254844Z","iopub.status.idle":"2021-06-03T11:47:19.638939Z","shell.execute_reply.started":"2021-06-03T11:47:18.254806Z","shell.execute_reply":"2021-06-03T11:47:19.638050Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train, X_test, y_train,y_test = train_test_split(training_images,training_labels,test_size=0.01,shuffle=True)","metadata":{"id":"jVdxYgdZBIcA","execution":{"iopub.status.busy":"2021-06-03T11:47:19.640209Z","iopub.execute_input":"2021-06-03T11:47:19.640628Z","iopub.status.idle":"2021-06-03T11:47:20.009086Z","shell.execute_reply.started":"2021-06-03T11:47:19.640585Z","shell.execute_reply":"2021-06-03T11:47:20.008131Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Print example figure\nfig = plt.figure\nplt.imshow(X_train[12], cmap='gray')\nplt.show()","metadata":{"id":"DDhMlOOLBIZy","outputId":"99707ae2-1767-4f94-a3e1-61900019ed4a","scrolled":true,"execution":{"iopub.status.busy":"2021-06-03T11:47:20.010491Z","iopub.execute_input":"2021-06-03T11:47:20.011029Z","iopub.status.idle":"2021-06-03T11:47:20.142704Z","shell.execute_reply.started":"2021-06-03T11:47:20.010988Z","shell.execute_reply":"2021-06-03T11:47:20.141768Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train = X_train.reshape(X_train.shape[0],28,28,1)\nX_test = X_test.reshape(X_test.shape[0],28,28,1)","metadata":{"id":"GBwZ7B4dBN21","execution":{"iopub.status.busy":"2021-06-03T11:47:20.144012Z","iopub.execute_input":"2021-06-03T11:47:20.144356Z","iopub.status.idle":"2021-06-03T11:47:20.148871Z","shell.execute_reply.started":"2021-06-03T11:47:20.144319Z","shell.execute_reply":"2021-06-03T11:47:20.147945Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen = ImageDataGenerator(rescale=1./255,\n                                   width_shift_range=0.1,\n                                   height_shift_range=0.1,\n                                   shear_range=0.1,\n                                   rotation_range=0.2)\n\ntrain_generator = train_datagen.flow(X_train,y_train,batch_size=128)\n\nvalidation_datagen = ImageDataGenerator(rescale=1./255)\ntest_generator = validation_datagen.flow(X_test,y_test,batch_size=128)","metadata":{"id":"gtH2OekqBN0T","execution":{"iopub.status.busy":"2021-06-03T11:47:20.151505Z","iopub.execute_input":"2021-06-03T11:47:20.152005Z","iopub.status.idle":"2021-06-03T11:47:20.212371Z","shell.execute_reply.started":"2021-06-03T11:47:20.151970Z","shell.execute_reply":"2021-06-03T11:47:20.211453Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class myCallback(tf.keras.callbacks.Callback):\n    def on_epoch_end(self,epoch,logs={}):\n        if(logs.get('loss')<1e-6 and logs.get('accuracy')==1.0):\n            print(\"Stop training!\")\n            self.model.stop_training=True\n\ncallbacks = myCallback()","metadata":{"execution":{"iopub.status.busy":"2021-06-03T11:47:20.214045Z","iopub.execute_input":"2021-06-03T11:47:20.214383Z","iopub.status.idle":"2021-06-03T11:47:20.220302Z","shell.execute_reply.started":"2021-06-03T11:47:20.214347Z","shell.execute_reply":"2021-06-03T11:47:20.219082Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# create model\ndef create_model():\n    \n    model = Sequential()\n    model.add(Conv2D(128,(5,5),strides=(1, 1), padding='same',activation='relu',input_shape=(28,28,1)))\n    model.add(Conv2D(128,(5,5),strides=(1, 1), padding='same',activation='relu'))\n    model.add(MaxPooling2D(2,2))\n    model.add(Dropout(0.3))\n    model.add(Conv2D(64,(5,5),strides=(1, 1), padding='same',activation='relu'))\n    model.add(Conv2D(64,(5,5),strides=(1, 1), padding='same',activation='relu'))\n    model.add(MaxPooling2D(2,2))\n    model.add(Dropout(0.3)) \n    model.add(Conv2D(32,(5,5),strides=(1, 1), padding='same',activation='relu'))\n    model.add(Conv2D(32,(5,5),strides=(1, 1), padding='same',activation='relu'))\n    model.add(Conv2D(32,(5,5),strides=(1, 1), padding='same',activation='relu'))\n    model.add(MaxPooling2D(2,2))\n    model.add(Dropout(0.3))\n    model.add(Dropout(0.3))\n    model.add(Flatten())\n    model.add(Dense(512,activation='relu'))\n    model.add(Dropout(0.3))\n    model.add(Dense(10,activation='softmax'))\n        \n    model.compile(optimizer='adam',\n              loss='sparse_categorical_crossentropy',\n              metrics=['accuracy'])\n    \n    return model","metadata":{"execution":{"iopub.status.busy":"2021-06-03T11:47:20.221929Z","iopub.execute_input":"2021-06-03T11:47:20.222299Z","iopub.status.idle":"2021-06-03T11:47:20.380451Z","shell.execute_reply.started":"2021-06-03T11:47:20.222248Z","shell.execute_reply":"2021-06-03T11:47:20.379504Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# from keras.optimizers import RMSprop\nfrom tensorflow.keras.callbacks import ReduceLROnPlateau\n\nlearning_rate_reduction = ReduceLROnPlateau(monitor='loss', \n                                            patience=5, \n                                            verbose=1, \n                                            factor=0.2, \n                                            min_lr=0.00001)","metadata":{"execution":{"iopub.status.busy":"2021-06-03T11:47:20.381702Z","iopub.execute_input":"2021-06-03T11:47:20.382073Z","iopub.status.idle":"2021-06-03T11:47:20.395640Z","shell.execute_reply.started":"2021-06-03T11:47:20.382035Z","shell.execute_reply":"2021-06-03T11:47:20.394816Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = create_model()\n\nhistory = model.fit_generator(train_generator,\n                    epochs=100,\n                    validation_data=test_generator,\n                    callbacks=[callbacks,learning_rate_reduction])","metadata":{"scrolled":true,"execution":{"iopub.status.busy":"2021-06-03T11:47:20.397134Z","iopub.execute_input":"2021-06-03T11:47:20.397498Z","iopub.status.idle":"2021-06-03T14:11:20.137178Z","shell.execute_reply.started":"2021-06-03T11:47:20.397464Z","shell.execute_reply":"2021-06-03T14:11:20.136265Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"acc = history.history['accuracy']\nval_acc = history.history['val_accuracy']\nloss = history.history['loss']\nval_loss = history.history['val_loss']\n\nepochs = range(len(acc))\n\nplt.plot(epochs, acc, 'r', label='Training accuracy')\nplt.plot(epochs, val_acc, 'b', label='Validation accuracy')\nplt.title('Training and validation accuracy')\nplt.legend()\nplt.figure()\n\nplt.plot(epochs, loss, 'r', label='Training Loss')\nplt.plot(epochs, val_loss, 'b', label='Validation Loss')\nplt.title('Training and validation loss')\nplt.legend()\n\nplt.show()","metadata":{"id":"uEyrzqO8IzuO","outputId":"b2f054a5-d629-494d-dada-979a71d755e0","execution":{"iopub.status.busy":"2021-06-03T14:11:20.139017Z","iopub.execute_input":"2021-06-03T14:11:20.139422Z","iopub.status.idle":"2021-06-03T14:11:20.589708Z","shell.execute_reply.started":"2021-06-03T14:11:20.139358Z","shell.execute_reply":"2021-06-03T14:11:20.587804Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df = testing_images.reshape(testing_images.shape[0],28,28,1)","metadata":{"id":"aD20vrk9i3VN","execution":{"iopub.status.busy":"2021-06-03T14:11:22.183169Z","iopub.execute_input":"2021-06-03T14:11:22.183559Z","iopub.status.idle":"2021-06-03T14:11:22.188064Z","shell.execute_reply.started":"2021-06-03T14:11:22.183521Z","shell.execute_reply":"2021-06-03T14:11:22.186853Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_preds = model.predict(test_df)","metadata":{"id":"061ugTo-Jqv4","execution":{"iopub.status.busy":"2021-06-03T14:11:22.189771Z","iopub.execute_input":"2021-06-03T14:11:22.190119Z","iopub.status.idle":"2021-06-03T14:12:16.508706Z","shell.execute_reply.started":"2021-06-03T14:11:22.190085Z","shell.execute_reply":"2021-06-03T14:12:16.507798Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels = [np.argmax(X) for X in test_preds]\nimage_id = [i+1 for i in range(len(test_preds))]\n\nsubmission = pd.DataFrame({'ImageId': image_id,\n                           'Label': labels},\n                          index=None)","metadata":{"id":"AB2aC2ppjBkm","execution":{"iopub.status.busy":"2021-06-03T14:12:16.510242Z","iopub.execute_input":"2021-06-03T14:12:16.510604Z","iopub.status.idle":"2021-06-03T14:12:16.624661Z","shell.execute_reply.started":"2021-06-03T14:12:16.510565Z","shell.execute_reply":"2021-06-03T14:12:16.623874Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.to_csv('submission.csv', index=False)\n","metadata":{"id":"VP7S_tVSjOtq","execution":{"iopub.status.busy":"2021-06-03T14:12:16.625879Z","iopub.execute_input":"2021-06-03T14:12:16.626213Z","iopub.status.idle":"2021-06-03T14:12:16.923682Z","shell.execute_reply.started":"2021-06-03T14:12:16.626177Z","shell.execute_reply":"2021-06-03T14:12:16.922719Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pd.read_csv(\"submission.csv\")","metadata":{"id":"jGbR-dvjjREP","outputId":"89f6e9e3-2ef0-4bdf-e1a6-d556c6fb776c","execution":{"iopub.status.busy":"2021-06-03T14:12:16.925082Z","iopub.execute_input":"2021-06-03T14:12:16.925465Z","iopub.status.idle":"2021-06-03T14:12:16.948579Z","shell.execute_reply.started":"2021-06-03T14:12:16.925426Z","shell.execute_reply":"2021-06-03T14:12:16.947680Z"},"trusted":true},"execution_count":null,"outputs":[]}]}