{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport os\nimport glob\n\nfrom PIL import Image\n\nimport torch \nfrom torch import nn, optim\nfrom torch.utils.data import DataLoader\nimport torchvision.transforms as trans\nimport matplotlib.pyplot as plt","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"764dce4ef15c83050cc67b7dfff1b33a9289211e"},"cell_type":"code","source":"torch.manual_seed(1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"90e2069b5818c1de989b69a25a39e115cb3139e7"},"cell_type":"code","source":"train_images = list(glob.iglob('../input/train/*.jpg'))[:300]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"02608d5f2113d1c2340e7996ae0ed719aae85a9c"},"cell_type":"code","source":"img_path = np.random.choice(train_images)\nimg = Image.open(img_path)\nprint(img.size)\nimg","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"cdc95e62bd46debc179d362f856321e317c7f715"},"cell_type":"code","source":"transforms = trans.Compose([\n    trans.Resize((64, 64)),\n    trans.ToTensor()\n])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"a0d6f634601f46da34de93086bb87612e39d4d34"},"cell_type":"code","source":"X = transforms(img)\nX = X.view(1, 3, 64, 64)\nY = torch.FloatTensor([ 1 if 'dog' in img_path else 0 ])\nY","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"b7e374c07f90c4ef619cf9b0f30117f58a6c05d1"},"cell_type":"code","source":"plt.imshow(X[0].numpy().transpose(1,2,0))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"ea672aaa6a8129df0f2b56ead56d3e579b0500a1"},"cell_type":"code","source":"class DogCatDataset:\n    def __init__(self, images, transform=None):\n        self.images = images\n        self.transform = transform\n    \n    def __len__(self):\n        return len(self.images)\n    \n    def __getitem__(self, i):\n        img_path = self.images[i]\n        img = Image.open(img_path)\n        \n        y = 1 if 'dog' in img_path else 0\n        \n        if self.transform:\n            img = self.transform(img)\n        return img, y","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"00c998b47812e2a77caf980acb0a08a41aabfe38"},"cell_type":"code","source":"train_dataset = DogCatDataset(train_images, transform=transforms)\ntrain_dl = DataLoader(train_dataset, batch_size=4, shuffle=True, num_workers=4)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"97e2d405a35dfaa695c3cab7fbb9b74cfef2d919"},"cell_type":"code","source":"class DCClassifier(nn.Module):\n    def __init__(self):\n        super().__init__()\n        \n        self.conv1 = nn.Conv2d(3, 32, 3, padding=1)\n        self.p1 = nn.MaxPool2d(2)\n        self.conv2 = nn.Conv2d(32, 64, 3, padding=1)\n        self.p2 = nn.MaxPool2d(2)\n        self.conv3 = nn.Conv2d(64, 64, 3, padding=1)\n        self.p3 = nn.MaxPool2d(2)\n        \n        self.l1 = nn.Linear(64 * 8 * 8, 512)\n        self.l2 = nn.Linear(512, 1)\n    \n        self.sig = nn.Sigmoid()\n        self.tanh = nn.Tanh()\n        self.relu = nn.ReLU()\n\n    def forward(self, x):\n        x = self.relu(self.p1(self.conv1(x)))\n        x = self.relu(self.p2(self.conv2(x)))\n        x = self.relu(self.p3(self.conv3(x)))\n        x = x.view(-1, 64 * 8 * 8)\n        x = self.relu(self.l1(x))\n        x = self.sig(self.l2(x))\n        return x","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"d1a7a1705cfcb067805d5b4ce0e659bf0d99427a"},"cell_type":"code","source":"model = DCClassifier()\noptimizer = optim.Adam(model.parameters())\ncriterion = nn.BCELoss()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"9ad0166236704b83fde257c9d39ef2376c206f33"},"cell_type":"code","source":"def train(e):\n    model.train()\n    l = a = n = 0\n    for i, (X, Y) in enumerate(train_dl):\n        Y = Y.float()\n        optimizer.zero_grad()\n        preds = model(X)\n        loss = criterion(preds, Y.view_as(preds))\n        loss.backward()\n        optimizer.step()\n        \n        l += loss.item()\n        a += ((preds.squeeze() > 0.5) == Y.byte()).sum().item() / Y.shape[0]\n        n += 1\n#         if (i+1) % 100 == 0:\n    print(f\"Epoch {e} Iter {i+1} Loss {l/n} Acc {a/n}\")\n    l = a = n = 0","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"17d2df93547a314fe38136e7d810bbad96e3be9e","scrolled":false},"cell_type":"code","source":"for i in range(10):\n    train(i)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true,"_uuid":"eed734b0d67a8bdf41f1dec8355504e6ff824573"},"cell_type":"code","source":"model = DCClassifier()\noptimizer = optim.RMSprop(model.parameters())\nfor i in range(10):\n    train(i)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"32e420adfdddcc64427a5a5b87b08388da29aa20"},"cell_type":"code","source":"model = DCClassifier()\noptimizer = optim.RMSprop(model.parameters(), lr=0.0005)\nfor i in range(10):\n    train(i)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"4d7e34bb2a1f1f833cdb1f5f5b8fcb696eff5632"},"cell_type":"code","source":"class DCClassifier(nn.Module):\n    def __init__(self):\n        super().__init__()\n        \n        self.conv1 = nn.Conv2d(3, 32, 3, padding=1)\n        self.p1 = nn.MaxPool2d(2)\n        self.conv2 = nn.Conv2d(32, 64, 3, padding=1)\n        self.p2 = nn.MaxPool2d(2)\n        self.conv3 = nn.Conv2d(64, 128, 3, padding=1)\n        self.p3 = nn.MaxPool2d(2)\n        self.conv4 = nn.Conv2d(128, 128, 3, padding=1)\n        self.p4 = nn.MaxPool2d(2)\n        \n        self.l1 = nn.Linear(128 * 4 * 4, 2048)\n        self.l2 = nn.Linear(2048, 512)\n        self.l3 = nn.Linear(512, 64)\n        self.l4 = nn.Linear(64, 1)\n    \n        self.sig = nn.Sigmoid()\n        self.relu = nn.ReLU()\n    \n    def forward(self, x):\n        x = self.relu(self.p1(self.conv1(x)))\n        x = self.relu(self.p2(self.conv2(x)))\n        x = self.relu(self.p3(self.conv3(x)))\n        x = self.relu(self.p4(self.conv4(x)))\n        x = x.view(-1, 128 * 4 * 4)\n        x = self.relu(self.l1(x))\n        x = self.relu(self.l2(x))\n        x = self.relu(self.l3(x))\n        x = self.sig(self.l4(x))\n        return x","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"9a67697d2bb180c91bfa863cb5a1e29fd9cc355c"},"cell_type":"code","source":"model = DCClassifier()\noptimizer = optim.Adam(model.parameters())\nfor i in range(10):\n    train(i)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"606e525c7993eca18685b15f9cfba0abd71401a1"},"cell_type":"code","source":"model = DCClassifier()\noptimizer = optim.Adam(model.parameters(), lr=0.0001)\nfor i in range(10):\n    train(i)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"fd213b62681fe2832c689d9b66d8ee92e459ed16"},"cell_type":"code","source":"model = DCClassifier()\noptimizer = optim.RMSprop(model.parameters(), lr=0.0001)\nfor i in range(10):\n    train(i)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"ee775c04a4dc19e8cf205558a61e68da96b26160"},"cell_type":"code","source":"# def get_stats(m):\n#     return [ m.mean().item(), m.median().item(), m.std().item(), m.min().item(), m.max().item() ]\n\n# def print_model(model):\n#     index = []\n#     columns = [\"Mean\", \"Median\", \"Std\", \"Min\", \"Max\" ]\n#     data = []\n#     for n, m in model.named_parameters():\n#         index.append(n)\n#         index.append(f'{n}.grad')\n#         data.append(get_stats(m))\n#         if m.grad is not None:\n#             data.append(get_stats(m.grad))\n#         else:\n#             data.append([ None ] * len(columns))\n#     return pd.DataFrame(data, index=index, columns=columns)   ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"21c55c27cdf4e35e81210c695a3c83ac4c13d24c"},"cell_type":"code","source":"# print_model(model)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"b63f39bf9400664280b882556830d2cb119de41b"},"cell_type":"code","source":"# plt.imshow(X[0].numpy().squeeze().transpose(1, 2, 0))\n\n# optimizer.zero_grad()\n# o = model(X)\n# # print(o, Y)\n# loss = criterion(o, Y.view_as(o))\n# loss.backward()\n# # print(model.conv1.weight.grad, model.l4.weight.grad)\n# optimizer.step()\n# print(loss)\n\n# o = model(X)\n# loss =criterion(torch.sigmoid(o), Y.view_as(o))\n\n# loss\n\n# loss.backward()\n\n# ag = loss.grad_fn.next_functions[0][0].next_functions[0][0].next_functions[0][0].next_functions[0][0] #.variable is model.l3.bias\n\n# ag.variable.grad\n\n# ag.variable\n\n# model.l3.bias.grad\n\n# optimizer.step()\n\n# optimizer.zero_grad()\n\n# print_model(model)\n\n\n     \n\n# print_model(model)\n\n","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}