{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load in \n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory\n\nimport os\nprint(os.listdir(\"../input\"))\n\n# Any results you write to the current directory are saved as output.","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom keras.utils import to_categorical\nimport os\nimport time\nfrom keras.models import Sequential\nfrom keras.layers import Dense,Conv2D,Flatten,Dropout,MaxPooling2D,BatchNormalization\nfrom keras.callbacks import EarlyStopping\nfrom sklearn.metrics import accuracy_score\nfrom sklearn.metrics import confusion_matrix\nimport seaborn as sns\nfrom keras import optimizers\nfrom sklearn.metrics import classification_report","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Caricamento e pre-processing dei dati\npath_train='../input/train.csv'\npath_test=\"../input/test.csv\"\n\n# Carico all'interno di un dataframe train e test set\ntrain=pd.read_csv(path_train)\ntest=pd.read_csv(path_test)\n\n# Creo gli array numpy per le features e i target sia per il train che per il test set\nX_train=train.drop(\"label\",axis=1).values\nY_train=train[\"label\"].values\nX_test=test.values\n\n# Avendo a che fare con immagini è buona norma normalizzare i dati\nX_train=X_train/X_train.max()\nX_test=X_test/X_test.max()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Visulizziamo le prima occorrenza di ogni immagine nel train set\nplt.figure(figsize = (10,10))\nfor i in range(0,10):\n    plt.subplot(3,4,i+1)\n    plt.xticks([])\n    plt.yticks([])\n    plt.grid(False)\n    m=X_train[Y_train==i][0].reshape([28,28])\n    plt.xlabel(str(i))\n    plt.imshow(m,cmap=\"gray\")\nplt.suptitle(\"First occurrence of each digit in train set\",fontsize=18)\nplt.savefig(\"Firs_occ_digits\")\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Creiamo delle variabili dummy per i label\nlabel=[0,1,2,3,4,5,6,7,8,9]\nnc=10\nY_train_d=to_categorical(Y_train,10)\n\n# Effettuo il resize dell'immagine ed aggiungo un'ulteriore dimensione contenete il numero di canali dell'immagine\nX_train_c=X_train.reshape(-1,28,28,1)\nX_test_c=X_test.reshape(-1,28,28,1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"np.random.seed(2)\nm=Sequential()\nm.add(Conv2D(filters=128,kernel_size=4,padding=\"same\",activation=\"relu\",input_shape=(28,28,1)))\nm.add(Conv2D(filters=128,kernel_size=4,padding=\"same\",activation=\"relu\"))\nm.add(MaxPooling2D(pool_size=2,strides=2))\nm.add(Dropout(0.2))\nm.add(Conv2D(filters=64,kernel_size=4,padding=\"same\",activation=\"relu\",))\nm.add(Conv2D(filters=64,kernel_size=4,padding=\"same\",activation=\"relu\"))\nm.add(MaxPooling2D(pool_size=2,strides=2))\nm.add(Dropout(0.2))\nm.add(Flatten())\nm.add(Dense(1024,activation=\"relu\"))\nm.add(Dropout(0.2))\nm.add(Dense(512,activation=\"relu\"))\nm.add(Dropout(0.4))\nm.add(Dense(256,activation=\"relu\"))\nm.add(Dropout(0.6))\nm.add(Dense(128,activation=\"relu\"))\nm.add(Dense(nc,activation='softmax'))\nm.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Utilizziamo adesso come ottimizzatore l'adam\n# Come funzione i costo la : categorical crossentropy\n# Utilizziamo l'early stopping in modo che se dopo un certo numero di epcohe non si migliora di un certo min_delta\n# l'Addestramento viene bloccato\nel=EarlyStopping(monitor='val_loss',min_delta=0.001,patience=5,restore_best_weights=True)\nad=optimizers.Adam(lr=0.002,beta_1=0.9,beta_2=0.999,decay=0.004)\nm.compile(loss=\"categorical_crossentropy\",optimizer=ad,metrics=[\"accuracy\"])\ns=time.time()\nh=m.fit(X_train_c,Y_train_d,batch_size=32,validation_split=0.4,epochs=50,callbacks=[el])\ne=time.time()\nt=e-s\nprint(\"Addestramento completato in %d minuti e %d secondi\" %(t/60,t*60))\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"acc=h.history['acc']\nval_acc=h.history['val_acc']\nloss=h.history['loss']\nval_loss=h.history['val_loss']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Trend of accuracy during the training \nplt.plot(acc)\nplt.plot(val_acc)\nplt.title('Digit Recognizer Accuracy')\nplt.ylabel('Accuracy')\nplt.xlabel('Epoch')\nplt.legend(['Train','Validation'])\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Trend of loss during the training \nplt.plot(loss)\nplt.plot(val_loss)\nplt.title('Digit Recognizer Loss')\nplt.ylabel('Loss')\nplt.xlabel('Epoch')\nplt.legend(['Train','Validation'])\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\ny_pred_train=m.predict(X_train_c)\ny_pred_train = np.argmax(y_pred_train,axis = 1)\n\ny_pred_train=np.array(y_pred_train,dtype='int')\nY_train=np.array(Y_train,dtype='int')\n\ncm=confusion_matrix(Y_train,y_pred_train)\ncm_df = pd.DataFrame(cm,index = ['0','1','2','3','4','5','6','7','8','9'],  columns =['0','1','2','3','4','5','6','7','8','9'])\nplt.figure(figsize=(10,10))\nsns.heatmap(cm_df,annot=True,cmap=\"Blues_r\",linewidth=0.5,square=True,fmt='g')\n\nplt.ylabel(\"True Label \")\nplt.xlabel(\"Predict Label\")\nplt.title(\"CONFUSION MATRIX FOR TRAINING SET\")\n\na=sum(np.diag(cm))\nb=sum(sum(cm))\nacc=(a/b)*100\nprint('Accuracy on Training Set: %.2f ' %(acc))\n\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"y_test=m.predict(X_test_c)\ny_test = np.argmax(y_test,axis = 1)\nout=pd.DataFrame({\"ImageId\": list(range(1,len(y_test)+1)),\"Label\": y_test})\nout.to_csv(\"Submission_cnn.csv\", index=False, header=True)","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}