{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","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,"sourceType":"competition"}],"dockerImageVersionId":30918,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"Table of Content:\n1. [Import Required Libraries](#1)\n2. [Load and Prepare Dataset](#2)\n3. [Build LSTM Model](#3)\n4. [Create Model Instance](#4)\n5. [Define Loss Function](#5)\n6. [Set Up Optimizer](#6)\n7. [Train the Model](#7)\n8. [Make Predictions](#7)\n9. [Visualization Loss & Accuracy](#8) ","metadata":{}},{"cell_type":"markdown","source":"<a id=\"1\"></a> \n# Import Required Libraries","metadata":{}},{"cell_type":"code","source":"import 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","trusted":true,"execution":{"iopub.status.busy":"2025-03-04T21:09:55.321703Z","iopub.execute_input":"2025-03-04T21:09:55.322106Z","iopub.status.idle":"2025-03-04T21:09:55.332061Z","shell.execute_reply.started":"2025-03-04T21:09:55.322078Z","shell.execute_reply":"2025-03-04T21:09:55.330612Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\n\nfrom sklearn.model_selection import train_test_split\n\nimport torch\nimport torch.nn as nn\nfrom torch.utils.data import DataLoader,TensorDataset","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T21:09:55.334461Z","iopub.execute_input":"2025-03-04T21:09:55.334861Z","iopub.status.idle":"2025-03-04T21:09:55.352351Z","shell.execute_reply.started":"2025-03-04T21:09:55.334830Z","shell.execute_reply":"2025-03-04T21:09:55.350995Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<a id=\"2> \"></a> \n# Load and Prepare Dataset\n## Load Dataset","metadata":{}},{"cell_type":"code","source":"train = pd.read_csv(\"/kaggle/input/digit-recognizer/train.csv\", dtype=np.float32)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T21:09:55.353918Z","iopub.execute_input":"2025-03-04T21:09:55.354382Z","iopub.status.idle":"2025-03-04T21:09:58.214773Z","shell.execute_reply.started":"2025-03-04T21:09:55.354345Z","shell.execute_reply":"2025-03-04T21:09:58.212860Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Prepare Dataset","metadata":{}},{"cell_type":"code","source":"target_np = train.label.values\nfeatures_np = train.loc[:,train.columns != \"label\"]\nfeatures_np = features_np.values / 255","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T21:09:58.216895Z","iopub.execute_input":"2025-03-04T21:09:58.217393Z","iopub.status.idle":"2025-03-04T21:09:58.325696Z","shell.execute_reply.started":"2025-03-04T21:09:58.217342Z","shell.execute_reply":"2025-03-04T21:09:58.324442Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"features_np.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T21:09:58.328124Z","iopub.execute_input":"2025-03-04T21:09:58.328516Z","iopub.status.idle":"2025-03-04T21:09:58.336536Z","shell.execute_reply.started":"2025-03-04T21:09:58.328486Z","shell.execute_reply":"2025-03-04T21:09:58.335472Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Train-Test-Split","metadata":{}},{"cell_type":"code","source":"features_train, features_test, targets_train, targets_test = train_test_split(features_np,target_np,test_size=0.2,random_state=42)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T21:09:58.337954Z","iopub.execute_input":"2025-03-04T21:09:58.338345Z","iopub.status.idle":"2025-03-04T21:09:58.875081Z","shell.execute_reply.started":"2025-03-04T21:09:58.338312Z","shell.execute_reply":"2025-03-04T21:09:58.873234Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"features_train shape:\",features_train.shape)\nprint(\"targets_train shape:\",targets_train.shape)\nprint(\"features_test shape:\",features_test.shape)\nprint(\"targets_test shape:\",targets_test.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T21:09:58.876005Z","iopub.execute_input":"2025-03-04T21:09:58.876431Z","iopub.status.idle":"2025-03-04T21:09:58.885768Z","shell.execute_reply.started":"2025-03-04T21:09:58.876390Z","shell.execute_reply":"2025-03-04T21:09:58.883500Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Create Tensors","metadata":{}},{"cell_type":"code","source":"featuresTrain = torch.from_numpy(features_train)\ntargetsTrain =torch.from_numpy(targets_train).type(torch.LongTensor)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T21:09:58.889746Z","iopub.execute_input":"2025-03-04T21:09:58.890419Z","iopub.status.idle":"2025-03-04T21:09:58.921678Z","shell.execute_reply.started":"2025-03-04T21:09:58.890377Z","shell.execute_reply":"2025-03-04T21:09:58.919400Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"featuresTest = torch.from_numpy(features_test)\ntargetsTest =torch.from_numpy(targets_test).type(torch.LongTensor)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T21:09:58.926179Z","iopub.execute_input":"2025-03-04T21:09:58.926644Z","iopub.status.idle":"2025-03-04T21:09:58.958486Z","shell.execute_reply.started":"2025-03-04T21:09:58.926606Z","shell.execute_reply":"2025-03-04T21:09:58.956286Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"featuresTrain shape:\",featuresTrain.shape)\nprint(\"targets_train shape:\",targets_train.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T21:09:58.960013Z","iopub.execute_input":"2025-03-04T21:09:58.960622Z","iopub.status.idle":"2025-03-04T21:09:58.982372Z","shell.execute_reply.started":"2025-03-04T21:09:58.960569Z","shell.execute_reply":"2025-03-04T21:09:58.979782Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Tensor Dataset","metadata":{}},{"cell_type":"code","source":"train = TensorDataset(featuresTrain,targetsTrain)\ntest = TensorDataset(featuresTest,targetsTest)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T21:09:58.983529Z","iopub.execute_input":"2025-03-04T21:09:58.983923Z","iopub.status.idle":"2025-03-04T21:09:59.026502Z","shell.execute_reply.started":"2025-03-04T21:09:58.983882Z","shell.execute_reply":"2025-03-04T21:09:59.025128Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Data Loader","metadata":{}},{"cell_type":"code","source":"batch_size=100\nn_iteraters=6000\nnum_epochs= n_iteraters / (len(featuresTrain) / batch_size)\nnum_epochs = int(num_epochs)\nprint(num_epochs)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T21:09:59.027877Z","iopub.execute_input":"2025-03-04T21:09:59.028428Z","iopub.status.idle":"2025-03-04T21:09:59.061352Z","shell.execute_reply.started":"2025-03-04T21:09:59.028296Z","shell.execute_reply":"2025-03-04T21:09:59.059423Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_loader = DataLoader(train, batch_size=batch_size,shuffle=False)\ntest_loader = DataLoader(test,batch_size=batch_size,shuffle=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T21:09:59.062251Z","iopub.execute_input":"2025-03-04T21:09:59.062688Z","iopub.status.idle":"2025-03-04T21:09:59.095306Z","shell.execute_reply.started":"2025-03-04T21:09:59.062659Z","shell.execute_reply":"2025-03-04T21:09:59.093645Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(len(train_loader.dataset))\nprint(len(test_loader.dataset))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T21:09:59.096891Z","iopub.execute_input":"2025-03-04T21:09:59.097317Z","iopub.status.idle":"2025-03-04T21:09:59.132327Z","shell.execute_reply.started":"2025-03-04T21:09:59.097253Z","shell.execute_reply":"2025-03-04T21:09:59.130648Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<a id=\"3> \"></a> \n# Build LSTM Model","metadata":{}},{"cell_type":"code","source":"class LSTMModel(nn.Module):\n    def __init__(self, input_dimension,hidden_dimension,layer_dimension,output_dimension):\n        super(LSTMModel,self).__init__()\n        \n        # Hidden dimension\n        self.hidden_dimension = hidden_dimension\n        # Number of hidden layers\n        self.layer_dimension = layer_dimension\n        \n        # LSTM\n        self.lstm = nn.LSTM(input_dimension,hidden_dimension,layer_dimension,batch_first=True)\n        \n        # fully connected layer\n        self.fc = nn.Linear(hidden_dimension,output_dimension)\n\n    def forward(self,x):\n        # Hidden state with zeros\n        h0 = torch.zeros(self.layer_dimension, x.size(0),self.hidden_dimension).requires_grad_()\n        # cell state\n        c0 = torch.zeros(self.layer_dimension, x.size(0),self.hidden_dimension).requires_grad_()\n\n        output, (hn,cn) = self.lstm(x,(h0.detach(),c0.detach()))\n        output = self.fc(output[:,-1,:])\n        return output","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T21:09:59.134582Z","iopub.execute_input":"2025-03-04T21:09:59.135220Z","iopub.status.idle":"2025-03-04T21:09:59.164483Z","shell.execute_reply.started":"2025-03-04T21:09:59.135162Z","shell.execute_reply":"2025-03-04T21:09:59.162656Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<a id=\"4> \"></a> \n# Create Model Instance","metadata":{}},{"cell_type":"code","source":"input_dim = 28\nhidden_dim = 100\nlayer_dim = 1\noutput_dim = 10\nmodel = LSTMModel(input_dim, hidden_dim, layer_dim, output_dim)\nprint(\"Model creation successful..\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T21:09:59.165401Z","iopub.execute_input":"2025-03-04T21:09:59.165912Z","iopub.status.idle":"2025-03-04T21:09:59.213255Z","shell.execute_reply.started":"2025-03-04T21:09:59.165864Z","shell.execute_reply":"2025-03-04T21:09:59.211064Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<a id=\"5> \"></a> \n# Define Loss Function","metadata":{}},{"cell_type":"code","source":"error = nn.CrossEntropyLoss()\n\nprint(\"Loss function definition successful..\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T21:09:59.214201Z","iopub.execute_input":"2025-03-04T21:09:59.214875Z","iopub.status.idle":"2025-03-04T21:09:59.246181Z","shell.execute_reply.started":"2025-03-04T21:09:59.214820Z","shell.execute_reply":"2025-03-04T21:09:59.244737Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<a id=\"6> \"></a> \n# Set Up Optimizer","metadata":{}},{"cell_type":"code","source":"learning_rate = 0.1\noptimizer = torch.optim.SGD(model.parameters(),lr=learning_rate)\n\nprint(\"Optimizer setup successful..\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T21:09:59.248109Z","iopub.execute_input":"2025-03-04T21:09:59.248589Z","iopub.status.idle":"2025-03-04T21:09:59.282373Z","shell.execute_reply.started":"2025-03-04T21:09:59.248540Z","shell.execute_reply":"2025-03-04T21:09:59.280748Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<a id=\"7> \"></a> \n# Train the Model & Make Predictions","metadata":{}},{"cell_type":"code","source":"seq_dim = 28  \nloss_list = []\niteration_list = []\naccuracy_list = []\ncount = 0","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T21:09:59.284577Z","iopub.execute_input":"2025-03-04T21:09:59.284968Z","iopub.status.idle":"2025-03-04T21:09:59.317194Z","shell.execute_reply.started":"2025-03-04T21:09:59.284936Z","shell.execute_reply":"2025-03-04T21:09:59.315508Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Number of steps to unroll\nseq_dim = 28  \nloss_list = []\niteration_list = []\naccuracy_list = []\ncount = 0\nfor epoch in range(num_epochs):\n    for i, (images, labels) in enumerate(train_loader):\n        images = images.view(-1, seq_dim, input_dim).requires_grad_()\n\n        optimizer.zero_grad()\n\n        outputs = model(images)\n\n        loss = error(outputs, labels)\n\n        loss.backward()\n\n        optimizer.step()\n\n        count += 1\n\n        if count % 500 == 0: \n            correct = 0\n            total = 0\n            for images, labels in test_loader:\n                \n                images = images.view(-1, seq_dim, input_dim)\n\n                outputs = model(images)\n\n                _, predicted = torch.max(outputs.data, 1)\n\n                total += labels.size(0)\n\n                correct += (predicted == labels).sum()\n\n            accuracy = 100 * correct / total\n            \n            loss_list.append(loss.data.item())\n            iteration_list.append(count)\n            accuracy_list.append(accuracy)\n            \n            # Print Loss\n            print('Iteration: {}  Loss: {}  Accuracy: {} %'.format(count, loss.item(), accuracy))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T21:09:59.321181Z","iopub.execute_input":"2025-03-04T21:09:59.321771Z","iopub.status.idle":"2025-03-04T21:12:34.115056Z","shell.execute_reply.started":"2025-03-04T21:09:59.321729Z","shell.execute_reply":"2025-03-04T21:12:34.113874Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<a id=\"8> \"></a> \n# Visualization Loss & Accuracy","metadata":{}},{"cell_type":"code","source":"# visualization loss \nplt.plot(iteration_list,loss_list)\nplt.xlabel(\"Number of iteration\")\nplt.ylabel(\"Loss\")\nplt.title(\"LSTM: Loss vs Number of iteration\")\nplt.show()\n\n# visualization accuracy \nplt.plot(iteration_list,accuracy_list,color = \"red\")\nplt.xlabel(\"Number of iteration\")\nplt.ylabel(\"Accuracy\")\nplt.title(\"LSTM: Accuracy vs Number of iteration\")\nplt.savefig('graph.png')\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T21:14:23.101697Z","iopub.execute_input":"2025-03-04T21:14:23.102160Z","iopub.status.idle":"2025-03-04T21:14:23.909476Z","shell.execute_reply.started":"2025-03-04T21:14:23.102127Z","shell.execute_reply":"2025-03-04T21:14:23.908191Z"}},"outputs":[],"execution_count":null}]}