{"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 pandas as pd\nimport tensorflow as tf\nfrom scikeras.wrappers import KerasClassifier\ndf = pd.read_csv(r\"E:\\DataSets\\train.csv\")\ndf.shape","metadata":{"id":"BMZGWH3KdFpq","outputId":"1f37fd75-5d62-4121-a67f-7beea27430de"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Checking if GPU is available","metadata":{}},{"cell_type":"code","source":"print(\"Num GPUs Available: \", len(tf.config.list_physical_devices('GPU')))\n","metadata":{"id":"UZKBagmMdFps","outputId":"892e602d-4b75-4ea7-e799-1899ad212448"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Dropping NaN values","metadata":{}},{"cell_type":"code","source":"import numpy as np\nnp.unique(df['label'].values)","metadata":{"id":"AL52b-7-dFpt","outputId":"36c35914-8870-45a7-d4e2-5b7b7ff6058c"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Creating target and labels variables","metadata":{}},{"cell_type":"code","source":"df = df.dropna()","metadata":{"id":"cGIF9Yl8mdpF"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Vizualising data\n","metadata":{}},{"cell_type":"code","source":"import seaborn as sns\nsns.histplot(df['label'])","metadata":{"id":"i5JQ2Ui2dFpu","outputId":"f69bff12-20ca-466b-e522-f74b1a79c75f"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nis_duplicated = df.duplicated()\nprint(\"TOTAL OF DUPLICATE VALUES: %d\"%is_duplicated.sum())\nprint(' ')\nprint(\"TOTAL OF NaN values: %d\"%df.isna().sum().sum())","metadata":{"id":"GX5-q6MedFpv","outputId":"2a287685-fbc9-44d5-e7b3-7d9c565539ac"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.isna().sum()","metadata":{"id":"EueVOxDGhZDm","outputId":"6fdae3e6-8f82-499e-c8da-4f6405930818"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Creating labels and targets","metadata":{}},{"cell_type":"code","source":"x_df = df.drop(labels='label',axis=1)\ny_df = df[['label']]\ny_df.shape,x_df.shape,df.shape","metadata":{"id":"dOSCkKsUdFpw","outputId":"f3d88552-c2fa-4af4-9c91-e25a906d52f9"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualization","metadata":{}},{"cell_type":"code","source":"from random import randint\nimport numpy as np\nimport matplotlib.pyplot as plt\nrand = randint(0,300)\npixels = np.array(x_df.iloc[rand],dtype='uint8')\npixels = pixels.reshape((28, 28))\nplt.title('Label is {label}'.format(label=y_df.iloc[rand]))\nplt.imshow(pixels, cmap='gray')\nplt.show()\n","metadata":{"id":"q_e7hjfddFpx","outputId":"fcd43bf4-6ef7-4881-a884-b87186849585"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Train-test split","metadata":{}},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\nx_train,x_test,y_train,y_test = train_test_split(x_df,y_df,train_size=0.2,shuffle=True,random_state=777)","metadata":{"id":"Kg5YlAJAdFpy"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_train.shape,x_test.shape,y_train.shape,y_test.shape","metadata":{"id":"D4cY2y6sdFpz","outputId":"4c6650fb-f5aa-4a5d-a4ad-ac777fcaaecf"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Creating FEED-FORWARD-MODEL","metadata":{}},{"cell_type":"code","source":"\ndef create_model(hidden_layer_sizes,activation_func,hidden_layer_dim):\n    model = tf.keras.models.Sequential()\n    model.add(tf.keras.layers.Dense(units=hidden_layer_sizes,activation=activation_func,input_shape = (784,)))\n\n    for n in range(hidden_layer_dim):\n      model.add(tf.keras.layers.Dense(hidden_layer_sizes, activation=activation_func))\n    model.add(tf.keras.layers.Dense(10, activation='softmax'))\n    model.compile(optimizer='Adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])\n\n    return model","metadata":{"id":"Zq6URFsmdFp0"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Tuning and searching optimal hyperparameters","metadata":{}},{"cell_type":"code","source":"from sklearn.model_selection import GridSearchCV\nparams = {\n    'model__hidden_layer_sizes': [150,300,600,1200,2400],\n    'model__activation_func': ['relu','sigmoid'],\n    'model__hidden_layer_dim': [1,2]\n\n}\nclf = KerasClassifier(model=create_model)\ngs=GridSearchCV(estimator=clf, param_grid=params, cv=5)\n# now fit the dataset to the GridSearchCV object. \ngs = gs.fit(x_df, y_df)","metadata":{"id":"T82-SIfXdFp1","outputId":"812ed031-76d5-4fe9-ce34-74eadf4c6b00"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"gs.best_estimator_","metadata":{"id":"atqU9fkHdFp2","outputId":"49626a98-a0a6-492f-90e6-d006709d2aef"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Best estimator (feed-forward)","metadata":{}},{"cell_type":"code","source":"gs.best_score_","metadata":{"id":"R4LiS74gdFp4","outputId":"101e778f-fc8c-4103-89a8-5e0c977230c8"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Best score","metadata":{}},{"cell_type":"code","source":"pd.DataFrame(gs.cv_results_)","metadata":{"id":"ZOxjyUhOdFp5","outputId":"1e603bd3-dd96-4125-e151-dc9ed643796c"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Final model\n","metadata":{}},{"cell_type":"code","source":"final_model = create_model(2400,'sigmoid',1)\nfinal_model.summary()\n","metadata":{"id":"P-p_oX9OnZKv","outputId":"f26ef5cc-21a2-42d9-d191-dccfe7264fe9"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"epochs_hist = final_model.fit(x_train,y_train,batch_size=10,epochs=50,validation_split=0.2)","metadata":{"id":"wgtF7nkErjJ9","outputId":"81484b3e-23dc-443f-acb9-8a9a43574439"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Performance graphs","metadata":{}},{"cell_type":"code","source":"epochs_hist.history.keys()","metadata":{"id":"z2XPGLNersGh","outputId":"8d2d9bd0-afe7-4ed1-9a99-3230da4b559b"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(epochs_hist.history['loss'])\nplt.xlabel('Epoch');\nplt.ylabel('Loss');\nplt.title('Loss-Epoch chart');","metadata":{"id":"-rts1t-qtl4r","outputId":"10d7d32a-0daa-415c-8e52-4c54380c149b"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(epochs_hist.history['val_accuracy']);\nplt.xlabel('Epoch');\nplt.ylabel('Validation Accuracy');\nplt.title('Validation Accuracy-Epoch chart');","metadata":{"id":"PQsutXocsxJ-","outputId":"ca91f99d-5732-43c5-9284-3305f07a8c32"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(epochs_hist.history['val_loss'])\nplt.xlabel('Epoch');\nplt.ylabel('Validation Loss');\nplt.title('Validation Loss-Epoch chart');\n","metadata":{"id":"PqY1jaketiTv","outputId":"57894375-2ff8-42a2-a3d7-9991f1810fb4"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Convolutional Model","metadata":{}},{"cell_type":"code","source":"\ndef create_convolutional_model(conv_layers_num,filter_num,hidden_layer_sizes,activation_func,hidden_layer_dim):\n    model = tf.keras.models.Sequential()\n    model.add(tf.keras.layers.Conv2D(filter_num,kernel_size=[3,3],activation='relu',padding='same',input_shape=(28,28,1)))\n    model.add(tf.keras.layers.MaxPooling2D((2,2)))\n    for n in range(conv_layers_num):\n      model.add(tf.keras.layers.Conv2D(filter_num*2,padding='same',activation='relu',kernel_size=[3,3]))\n      model.add(tf.keras.layers.MaxPooling2D((2,2)))\n    model.add(tf.keras.layers.Conv2D(filter_num*2,padding='same',activation='relu',kernel_size=[3,3]))\n    model.add(tf.keras.layers.Flatten())\n    model.add(tf.keras.layers.Dense(units=hidden_layer_sizes,activation=activation_func))\n    for n in range(hidden_layer_dim):\n      model.add(tf.keras.layers.Dense(hidden_layer_sizes, activation=activation_func))\n    model.add(tf.keras.layers.Dense(10, activation='softmax'))\n    model.compile(optimizer='Adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])\n\n    return model","metadata":{"id":"7ZhHin7Ku2VE"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_df=x_df.values.reshape(x_df.shape[0],28,28,1)\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Finding optimal conv2d parameters with GRIDSEARCHCV!","metadata":{}},{"cell_type":"code","source":"from sklearn.model_selection import GridSearchCV\n\n\nparams = {\n    #MEXI NO CONVLAYERNUM\n    'model__conv_layers_num': [1,2,3],\n    'model__filter_num': [32,64,128],\n    'model__hidden_layer_sizes': [2400],\n    'model__activation_func': ['relu'],\n    'model__hidden_layer_dim': [2]\n\n}\nclf = KerasClassifier(model=create_convolutional_model)\ngs=GridSearchCV(estimator=clf, param_grid=params, cv=5)\n# now fit the dataset to the GridSearchCV object. \ngs = gs.fit(x_df, y_df)","metadata":{"id":"0O2yRfc5J8CQ"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pd.DataFrame(gs.cv_results_)","metadata":{"id":"CspzmJhRVHUI","outputId":"882f83a8-004b-42bd-c82a-d87d371267d6"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"final_conv_model = create_convolutional_model(3,32,2400,'relu',2)\nfinal_conv_model.summary()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualizing ConvModel","metadata":{}},{"cell_type":"code","source":"import visualkeras\nvisualkeras.layered_view(final_conv_model, legend=True)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Performance Graphs","metadata":{}},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nplt.plot(epochs_hist.history['loss'])\nplt.xlabel('Epoch');\nplt.ylabel('Loss');\nplt.title('Loss-Epoch chart');","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(epochs_hist.history['val_accuracy']);\nplt.xlabel('Epoch');\nplt.ylabel('Validation Accuracy');\nplt.title('Validation Accuracy-Epoch chart');","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(epochs_hist.history['val_loss'])\nplt.xlabel('Epoch');\nplt.ylabel('Validation Loss');\nplt.title('Validation Loss-Epoch chart');","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Performance Metrics\n","metadata":{}},{"cell_type":"code","source":"from sklearn.metrics import classification_report\nimport numpy as np\ny_pred = final_conv_model.predict(x_test)\nclass_labels = ['0','1', '2', '3', '4', '5', '6', '7','8','9']\n\nprint(classification_report(y_test,np.argmax(y_pred,axis=1),target_names = class_labels))\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import classification_report\nimport numpy as np\ny_pred = final_model.predict(x_test)\nclass_labels = ['0','1', '2', '3', '4', '5', '6', '7','8','9']\n\nprint(classification_report(y_test,np.argmax(y_pred,axis=1),target_names = class_labels))\n","metadata":{},"execution_count":null,"outputs":[]}]}