{"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","metadata":{"id":"glbefNsmA7la","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","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","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","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.1,shuffle=False)","metadata":{"id":"jVdxYgdZBIcA","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","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","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen = ImageDataGenerator(rescale=1./255,\n                                   width_shift_range=0.2,\n                                   height_shift_range=0.2,\n                                   zoom_range=0.2,\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","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('val_loss')<0.01):\n            print(\"Stop training!\")\n            self.model.stop_training=True\n\ncallbacks = myCallback()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# create model\nmodel = Sequential()\nmodel.add(Conv2D(128,(5,5),strides=(1, 1), padding='same',activation='relu',input_shape=(28,28,1)))\nmodel.add(Conv2D(128,(5,5),strides=(1, 1), padding='same',activation='relu'))\nmodel.add(MaxPooling2D(2,2))\nmodel.add(Dropout(0.5))\nmodel.add(Conv2D(64,(5,5),strides=(1, 1), padding='same',activation='relu',input_shape=(28,28,1)))\nmodel.add(Conv2D(64,(5,5),strides=(1, 1), padding='same',activation='relu'))\nmodel.add(MaxPooling2D(2,2))\nmodel.add(Dropout(0.5))\nmodel.add(Flatten())\nmodel.add(Dense(512,activation='relu'))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(256,activation='relu'))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(64,activation='relu'))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(10,activation='softmax'))","metadata":{"id":"RRoL-diNBNx2","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"id":"f_KM5Wu-BNvW","outputId":"f6755b91-0161-4e3a-c0a8-41451bebfd4a","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# from keras.optimizers import RMSprop\n# from keras.callbacks import ReduceLROnPlateau\n\n# learning_rate_reduction = ReduceLROnPlateau(monitor='val_acc', \n#                                             patience=3, \n#                                             verbose=1, \n#                                             factor=0.5, \n#                                             min_lr=0.00001)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(optimizer='adam',\n              loss='sparse_categorical_crossentropy',\n              metrics=['accuracy'])","metadata":{"id":"15jlUXt0BNs5","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit_generator(train_generator,\n                    epochs=100,\n                    validation_data=test_generator,callbacks=[callbacks])","metadata":{"id":"b97E0ZcuIzwj","outputId":"4282158a-118c-4522-fa77-963160333072","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","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.evaluate(X_test,y_test)","metadata":{"id":"kuunIpktj-hN","outputId":"54f0a586-3d67-42ed-9422-546e167a0dfa","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","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_preds = model.predict(test_df)","metadata":{"id":"061ugTo-Jqv4","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","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.to_csv('submission.csv', index=False)\n","metadata":{"id":"VP7S_tVSjOtq","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","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_preds.shape","metadata":{"id":"UZ-sdo97jUUB","outputId":"44ab0fa0-392a-47f5-84e7-3e19cc215f6a","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"id":"PNK3TXvhUYog"},"execution_count":null,"outputs":[]}]}