{"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":"## About this notebook","metadata":{}},{"cell_type":"markdown","source":"In this notebook I will show you my code that can predict digits on Digit Recognizer competition with around 99% accuracy. \n\nI use adapted Lenet5 architecture that add VGG16 transfer learnig to predict digit in this dataset.","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport tensorflow as tf\nfrom tensorflow.keras.applications.vgg16 import VGG16","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-01-12T09:22:58.980488Z","iopub.execute_input":"2022-01-12T09:22:58.980747Z","iopub.status.idle":"2022-01-12T09:22:58.984591Z","shell.execute_reply.started":"2022-01-12T09:22:58.980717Z","shell.execute_reply":"2022-01-12T09:22:58.983933Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Extract data","metadata":{}},{"cell_type":"code","source":"train=pd.read_csv('../input/digit-recognizer/train.csv')\ntest=pd.read_csv('../input/digit-recognizer/test.csv')\n\n#Extract training set\nx_train=train.drop('label',axis=1)\nx_train=np.array(x_train)/255. #Change pixel intensity from 0-255 to 0-1\nx_train=x_train.reshape(-1,28,28,1)\nx_train=tf.image.resize(x_train,size=(32,32)) #Resize to 32x32 since Lenet5 demand input image shape to be 32x32\ny_train=train['label']\n\n#Extract test set\nx_test=test\nx_test=np.array(x_test)/255. #Change pixel intensity from 0-255 to 0-1\nx_test=x_test.reshape(-1,28,28,1)\nx_test=tf.image.resize(x_test,size=(32,32))","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2022-01-12T09:22:58.997194Z","iopub.execute_input":"2022-01-12T09:22:58.997406Z","iopub.status.idle":"2022-01-12T09:23:03.693045Z","shell.execute_reply.started":"2022-01-12T09:22:58.997382Z","shell.execute_reply":"2022-01-12T09:23:03.692288Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Create neural network","metadata":{}},{"cell_type":"code","source":"vgg=VGG16(include_top=False,weights='imagenet')\n\n#connect layers\ninput=tf.keras.Input(shape=(32,32,1))\nx=tf.keras.layers.Conv2D(3,1)(input)\nx=vgg(x)\nx=tf.keras.layers.Flatten()(x)\nx=tf.keras.layers.Dense(120,activation='relu')(x)\nx=tf.keras.layers.Dense(84,activation='relu')(x)\noutput=tf.keras.layers.Dense(10,activation='softmax')(x)\n\n#connect model\nmodel=tf.keras.Model(input,output)\n\n#compile model\nmodel.compile(loss='sparse_categorical_crossentropy',optimizer='sgd',metrics=['accuracy'])","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2022-01-12T09:23:03.695158Z","iopub.execute_input":"2022-01-12T09:23:03.695669Z","iopub.status.idle":"2022-01-12T09:23:04.048077Z","shell.execute_reply.started":"2022-01-12T09:23:03.695629Z","shell.execute_reply":"2022-01-12T09:23:04.04732Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"execution":{"iopub.status.busy":"2022-01-12T09:23:04.049398Z","iopub.execute_input":"2022-01-12T09:23:04.049668Z","iopub.status.idle":"2022-01-12T09:23:04.059899Z","shell.execute_reply.started":"2022-01-12T09:23:04.049632Z","shell.execute_reply":"2022-01-12T09:23:04.059113Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Fit the model","metadata":{}},{"cell_type":"markdown","source":"I split data into validation set and use checkpoint to find best parameters while fitting.","metadata":{}},{"cell_type":"code","source":"checkpoint=tf.keras.callbacks.ModelCheckpoint(monitor='val_accuracy',save_best_only=True,filepath='my_best_model.hdf5')\n\nhistory=model.fit(x_train,y_train,epochs=10,validation_split=0.2,callbacks=[checkpoint])","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2022-01-12T09:42:32.08273Z","iopub.execute_input":"2022-01-12T09:42:32.083412Z","iopub.status.idle":"2022-01-12T09:43:43.265801Z","shell.execute_reply.started":"2022-01-12T09:42:32.083377Z","shell.execute_reply":"2022-01-12T09:43:43.264597Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Load best model and predict digits","metadata":{}},{"cell_type":"code","source":"model=tf.keras.models.load_model('./my_best_model.hdf5')\n\ny_test=model.predict(x_test)\nresult=np.argmax(y_test,axis=1) #Since Lenet5 only predict probability of each digits from input image, we extract only digit with most proability\nresult_CSV=pd.DataFrame({'ImageId':range(1,len(result)+1),'Label':result})\nresult_CSV=result_CSV.set_index('ImageId')\nresult_CSV.to_csv('submission.csv')","metadata":{"execution":{"iopub.status.busy":"2022-01-12T09:30:26.854016Z","iopub.status.idle":"2022-01-12T09:30:26.854427Z","shell.execute_reply.started":"2022-01-12T09:30:26.854238Z","shell.execute_reply":"2022-01-12T09:30:26.854263Z"},"trusted":true},"execution_count":null,"outputs":[]}]}