{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import torch\nimport torch.optim as optim\nfrom torch.utils.data import *\nimport torch.nn as nn\nimport numpy as np\nimport matplotlib.pyplot as plt","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"def load_mnist_train():\n    path = '/kaggle/input/digit-recognizer/train.csv'\n    raw_data = np.loadtxt(path, delimiter = ',', skiprows = 1)\n    raw_X = raw_data [:, 1:]\n    raw_Y = raw_data[:, 0]\n    return (raw_X, raw_Y)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"raw_X, raw_Y = load_mnist_train()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def split_data(raw_X, raw_Y):\n    train_X_lst = []\n    train_Y_lst = []\n    test_X_lst = []\n    test_Y_lst = []\n    for i in range(raw_X.shape[0]):\n        if(i % 2 == 0):\n            train_X_lst.append(raw_X[i])\n            train_Y_lst.append(raw_Y[i])\n        else:\n            test_X_lst.append(raw_X[i])\n            test_Y_lst.append(raw_Y[i])\n    train_X = np.array(train_X_lst)\n    train_Y = np.array(train_Y_lst)\n    test_X = np.array(test_X_lst)\n    test_Y = np.array(test_Y_lst)\n    return (train_X, train_Y, test_X, test_Y)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_X, train_Y, test_X, test_Y = split_data(raw_X, raw_Y)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class Data(Dataset):\n    def __init__(self, x, y):\n        self.x = torch.from_numpy(x).cuda()\n        self.y = torch.from_numpy(y).cuda()\n        self.len = self.x.shape[0]\n    def __getitem__(self, i):\n        return (self.x[i], self.y[i])\n    def __len__(self):\n        return self.len","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class DNN(nn.Module):\n    def __init__(self):\n        super(DNN, self).__init__()\n        model = nn.Sequential(nn.Linear(784, 512), nn.ReLU())\n        model = nn.Sequential(model, nn.Linear(512, 256), nn.ReLU())\n        model = nn.Sequential(model, nn.Linear(256, 64), nn.ReLU())\n        model = nn.Sequential(model, nn.Linear(64, 10), nn.Softmax())\n        self.model = model\n    def forward(self, x):\n        return self.model(x)\n    def parameters(self):\n        return self.model.parameters()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"learning_rate = 0.00001\nnum_epochs = 1000\nbatch_size = 2048\n\nmodel = DNN()\nmodel.cuda()\ntrain_dset = Data(train_X, train_Y)\ntrainloader = DataLoader(train_dset, batch_size = batch_size)\ncostfn = nn.CrossEntropyLoss()\noptimizer = optim.Adam(model.parameters(), lr = learning_rate)\n\ncosts = []\n\nfor epoch in range(num_epochs):\n    for x, y in trainloader:\n        optimizer.zero_grad()\n        yhat = model(x.float())\n        cost = costfn(yhat, y.long())\n        costs.append(cost.item())\n        cost.backward()\n        optimizer.step()\n    print(\"Cost\", epoch,\" = \", cost.item())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.plot(costs)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"yhat_test = model(torch.from_numpy(test_X).cuda().float())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"costfn(yhat_test, torch.from_numpy(test_Y).cuda().long())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"Yhat_test_numpy = yhat_test.detach().cpu().numpy()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"Yhat_test = np.argmax(Yhat_test_numpy, axis = 1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"Yhat_test","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"accuracy = 100*(1 - np.sum((Yhat_test != test_Y).astype(int))/test_Y.shape[0])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"accuracy","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}