{"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 numpy as np\nimport pandas as pd\nimport tensorflow as tf\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nfrom tensorflow.keras import Model\nfrom tensorflow.keras.layers import Dense, Flatten, Conv2D, MaxPool2D, Dropout\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-06-29T06:57:11.478692Z","iopub.execute_input":"2022-06-29T06:57:11.479085Z","iopub.status.idle":"2022-06-29T06:57:11.492785Z","shell.execute_reply.started":"2022-06-29T06:57:11.479053Z","shell.execute_reply":"2022-06-29T06:57:11.491569Z"},"jupyter":{"source_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# <center>Keras Sequential Model Quickstart 🚀 </center>\nIn this notebook, we'll go through Keras Sequential Model API so you can easily get started with Tensorflow. \n\n# Table of content \n\n<a id=\"toc\"></a>\n[1. Loading and preprocessing data (reshape and scaling)](#1)<br>\n[2. Build a simple Sequential model and understand the math behind it](#2)<br>\n[3. Define a loss function, compile and fit our model.](#3)<br>\n[4. Prediction and submission](#4)<br>\n \n\n\n## <center> Hope you'll like it and don't forget to upvote if you find it useful 👍 </center>","metadata":{}},{"cell_type":"markdown","source":"<a id=\"1\"></a>\n# **<center><span style=\"color:#FF7B5F;\">1. Loading and preprocessing data (reshape and scaling)</span></center>**\nLet's first start by loading the data using pandas.","metadata":{}},{"cell_type":"code","source":"train = pd.read_csv('/kaggle/input/digit-recognizer/train.csv')\ntest = pd.read_csv('/kaggle/input/digit-recognizer/test.csv')","metadata":{"execution":{"iopub.status.busy":"2022-06-29T06:57:12.238005Z","iopub.execute_input":"2022-06-29T06:57:12.238385Z","iopub.status.idle":"2022-06-29T06:57:16.710803Z","shell.execute_reply.started":"2022-06-29T06:57:12.238352Z","shell.execute_reply":"2022-06-29T06:57:16.70986Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('train shape: ', train.shape)\nprint('test shape: ', test.shape)\ntrain.head()","metadata":{"execution":{"iopub.status.busy":"2022-06-29T06:57:16.713166Z","iopub.execute_input":"2022-06-29T06:57:16.713625Z","iopub.status.idle":"2022-06-29T06:57:16.734428Z","shell.execute_reply.started":"2022-06-29T06:57:16.713581Z","shell.execute_reply":"2022-06-29T06:57:16.733072Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_train, x_test, y_train = train.drop('label', axis =1), test.copy(), train['label']\nsns.countplot(x=y_train)","metadata":{"execution":{"iopub.status.busy":"2022-06-29T06:57:16.736157Z","iopub.execute_input":"2022-06-29T06:57:16.736618Z","iopub.status.idle":"2022-06-29T06:57:17.087675Z","shell.execute_reply.started":"2022-06-29T06:57:16.736572Z","shell.execute_reply":"2022-06-29T06:57:17.086728Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Now let's see what is the range of values for x so we can normalize its values.","metadata":{}},{"cell_type":"code","source":"x_train.max().max()","metadata":{"execution":{"iopub.status.busy":"2022-06-29T06:57:17.090744Z","iopub.execute_input":"2022-06-29T06:57:17.092028Z","iopub.status.idle":"2022-06-29T06:57:17.14105Z","shell.execute_reply.started":"2022-06-29T06:57:17.091979Z","shell.execute_reply":"2022-06-29T06:57:17.139736Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Here we'll reshape the image to a 28x28 pixel (which makes more sense than a 1x784 for an image)","metadata":{}},{"cell_type":"code","source":"x_train, x_test = x_train.values.reshape(-1,28,28,1)/255, x_test.values.reshape(-1,28,28,1)/255","metadata":{"execution":{"iopub.status.busy":"2022-06-29T06:57:17.142576Z","iopub.execute_input":"2022-06-29T06:57:17.142908Z","iopub.status.idle":"2022-06-29T06:57:17.355404Z","shell.execute_reply.started":"2022-06-29T06:57:17.142879Z","shell.execute_reply":"2022-06-29T06:57:17.35404Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.imshow(x_train[123][:,:,0], cmap='gray_r')","metadata":{"execution":{"iopub.status.busy":"2022-06-29T06:57:17.357057Z","iopub.execute_input":"2022-06-29T06:57:17.357524Z","iopub.status.idle":"2022-06-29T06:57:17.499756Z","shell.execute_reply.started":"2022-06-29T06:57:17.357481Z","shell.execute_reply":"2022-06-29T06:57:17.498882Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"28x28 is better that 1x784 for visualization isn't it? ","metadata":{}},{"cell_type":"markdown","source":"<a id=\"2\"></a>\n# **<center><span style=\"color:#FF7B5F;\">2. Build a simple Sequential model and understand the math behind it</span></center>**\n","metadata":{}},{"cell_type":"markdown","source":"We define a few layers: \n- the first one takes input of 28x28 \n- the last one gives an output of size 10\n- in the middle you can add other layers, don't forget to add a dropout layer to avoid overfitting on the training data.","metadata":{}},{"cell_type":"code","source":"class MyModel(Model):\n  def __init__(self):\n    super(MyModel, self).__init__()\n    self.conv1 = Conv2D(32, kernel_size =3, activation='relu', input_shape=(28,28,1))\n    self.conv2 = Conv2D(32, 3, activation='relu')\n    self.maxpool1 = MaxPool2D(pool_size=(2,2))\n    self.do1 = Dropout(0.25)\n    \n    self.conv3 = Conv2D(64, 3, activation='relu')\n    self.conv4 = Conv2D(64, 3, activation='relu')\n    self.maxpool2 = MaxPool2D(pool_size=(2,2))\n    self.do2 = Dropout(0.25)\n    \n    self.flatten = Flatten()\n    self.d1 = Dense(256, activation='relu')\n    self.do3 = Dropout(0.4)\n    self.d2 = Dense(10, activation='softmax')\n\n    \n  def call(self, x):\n    x = self.conv1(x)\n    x = self.conv2(x)\n    x = self.maxpool1(x)\n    x = self.do1(x)\n    \n    x = self.conv3(x)\n    x = self.conv4(x)\n    x = self.maxpool2(x)\n    x = self.do2(x)\n    \n    x = self.flatten(x)\n    x = self.d1(x)\n    x = self.do3(x)\n    \n    return self.d2(x)\n\n# Create an instance of the model\nmodel = MyModel()","metadata":{"execution":{"iopub.status.busy":"2022-06-29T07:03:07.3363Z","iopub.execute_input":"2022-06-29T07:03:07.336802Z","iopub.status.idle":"2022-06-29T07:03:07.365692Z","shell.execute_reply.started":"2022-06-29T07:03:07.336763Z","shell.execute_reply":"2022-06-29T07:03:07.364542Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = model(x_train[:1]).numpy()\npredictions","metadata":{"execution":{"iopub.status.busy":"2022-06-29T07:03:07.724968Z","iopub.execute_input":"2022-06-29T07:03:07.725369Z","iopub.status.idle":"2022-06-29T07:03:07.752999Z","shell.execute_reply.started":"2022-06-29T07:03:07.725337Z","shell.execute_reply":"2022-06-29T07:03:07.752069Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Let's talk a little bit about math here. 2 things are interesting to mention here. \n- the predictions are not probabilities, they are logits (or the inverse of the sigmoid function drawed below)\n- if we want to convert those numbers to probabilities, we can use the softmax function that is desrbied below. \n    - the intuition behind softmax is to use exponentials to make all numbers positive and then weigh them","metadata":{}},{"cell_type":"code","source":"x = np.linspace(-10,10,1000)\ny = tf.nn.sigmoid(x, name ='sigmoid')\nplt.plot(x, y)\nplt.title(\"Sigmoid Function\")","metadata":{"execution":{"iopub.status.busy":"2022-06-29T07:03:09.907679Z","iopub.execute_input":"2022-06-29T07:03:09.908062Z","iopub.status.idle":"2022-06-29T07:03:10.108772Z","shell.execute_reply.started":"2022-06-29T07:03:09.908031Z","shell.execute_reply":"2022-06-29T07:03:10.107752Z"},"jupyter":{"source_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"![image.png](attachment:cb277b53-d9cf-4b14-9ce8-d8f4df66dbcf.png)","metadata":{},"attachments":{"cb277b53-d9cf-4b14-9ce8-d8f4df66dbcf.png":{"image/png":"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0irf7JaSwcZ6JiiPiuQZG6TYNq6HlY4ZOwZHBaz8kbPJt/rnJbCOjg7X3t4eOgRbk4upeKSjDUcXGt0ErGzn7S/DeeVGn7bOtWGVdwz4dft8pTwIX3bxRW6zzTYT+urcFanzYdJrs0JdAOBfXGomrcYW298LL/zX3XX33e60k092226ztdts883deeecK/XJVLPrcvKZSOSnqWvLz1FYnYDZLMuvrNKkc9X+rP5zAhDgqizrn/2vHkfBiR7YHs9W41C1fClj4MABmvca5T/owANwrAe0NfJPWUX7K8qfVXhu6n/K3ezn/jQrcVVxs5LPXYFj/3ycrLqL/WE2Ust9UsrfX/3XyrPhtPyoWPaFVve5etZAsf1Zevpp+bF45cf2F5Vklg1C24tK8P255SEIyMu/4cab3Le//W13913cVVaXyn8fcZYk+LOqf89dvFrll7TQ24eRr0cUKELLqTL5BOOFF17QLbzIIm6RRRd1Cy2woNAsusiibhHgFl5kYfkMEElnvDfD/RGG34gBY73113d/u+BC1SxyyMydc845btNNN3MVDI5s9K+++gqTCU1QmJfPrdC9997HrbzyKm7LLbd0N998C5jUuT322MO9+dab7owzznCnnXqadBbcMsPKi1v7x+u4n/18C/fHo/7k3sM2HCM7cZ5w7xH7uuuvvRad80/dj3+8rgx0vTNmqGA8zz33XLcp4hj/17PPVh34fLzx+uvuT3/6k9tgw41c87Dh6IBa3LQnp4maXvjvf92WW2/jujHY7rb7r8TgwA6T/xvdDjvuhPNXw3Dmb6x7c7ptBTLWn48jiAzird8dccQRbuedd5LyTZ32hNtqm230SIOQZO7iSy52Bx9yiMTzksyIffZx1117ndsc+V0LZW7BwK3lce7qq692//j7P9wzTz/jDtj/ANHBYYcc7iZjC/Zb31rRrbnmmu7sv55NznBe6/A85B5+9BHXigF79TXWdBuizNSNxb4Lnf7h939wa6+zjlsD8fvtt5979rnnhBPz9/jjj7urrr4KA36HOwCddR1m9Ycechi2aCe7buR7l112dVddebX7Oepo0003dX//+9/dBJz1/NnPfi7l+D14YzVL+PGBVXS33bbbIS9ruP1RlptoA3DXXHuN2xp6v/HGGyXf1CHj+fKVcyjUwQcjX49NhV6ucccce6x74olpklaOjPhS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"}}},{"cell_type":"code","source":"tf.nn.softmax(predictions).numpy()\n#note that these should sum up to 1 based on softmax definition ;) ","metadata":{"execution":{"iopub.status.busy":"2022-06-29T07:03:12.199988Z","iopub.execute_input":"2022-06-29T07:03:12.200383Z","iopub.status.idle":"2022-06-29T07:03:12.20936Z","shell.execute_reply.started":"2022-06-29T07:03:12.200351Z","shell.execute_reply":"2022-06-29T07:03:12.208162Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id=\"3\"></a>\n# **<center><span style=\"color:#FF7B5F;\">3. Define a loss function & optimizer, compile and fit our model. </span></center>**\n","metadata":{}},{"cell_type":"code","source":"loss_fn = tf.keras.losses.SparseCategoricalCrossentropy()\n\noptimizer = tf.keras.optimizers.Adam()","metadata":{"execution":{"iopub.status.busy":"2022-06-29T07:04:08.825054Z","iopub.execute_input":"2022-06-29T07:04:08.825527Z","iopub.status.idle":"2022-06-29T07:04:08.831961Z","shell.execute_reply.started":"2022-06-29T07:04:08.825488Z","shell.execute_reply":"2022-06-29T07:04:08.830765Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Note that we haven't trained our model thus far. So it should guess with a probability 1/10 \n\n➡ so the initial loss should be close to -log(1/10) ≈ 2.3.","metadata":{}},{"cell_type":"code","source":"np.mean([loss_fn(y_train[x:x+1], predictions).numpy() for x in range(100)])","metadata":{"execution":{"iopub.status.busy":"2022-06-29T07:04:12.41968Z","iopub.execute_input":"2022-06-29T07:04:12.420101Z","iopub.status.idle":"2022-06-29T07:04:12.556753Z","shell.execute_reply.started":"2022-06-29T07:04:12.420065Z","shell.execute_reply":"2022-06-29T07:04:12.555326Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Now let's compile our model with the defined loss function and train it.","metadata":{}},{"cell_type":"code","source":"model.compile(optimizer=optimizer,\n              loss=loss_fn,\n              metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2022-06-29T07:04:13.323792Z","iopub.execute_input":"2022-06-29T07:04:13.324214Z","iopub.status.idle":"2022-06-29T07:04:13.33607Z","shell.execute_reply.started":"2022-06-29T07:04:13.324182Z","shell.execute_reply":"2022-06-29T07:04:13.334632Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit(x_train, y_train, epochs=5)","metadata":{"execution":{"iopub.status.busy":"2022-06-29T07:04:15.822125Z","iopub.execute_input":"2022-06-29T07:04:15.822539Z","iopub.status.idle":"2022-06-29T07:08:17.40386Z","shell.execute_reply.started":"2022-06-29T07:04:15.822495Z","shell.execute_reply":"2022-06-29T07:08:17.402957Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id=\"4\"></a>\n# **<center><span style=\"color:#FF7B5F;\">4. Prediction and submission </span></center>**\n","metadata":{}},{"cell_type":"markdown","source":"Remember that our model outputs logits so we need to add a softmax layer to convert them to probabilities if this is what you are looking for. ","metadata":{}},{"cell_type":"code","source":"probability_model = tf.keras.Sequential([\n  model,\n  tf.keras.layers.Softmax()\n])","metadata":{"execution":{"iopub.status.busy":"2022-06-29T06:29:15.223693Z","iopub.execute_input":"2022-06-29T06:29:15.224018Z","iopub.status.idle":"2022-06-29T06:29:15.246823Z","shell.execute_reply.started":"2022-06-29T06:29:15.223988Z","shell.execute_reply":"2022-06-29T06:29:15.245842Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"probability_model(x_test[:5])","metadata":{"execution":{"iopub.status.busy":"2022-06-29T06:29:15.248353Z","iopub.execute_input":"2022-06-29T06:29:15.248678Z","iopub.status.idle":"2022-06-29T06:29:15.259781Z","shell.execute_reply.started":"2022-06-29T06:29:15.248629Z","shell.execute_reply":"2022-06-29T06:29:15.258554Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"If you don't care about probabilities, you can also just use the logits and take the highest one (using argmax function) to get the preiction. Note that softmax does not change the relative order of values but just outputs everything as probabilities.","metadata":{}},{"cell_type":"code","source":"predictions = model.predict(x_test)\ny_test = np.argmax(predictions,axis = 1)","metadata":{"execution":{"iopub.status.busy":"2022-06-29T06:29:15.263445Z","iopub.execute_input":"2022-06-29T06:29:15.264029Z","iopub.status.idle":"2022-06-29T06:29:16.547414Z","shell.execute_reply.started":"2022-06-29T06:29:15.263997Z","shell.execute_reply":"2022-06-29T06:29:16.54623Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"For the submission format we need to have a dataframe with 2 columns (ImageId and Label)","metadata":{}},{"cell_type":"code","source":"submission = pd.concat([pd.Series(range(1,28001),name = \"ImageId\"),pd.Series(y_test, name ='Label')],axis = 1)\nsubmission.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2022-06-29T06:34:02.071549Z","iopub.execute_input":"2022-06-29T06:34:02.072036Z","iopub.status.idle":"2022-06-29T06:34:02.127858Z","shell.execute_reply.started":"2022-06-29T06:34:02.071991Z","shell.execute_reply":"2022-06-29T06:34:02.126855Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"__I hope you found this notebook. If you liked it or learned something new, do not hesitate to upvote it :)__","metadata":{}}]}