{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":3004,"databundleVersionId":861823,"isSourceIdPinned":false,"sourceType":"competition"}],"dockerImageVersionId":31192,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\ndata = pd.read_csv(\"/kaggle/input/digit-recognizer/train.csv\")","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-12-07T16:37:19.930207Z","iopub.execute_input":"2025-12-07T16:37:19.930533Z","iopub.status.idle":"2025-12-07T16:37:22.011952Z","shell.execute_reply.started":"2025-12-07T16:37:19.930504Z","shell.execute_reply":"2025-12-07T16:37:22.010668Z"}},"outputs":[],"execution_count":40},{"cell_type":"code","source":"data = np.array(data)\nnp.random.shuffle(data)\ny= data[:,0]\nx= data[:,1:]\nX_train = x[:10000,:]\nX_test = x[10000:,:]\nY_train = y[:33600]\nY_test = y[33601:]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-07T16:37:22.01361Z","iopub.execute_input":"2025-12-07T16:37:22.013971Z","iopub.status.idle":"2025-12-07T16:37:22.720796Z","shell.execute_reply.started":"2025-12-07T16:37:22.013937Z","shell.execute_reply":"2025-12-07T16:37:22.719643Z"}},"outputs":[],"execution_count":41},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nidx = np.random.randint(0, X_train.shape[0])\nplt.imshow(X_train[idx].reshape(28,28), cmap='gray')\nplt.title(f\"Label: {Y_train[idx]}\")\nplt.axis(\"off\")\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-07T16:37:22.721809Z","iopub.execute_input":"2025-12-07T16:37:22.722136Z","iopub.status.idle":"2025-12-07T16:37:22.82191Z","shell.execute_reply.started":"2025-12-07T16:37:22.722106Z","shell.execute_reply":"2025-12-07T16:37:22.820745Z"}},"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 1 Axes>","image/png":"iVBORw0KGgoAAAANSUhEUgAAAYUAAAGbCAYAAAAr/4yjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAOEklEQVR4nO3ca4jV5d7H4d/ymEiImkYGaeauFOyAohFGU0gqFoydoAyxF2bWCynLCsoDBWVlWSolVFhoFJlJoChGGhWmncFQsoNBJ4+phaWZa7/Yz/Nj92g9c69mdEavC3qzWN9Z94D46T/qXalWq9UAgIhodbQPAEDzIQoAJFEAIIkCAEkUAEiiAEASBQCSKACQRAGAJAockzZv3hyVSiUeffTRRvuaq1evjkqlEqtXr260rwnNjSjQbMyfPz8qlUp88MEHR/soTaJXr15RqVQO+9+//vWvo308iIiINkf7AHC8mDVrVvzyyy9/eu2bb76Je++9Ny677LKjdCr4M1GAI6S+vv6Q1x544IGIiBg9evQRPg0cnh8f0aLs378/pkyZEgMGDIhOnTpFx44d46KLLopVq1b95ebxxx+Pnj17RocOHeLiiy+O9evXH/KejRs3xtVXXx1dunSJE044IQYOHBivv/76/3uevXv3xsaNG2P79u01fT8vvvhinH766XHhhRfWtIfGJgq0KHv27Ilnnnkm6urqYsaMGTFt2rTYtm1bDBs2LD755JND3v/CCy/Ek08+Gbfeemvcc889sX79+rj00ktjy5Yt+Z7PPvssLrjggtiwYUPcfffdMXPmzOjYsWPU19fHa6+99rfnWbduXfTt2zfmzJlT/L18/PHHsWHDhrj++uuLt9BU/PiIFqVz586xefPmaNeuXb42bty4OPvss2P27Nnx7LPP/un9X3zxRWzatClOPfXUiIgYPnx4DB48OGbMmBGPPfZYRERMnDgxTjvttHj//fejffv2ERFxyy23xJAhQ+Kuu+6KUaNGNcn3snDhwojwoyOaF08KtCitW7fOIBw8eDB27twZBw4ciIEDB8ZHH310yPvr6+szCBERgwYNisGDB8eyZcsiImLnzp3x5ptvxrXXXhs///xzbN++PbZv3x47duyIYcOGxaZNm+K77777y/PU1dVFtVqNadOmFX0fBw8ejJdeeinOP//86Nu3b9EWmpIo0OI8//zzcc4558QJJ5wQXbt2jW7dusXSpUtj9+7dh7z3cH/V88wzz4zNmzdHxH+eJKrVatx3333RrVu3P/03derUiIjYunVro38Pb731Vnz33XeeEmh2/PiIFmXBggUxduzYqK+vjzvvvDO6d+8erVu3jgcffDC+/PLL4q938ODBiIi44447YtiwYYd9T58+ff7RmQ9n4cKF0apVq7juuusa/WvDPyEKtCiLFi2K3r17x+LFi6NSqeTr//t/9f/Xpk2bDnnt888/j169ekVERO/evSMiom3btjF06NDGP/Bh7Nu3L1599dWoq6uLHj16HJHPhIby4yNalNatW0dERLVazdfWrl0ba9asOez7lyxZ8qc/E1i3bl2sXbs2RowYERER3bt3j7q6upg3b1788MMPh+y3bdv2t+ep5a+kLlu2LHbt2uVHRzRLnhRodp577rlYvnz5Ia9PnDgxLr/88li8eHGMGjUqRo4cGV9//XU8/fTT0a9fv0P+tXDEf370M2TIkJgwYULs27cvZs2aFV27do3Jkyfne+bOnRtDhgyJ/v37x7hx46J3796xZcuWWLNmTXz77bfx6aef/uVZ161bF5dccklMnTq1wX/YvHDhwmjfvn1cddVVDXo/HEmiQLPz1FNPHfb1sWPHxtixY+PHH3+MefPmxYoVK6Jfv36xYMGCeOWVVw57Ud2YMWOiVatWMWvWrNi6dWsMGjQo5syZE6ecckq+p1+/fvHBBx/E9OnTY/78+bFjx47o3r17nH/++TFlypRG/d727NkTS5cujZEjR0anTp0a9WtDY6hU//s5HIDjmj9TACCJAgBJFABIogBAEgUAkigAkBr87xT++0oBAFqehvwLBE8KACRRACCJAgBJFABIogBAEgUAkigAkEQBgCQKACRRACCJAgBJFABIogBAEgUAkigAkEQBgCQKACRRACCJAgBJFABIogBAEgUAkigAkEQBgCQKACRRACCJAgBJFABIogBAEgUAkigAkEQBgCQKACRRACCJAgBJFABIogBAEgUAkigAkEQBgCQKACRRACCJAgBJFABIogBAEgUAkigAkEQBgCQKACRRACCJAgBJFABIogBAEgUAkigAkEQBgCQKACRRACCJAgBJFABIogBAEgUAkigAkEQBgCQKACRRACCJAgBJFABIogBAEgUAkigAkEQBgCQKACRRACCJAgBJ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\n"},"metadata":{}}],"execution_count":42},{"cell_type":"code","source":"X_train.shape, X_test.shape, Y_train.shape, Y_test.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-07T16:37:22.824058Z","iopub.execute_input":"2025-12-07T16:37:22.824842Z","iopub.status.idle":"2025-12-07T16:37:22.831963Z","shell.execute_reply.started":"2025-12-07T16:37:22.824805Z","shell.execute_reply":"2025-12-07T16:37:22.830557Z"}},"outputs":[{"execution_count":43,"output_type":"execute_result","data":{"text/plain":"((10000, 784), (32000, 784), (33600,), (8399,))"},"metadata":{}}],"execution_count":43},{"cell_type":"code","source":"def relu(z):\n    return np.maximum(0, z)\n\ndef softmax(z):\n    exp_z = np.exp(z - np.max(z, axis=1, keepdims=True))\n    return exp_z / np.sum(exp_z, axis=1, keepdims=True)\n\nclass NeuralNetwork:\n    def __init__(self):\n        self.w1 = np.random.randn(784, 64) * 0.01\n        self.w2 = np.random.randn(64, 32) * 0.01\n        self.w3 = np.random.randn(32, 16) * 0.01\n        self.w4 = np.random.randn(16, 10) * 0.01\n        \n        self.b1 = np.zeros((1, 64))\n        self.b2 = np.zeros((1, 32))\n        self.b3 = np.zeros((1, 16))\n        self.b4 = np.zeros((1, 10))\n        \n    def forward(self, x):\n        self.x = x\n        self.z1 = relu(x @ self.w1 + self.b1)\n        self.z2 = relu(self.z1 @ self.w2 + self.b2)\n        self.z3 = relu(self.z2 @ self.w3 + self.b3)\n        self.logits = self.z3 @ self.w4 + self.b4\n        return self.logits\n\n    def loss_function(self, logits, y):\n        N = logits.shape[0]\n        self.y = y\n        self.probs = softmax(logits)\n        correct_class_probs = self.probs[np.arange(N), y]\n        log_probs = np.log(correct_class_probs + 1e-15)\n        self.loss = -np.mean(log_probs)\n        return self.loss\n    \n    def backward(self):\n        N = self.x.shape[0]\n        \n        dZ4 = self.probs.copy()\n        dZ4[np.arange(N), self.y] -= 1\n        dZ4 /= N\n        \n        self.dW4 = self.z3.T @ dZ4\n        self.db4 = np.sum(dZ4, axis=0)\n        \n        dA3 = dZ4 @ self.w4.T\n        dZ3 = dA3 * (self.z3 > 0)\n        \n        self.dW3 = self.z2.T @ dZ3\n        self.db3 = np.sum(dZ3, axis=0)\n        \n        dA2 = dZ3 @ self.w3.T\n        dZ2 = dA2 * (self.z2 > 0)\n        \n        self.dW2 = self.z1.T @ dZ2\n        self.db2 = np.sum(dZ2, axis=0)\n        \n        dA1 = dZ2 @ self.w2.T\n        dZ1 = dA1 * (self.z1 > 0)\n        \n        self.dW1 = self.x.T @ dZ1\n        self.db1 = np.sum(dZ1, axis=0)\n\n    def step(self):\n        self.w1 = self.w1-self.dW1*0.01\n        self.w2 = self.w2-self.dW2*0.01\n        self.w3 = self.w3-self.dW3*0.01\n        self.w4 = self.w4-self.dW4*0.01\n\n        self.b1 = self.b1-self.db1*0.01\n        self.b2 = self.b2-self.db2*0.01\n        self.b3 = self.b3-self.db3*0.01\n        self.b4 = self.b4-self.db4*0.01\n\n    ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-07T16:37:22.833261Z","iopub.execute_input":"2025-12-07T16:37:22.833659Z","iopub.status.idle":"2025-12-07T16:37:22.862174Z","shell.execute_reply.started":"2025-12-07T16:37:22.833627Z","shell.execute_reply":"2025-12-07T16:37:22.860887Z"}},"outputs":[],"execution_count":44},{"cell_type":"code","source":"model = NeuralNetwork()\nepochs = 2\nfor epoch in range(epochs):\n    for i in range(32,10000,32):\n        x = X_train[i-32:i, :]\n        y = Y_train[i-32:i]\n        logits = model.forward(x)\n        loss = model.loss_function(logits, y)\n        model.backward()\n        model.step()\n        \n    print(loss)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-07T16:37:22.863352Z","iopub.execute_input":"2025-12-07T16:37:22.863676Z","iopub.status.idle":"2025-12-07T16:37:23.384512Z","shell.execute_reply.started":"2025-12-07T16:37:22.863648Z","shell.execute_reply":"2025-12-07T16:37:23.383516Z"}},"outputs":[{"name":"stdout","text":"2.2929829072787644\n0.7258233375860648\n","output_type":"stream"}],"execution_count":45},{"cell_type":"code","source":"logits = model.forward(X_train[7])\ny_pred = np.argmax(logits)\ny_pred,Y_train[7]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-07T16:37:23.385386Z","iopub.execute_input":"2025-12-07T16:37:23.386124Z","iopub.status.idle":"2025-12-07T16:37:23.393735Z","shell.execute_reply.started":"2025-12-07T16:37:23.386094Z","shell.execute_reply":"2025-12-07T16:37:23.392861Z"}},"outputs":[{"execution_count":46,"output_type":"execute_result","data":{"text/plain":"(7, 7)"},"metadata":{}}],"execution_count":46},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nidx = 7\nplt.imshow(X_train[idx].reshape(28,28), cmap='gray')\nplt.title(f\"Label: {Y_train[idx]}\")\nplt.axis(\"off\")\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-07T16:37:23.394848Z","iopub.execute_input":"2025-12-07T16:37:23.395179Z","iopub.status.idle":"2025-12-07T16:37:23.510756Z","shell.execute_reply.started":"2025-12-07T16:37:23.395152Z","shell.execute_reply":"2025-12-07T16:37:23.509846Z"}},"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 1 Axes>","image/png":"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iQIASRQASKIAQOrQ2geAg1mlUine9OnTp6bPdeeddxZvRo0aVbzp1KlT8aaWv4ePP/64eBMRMXjw4OLNL7/8UtPn+idypwBAEgUAkigAkEQBgCQKACRRACCJAgBJFABIogBAEgUAkigAkEQBgOSBePA/+vbtW7yZPHly8ebyyy8v3tSqlgfBffPNN8WbE044oXjTrVu34g0tz50CAEkUAEiiAEASBQCSKACQRAGAJAoAJFEAIIkCAEkUAEiiAEASBQCSKACQPCWVNq9du/J/u0yYMKF4M3HixOJN586dizfz588v3tS6W7x4cfFm3bp1xZta3HLLLTXtannyK03nTgGAJAoAJFEAIIkCAEkUAEiiAEASBQCSKACQRAGAJAoAJFEAIIkCAMkD8Thg+vfvX9PuwQcfLN5cccUVxZstW7YUb66++urizbvvvlu8qdWMGTOKN0cffXTxprGxsXjzwQcfFG9oee4UAEiiAEASBQCSKACQRAGAJAoAJFEAIIkCAEkUAEiiAEASBQCSKACQKtVqtdqkCyuVlj4LreScc84p3owfP754M3z48OJNRESXLl2KNxs2bCje1NfXF29WrlxZvKlV3759ize1PHSuffv2xZs+ffoUb9auXVu84e9pyrd7dwoAJFEAIIkCAEkUAEiiAEASBQCSKACQRAGAJAoAJFEAIIkCAEkUAEgdWvsANK9Ro0YVb2bOnFm8OeKII4o3v//+e/EmIuL5558v3tTywL5du3YVb2px2GGH1bSbNWtW8aZjx47Fm/vvv7944+F2hw53CgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQKpUq9Vqky6sVFr6LPxBnz59atotWbKkeHOgnnhay9M3IyIef/zxmnZt1fTp02va3XrrrcWb9evXF28GDBhQvNm5c2fxhgOvKd/u3SkAkEQBgCQKACRRACCJAgBJFABIogBAEgUAkigAkEQBgCQKACRRACB1aO0DsH9btmypabdmzZrizapVq4o3M2fOLN6sXLmyeNPWjR49unhz00031fS59uzZU7wZOXJk8cbD7f7Z3CkAkEQBgCQKACRRACCJAgBJFABIogBAEgUAkigAkEQBgCQKACRRACBVqtVqtUkXViotfRZoVXV1dcWb1atXF29OOeWU4k1ExAMPPFC8mTp1ak2fi0NTU77du1MAIIkCAEkUAEiiAEASBQCSKACQRAGAJAoAJFEAIIkCAEkUAEiiAEDq0NoHgLZiwoQJxZtaHm63e/fu4k1ExCuvvFLTDkq4UwAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQPJAPA5JdXV1xZsbbrihBU6yr0cffbSm3caNG5v5JLAvdwoAJFEAIIkCAEkUAEiiAEASBQCSKACQRAGAJAoAJFEAIIkCAEkUAEiiAEDylFQOSfPnzy/enHbaacWb3bt3F29ee+214g0cKO4UAEiiAEASBQCSKACQRAGAJAoAJFEAIIkCAEkUAEiiAEASBQCSKACQPBCPNm/EiBHFm6FDh7bASfb1wgsvFG82bNjQAieB5uFOAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIAyQPxaPOuueaa4k1dXV3x5qeffireNDQ0FG+gLXOnAEASBQCSKACQRAGAJAoAJFEAIIkCAEkUAEiiAEASBQCSKACQRAGA5IF4HDCnn356TbuhQ4c280n2b9asWcWbxsbG5j8ItCJ3CgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASJVqtVpt0oWVSkufhUPcnDlzatrdcMMNxZvNmzcXb84888zizfbt24s30Fqa8u3enQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJA6tPYBODjdfPPNxZtrrrmmBU6yf3fddVfxxhNPwZ0CAH8gCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIAqVKtVqtNurBSaemz0EoOP/zw4s3atWuLN8ccc0zxJiJi1apVxZuLL764eOOBeBzqmvLt3p0CAEkUAEiiAEASBQCSKACQRAGAJAoAJFEAIIkCAEkUAEiiAEASBQBSh9Y+AK3v7rvvLt7U+nC7WkyZMqV44+F2UBt3CgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASB6IR2zevPmAfJ6GhoaadgsWLGjegwB/yZ0CAEkUAEiiAEASBQCSKACQRAGAJAoAJFEAIIkCAEkUAEiiAEASBQCSKACQKtVqtdqkCyuVlj4LAC2oKd/u3SkAkEQBgCQKACRRACCJAgBJFABIogBAEgUAkigAkEQBgCQKACRRACCJAgBJFABIogBAEgUAkigAkEQBgCQKACRRACCJAgBJFABIogBAEgUAkigAkDo09cJqtdqS5wCgDXCnAEASBQCSKACQRAGAJAoAJFEAIIkCAEkUAEiiAED6NyoXiPhoioyMAAAAAElFTkSuQmCC\n"},"metadata":{}}],"execution_count":47}]}