{"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":"# Initialize the environment\nimport torch\nimport torch.nn as nn\nimport math\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport pandas as pd\nfrom PIL import Image\n\ntorch.cuda.is_available()","metadata":{"execution":{"iopub.status.busy":"2023-05-25T10:28:23.250379Z","iopub.execute_input":"2023-05-25T10:28:23.250834Z","iopub.status.idle":"2023-05-25T10:28:27.745330Z","shell.execute_reply.started":"2023-05-25T10:28:23.250795Z","shell.execute_reply":"2023-05-25T10:28:27.743921Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# define the model\nclass CNN(nn.Module):\n\tdef __init__(self):\n\t\tsuper(CNN, self).__init__()\n\t\tself.conv1 = nn.Conv2d(3, 32, 3)\n\t\tself.conv2 = nn.Conv2d(32, 64, 3)\n\t\tself.conv3 = nn.Conv2d(64, 128, 3)\n\t\tself.conv4 = nn.Conv2d(128, 256, 3)\n\t\tself.fc1 = nn.Linear(6400, 1024)\n\t\tself.fc2 = nn.Linear(1024, 512)\n\t\tself.fc3 = nn.Linear(512, 128)\n\t\tself.fc4 = nn.Linear(128, 10)\n\tdef forward(self, x):\n\t\t# 3 x 32 x 32\n\t\tx = torch.relu(self.conv1(x))\t\t\t# 32 x 30 x 30\n\t\tx = nn.BatchNorm2d(32).to(\"cuda\")(x)\t# 32 x 30 x 30\n\t\tx = torch.relu(self.conv2(x))\t\t\t# 64 x 28 x 28\n\t\tx = torch.max_pool2d(x, 2)\t\t\t\t# 64 x 14 x 14\n\t\tx = torch.relu(self.conv3(x))\t\t\t# 128 x 12 x 12\n\t\tx = nn.BatchNorm2d(128).to(\"cuda\")(x)\t# 128 x 12 x 12\n\t\tx = torch.relu(self.conv4(x))\t\t\t# 256 x 10 x 10\n\t\tx = torch.max_pool2d(x, 2)\t\t\t\t# 256 x 5 x 5\n\t\tx = x.view(-1, 6400)\n\t\tx = torch.relu(self.fc1(x))\n\t\tx = torch.tanh(self.fc2(x))\n\t\tx = torch.relu(self.fc3(x))\n\t\tx = self.fc4(x)\n\t\treturn x\nmodel = CNN().to(\"cuda\")\noptimizer = torch.optim.Adam(model.parameters(), lr=0.0005)\ncriterion = nn.CrossEntropyLoss().to(\"cuda\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# get trainset\nkey = [\"frog\",\"truck\",\"deer\",\"automobile\",\"bird\",\"horse\",\"ship\",\"cat\",\"dog\",\"airplane\"]\nkey = {key[i] : i for i in range(len(key))}\nlabels = pd.read_csv(\"trainLabels.csv\")\nlabels = labels[\"label\"].map(key).values\nlabels = torch.tensor(labels, dtype=torch.long)\nimages = []\nfor i in range(len(labels)):\n\timage = Image.open(\"train/train/\" + str(i + 1) + \".png\")\n\timage = image.convert(\"RGB\")\n\timage = np.array(image)/255.0\n\timage = np.transpose(image, (2, 0, 1))\n\timages.append(image)\nimages = torch.tensor(images, dtype=torch.float32)\nprint(images.shape, labels.shape)\nclass Loader_train(torch.utils.data.Dataset):\n\tdef __init__(self, data, label):\n\t\tself.data = data\n\t\tself.label = label\n\tdef __len__(self):\n\t\treturn len(self.data)\n\tdef __getitem__(self, idx):\n\t\treturn self.data[idx], self.label[idx]\nsep = int(len(labels) * 0.85)\ntrainset = Loader_train(images[:sep], labels[:sep])\ntrainset = torch.utils.data.DataLoader(trainset, batch_size=128, shuffle=True)\nvalidset = Loader_train(images[sep:], labels[sep:])\nvalidset = torch.utils.data.DataLoader(validset, batch_size=128, shuffle=False)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# training\nEPOCHS = 20\nfor epoch in range(1, EPOCHS + 1):\n\tprint(\"Start epoch %d.\" % epoch)\n\tprint(\"Training...\")\n\tmodel.train()\n\tfor i, (x, y) in enumerate(trainset):\n\t\tx = x.to(\"cuda\")\n\t\ty = y.to(\"cuda\")\n\t\toptimizer.zero_grad()\n\t\toutput = model(x)\n\t\tloss = criterion(output, y)\n\t\tloss.backward()\n\t\toptimizer.step()\n\t\tif i % 100 == 0:\n\t\t\tprint(\"Epoch %d: %.3f%% trained.\" % (epoch, i/len(trainset)*100))\n\tprint(\"Epoch %d: All trained.\" % epoch)\n\tprint(\"Validating...\")\n\tmodel.eval()\n\twith torch.no_grad():\n\t\tcorrect = 0\n\t\ttotal = 0\n\t\tfor x, y in validset:\n\t\t\tx = x.to(\"cuda\")\n\t\t\toutput = model(x).to(\"cpu\")\n\t\t\toutput = torch.argmax(output, dim=1)\n\t\t\tcorrect += (output == y).sum().item()\n\t\t\ttotal += len(y)\n\t\tprint(\"Epoch %d: %.3f%% correct.\" % (epoch, correct/total*100))\n\tprint(\"=\" * 40)\ntorch.save(model.state_dict(), \"cifar10.pth\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# testing\nmodel.eval()\nkey = [\"frog\",\"truck\",\"deer\",\"automobile\",\"bird\",\"horse\",\"ship\",\"cat\",\"dog\",\"airplane\"]\nkey = {i : key[i] for i in range(len(key))}\nres = [None]\nclass Loader_test(torch.utils.data.Dataset):\n\tdef __init__(self, data):\n\t\tself.data = data\n\tdef __len__(self):\n\t\treturn len(self.data)\n\tdef __getitem__(self, idx):\n\t\treturn self.data[idx]\n\nfor j in range(6):\n\timages = []\n\tfor i in range(50000):\n\t\timage = Image.open(\"test/test/\" + str(i + 1 + j * 50000) + \".png\")\n\t\timage = np.array(image.convert(\"RGB\"))/255.0\n\t\timage = np.transpose(image, (2, 0, 1))\n\t\timages.append(image)\n\timages = torch.tensor(images, dtype=torch.float32)\n\ttestset = Loader_test(images)\n\ttestset = torch.utils.data.DataLoader(testset, batch_size=128, shuffle=False)\n\n\twith torch.no_grad():\n\t\tfor x in testset:\n\t\t\toutput = model(x.to(\"cuda\")).to(\"cpu\")\n\t\t\toutput = torch.argmax(output, dim=1)\n\t\t\tfor i in output:\n\t\t\t\tres.append(key[i.item()])\nres = pd.DataFrame(res)\nres.to_csv(\"submission.csv\", index=True, header=[\"label\"])","metadata":{},"execution_count":null,"outputs":[]}]}