{"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"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport torch\nimport torch.nn as nn\nfrom torch.autograd import Variable\nfrom torch.utils.data import DataLoader, Dataset\nimport pandas as pd\nfrom sklearn.model_selection import train_test_split","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-08-31T09:14:54.571365Z","iopub.execute_input":"2023-08-31T09:14:54.571792Z","iopub.status.idle":"2023-08-31T09:14:54.578583Z","shell.execute_reply.started":"2023-08-31T09:14:54.571754Z","shell.execute_reply":"2023-08-31T09:14:54.577341Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = 'cuda' if torch.cuda.is_available() else 'cpu'\n\ntrain = pd.read_csv(r\"../input/digit-recognizer/train.csv\", dtype = np.float32)\n\ntargets_numpy = train.label.values\nfeatures_numpy = train.loc[:,train.columns != \"label\"].values/255\n\nfeatures_train, features_val, targets_train, targets_val = train_test_split(features_numpy,\n                                                                             targets_numpy,\n                                                                             test_size = 0.2,\n                                                                             random_state = 42) \n\nfeaturesTrain = torch.from_numpy(features_train)\ntargetsTrain = torch.from_numpy(targets_train).type(torch.LongTensor)\n\nfeaturesVal = torch.from_numpy(features_val)\ntargetsVal = torch.from_numpy(targets_val).type(torch.LongTensor)\n\nbatch_size = 100\nn_iters = 10000\nnum_epochs = n_iters / (len(features_train) / batch_size)\nnum_epochs = int(num_epochs)\n\ntrain = torch.utils.data.TensorDataset(featuresTrain,targetsTrain)\nval = torch.utils.data.TensorDataset(featuresVal,targetsVal)\n\ntrain_loader = DataLoader(train, batch_size = batch_size, shuffle = False)\nval_loader = DataLoader(val, batch_size = batch_size, shuffle = False)","metadata":{"execution":{"iopub.status.busy":"2023-08-31T09:15:18.241280Z","iopub.execute_input":"2023-08-31T09:15:18.241674Z","iopub.status.idle":"2023-08-31T09:15:23.635770Z","shell.execute_reply.started":"2023-08-31T09:15:18.241644Z","shell.execute_reply":"2023-08-31T09:15:23.634683Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test = pd.read_csv(r\"../input/digit-recognizer/test.csv\",dtype = np.float32)\n\nfeatures_numpy2 = test.loc[:].values/255\n\nfeaturesTest = torch.from_numpy(features_numpy2)\n\ntest = torch.utils.data.TensorDataset(featuresTest)\n\ntest_loader = DataLoader(test, batch_size = batch_size, shuffle = False)","metadata":{"execution":{"iopub.status.busy":"2023-08-31T09:15:48.819414Z","iopub.execute_input":"2023-08-31T09:15:48.819861Z","iopub.status.idle":"2023-08-31T09:15:51.298816Z","shell.execute_reply.started":"2023-08-31T09:15:48.819821Z","shell.execute_reply":"2023-08-31T09:15:51.297339Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Model(nn.Module):\n    \n    def __init__(self, input_dim, hidden_dim, output_dim):\n        super(Model, self).__init__()\n        self.fc1 = nn.Linear(input_dim, hidden_dim) \n        self.fc2 = nn.Linear(hidden_dim, hidden_dim)\n        self.fc3 = nn.Linear(hidden_dim, hidden_dim)\n        self.fc4 = nn.Linear(hidden_dim, output_dim)  \n        self.activation = nn.Tanh()\n    \n    def forward(self, x):\n        out = self.fc1(x)\n        out = self.activation(out)\n        out = self.fc2(out)\n        out = self.activation(out)\n        out = self.fc3(out)\n        out = self.activation(out)\n        out = self.fc4(out)\n        \n        return out\n\ninput_dim = 28*28\nhidden_dim = 100\noutput_dim = 10\n\nmodel = Model(input_dim, hidden_dim, output_dim)\nmodel.to(device)\nerror = nn.CrossEntropyLoss()\n\nlearning_rate = 0.02\noptimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)","metadata":{"execution":{"iopub.status.busy":"2023-08-31T09:16:04.178891Z","iopub.execute_input":"2023-08-31T09:16:04.179292Z","iopub.status.idle":"2023-08-31T09:16:04.213312Z","shell.execute_reply.started":"2023-08-31T09:16:04.179261Z","shell.execute_reply":"2023-08-31T09:16:04.212377Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tqdm import tqdm","metadata":{"execution":{"iopub.status.busy":"2023-08-31T09:16:08.028973Z","iopub.execute_input":"2023-08-31T09:16:08.029420Z","iopub.status.idle":"2023-08-31T09:16:08.035737Z","shell.execute_reply.started":"2023-08-31T09:16:08.029379Z","shell.execute_reply":"2023-08-31T09:16:08.034234Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_losses=[]\ndef train(model,epoch):\n    model.train()\n    running_loss=0\n    for data in tqdm(train_loader):\n        inputs, targets=data[0].to(device),data[1].to(device)\n        optimizer.zero_grad()\n        outputs=model(inputs)\n        loss=error(outputs,targets)\n        loss.backward()\n        optimizer.step()\n\n        running_loss += loss.item()\n  \n    train_loss=running_loss/len(train_loader)\n    train_losses.append(train_loss)\n    if (epoch % 10 == 0):\n        print('Ошибка обучения в эпохе: %.4f'%(train_loss))","metadata":{"execution":{"iopub.status.busy":"2023-08-31T09:16:10.639736Z","iopub.execute_input":"2023-08-31T09:16:10.640141Z","iopub.status.idle":"2023-08-31T09:16:10.650018Z","shell.execute_reply.started":"2023-08-31T09:16:10.640109Z","shell.execute_reply":"2023-08-31T09:16:10.648415Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"val_losses=[]\ndef val(model,epoch):\n    model.eval()\n    running_loss=0\n    with torch.no_grad():\n        for data in tqdm(val_loader):\n            inputs, targets=data[0].to(device),data[1].to(device)\n            outputs=model(inputs)\n            loss=error(outputs,targets)\n            running_loss += loss.item()\n        val_loss=running_loss/len(test_loader)\n        val_losses.append(val_loss)\n        if (epoch % 10 == 0):\n            print('Ошибка валидации в эпохе: %.4f:'%(val_loss))","metadata":{"execution":{"iopub.status.busy":"2023-08-31T09:16:12.651228Z","iopub.execute_input":"2023-08-31T09:16:12.651636Z","iopub.status.idle":"2023-08-31T09:16:12.660488Z","shell.execute_reply.started":"2023-08-31T09:16:12.651603Z","shell.execute_reply":"2023-08-31T09:16:12.659571Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for epoch in range(1,num_epochs+1):\n    train(model,epoch)\n    val(model,epoch)","metadata":{"execution":{"iopub.status.busy":"2023-08-31T09:16:14.719262Z","iopub.execute_input":"2023-08-31T09:16:14.719647Z","iopub.status.idle":"2023-08-31T09:16:50.689520Z","shell.execute_reply.started":"2023-08-31T09:16:14.719616Z","shell.execute_reply":"2023-08-31T09:16:50.688020Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.rcParams[\"figure.figsize\"] = (20,10)\nplt.plot(train_losses,'-o')\nplt.plot(val_losses,'-o')\nplt.xlabel('эпоха')\nplt.ylabel('ошибка')\nplt.legend(['Обучение','Валидация'])\nplt.title('Ошибка обучения vs Ошибка валидации')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-08-31T09:17:20.188639Z","iopub.execute_input":"2023-08-31T09:17:20.189083Z","iopub.status.idle":"2023-08-31T09:17:20.690929Z","shell.execute_reply.started":"2023-08-31T09:17:20.189048Z","shell.execute_reply":"2023-08-31T09:17:20.689680Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"prediction = []\nfor images in test_loader:\n    test = Variable(images[0].view(-1, 28*28))\n    outputs = model(test)\n    predicted = torch.max(outputs.data, 1)[1]\n    prediction.append(predicted)","metadata":{"execution":{"iopub.status.busy":"2023-08-31T09:17:27.629827Z","iopub.execute_input":"2023-08-31T09:17:27.630237Z","iopub.status.idle":"2023-08-31T09:17:28.094947Z","shell.execute_reply.started":"2023-08-31T09:17:27.630204Z","shell.execute_reply":"2023-08-31T09:17:28.093802Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"prediction_numpy = np.array([], dtype=np.int32)\nfor batch in prediction:\n    prediction_numpy = np.append(prediction_numpy, batch.numpy())\nprediction_df = pd.DataFrame(data={'Label': prediction_numpy}, index=np.arange(1, 28001))\nprediction_df.index.rename('ImageId', inplace= True )","metadata":{"execution":{"iopub.status.busy":"2023-08-31T09:24:50.759114Z","iopub.execute_input":"2023-08-31T09:24:50.759525Z","iopub.status.idle":"2023-08-31T09:24:50.776034Z","shell.execute_reply.started":"2023-08-31T09:24:50.759492Z","shell.execute_reply":"2023-08-31T09:24:50.774738Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"prediction_df.to_csv(\"/kaggle/working/submission.csv\")","metadata":{"execution":{"iopub.status.busy":"2023-08-31T09:25:02.328954Z","iopub.execute_input":"2023-08-31T09:25:02.329383Z","iopub.status.idle":"2023-08-31T09:25:02.411565Z","shell.execute_reply.started":"2023-08-31T09:25:02.329345Z","shell.execute_reply":"2023-08-31T09:25:02.410258Z"},"trusted":true},"execution_count":null,"outputs":[]}],"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"}}