{"cells":[{"metadata":{},"cell_type":"markdown","source":"Trains a Resent50 model on the GPU and saves as a pth."},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\n\"\"\"for dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\"\"\"\n\n# You can write up to 5GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"#Load data paths\ntrain_image_path = \"/kaggle/input/iwildcam-2020-fgvc7/train/\"\ntest_image_path = \"/kaggle/input/iwildcam-2020-fgvc7/test/\"\ntrain_annotations_path = \"/kaggle/input/iwildcam-2020-fgvc7/iwildcam2020_train_annotations.json\"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Read annotations JSON\n\nimport json\n\nwith open(train_annotations_path) as json_file:\n    train_annotations = json.load(json_file)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#print(train_annotations.keys())\n#print(train_annotations[\"annotations\"])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"categories = pd.DataFrame.from_dict(train_annotations[\"categories\"])\ncategories","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_annotations[\"images\"][1]\ndata = pd.DataFrame.from_dict(train_annotations[\"images\"])\ncategory_annotations = pd.DataFrame.from_dict(train_annotations[\"annotations\"])\ndata = data.rename(columns = {\"id\": \"image_id\"})\ndata = data.merge(category_annotations, on = (\"image_id\"))\ndata = data.drop(columns = [\"id\", \"count\", \"frame_num\", \"seq_num_frames\", \"seq_id\"], axis = 1)\ndata","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nimg_path = (train_image_path + data[\"file_name\"][1])\nimg = plt.imread((train_image_path + data[\"file_name\"][1]))\nplt.imshow(img)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from torch.utils.data import Dataset, DataLoader\nimport cv2\nimport torchvision\nfrom torchvision import transforms\nimport tensorflow as tf\n\n\ndef transformer():\n    return transforms.Compose([\n        transforms.ToTensor()\n    ])\n\nclass DataCreation(Dataset):\n    def __init__(self, data, transforms = None):\n        super().__init__()\n\n        self.transform = transformer\n        self.image_id = data[\"image_id\"]\n\n    def __len__(self):\n        return len(self.image_id)\n    \n    def __getitem__(self,idx : int):\n        image_id = self.image_id[idx]\n        image = cv2.imread(train_image_path + image_id + \".jpg\", cv2.IMREAD_COLOR)\n        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB).astype(np.float32)\n        image /= 255.0\n        \n        if self.transform:\n            augmented = self.transform(image=image)\n            image = augmented[\"image\"]\n            \n        return image_id, image\n    \n\ndef collate_fn(batch):\n    return tuple(zip(*batch))\n\ntrain_dataset = DataCreation(data, transformer())\ntrain_loader = DataLoader(train_dataset, batch_size = 4, collate_fn = collate_fn)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Create Model"},{"metadata":{"trusted":true},"cell_type":"code","source":"import torch\nfrom torch import nn\nfrom torch import optim\nimport torch.nn.functional as F\nfrom torchvision import datasets, transforms, models\n\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() \n                                  else \"cpu\")\nmodel = models.resnet50(pretrained=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for param in model.parameters():\n    param.requires_grad = False\n    \nmodel.fc = nn.Sequential(nn.Linear(2024, 512),\n                                 nn.ReLU(),\n                                 nn.Dropout(0.2),\n                                 nn.Linear(512, 10),\n                                 nn.LogSoftmax(dim=1))\ncriterion = nn.NLLLoss()\noptimizer = optim.Adam(model.fc.parameters(), lr=0.003)\nmodel.to(device)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"epochs = 1\nsteps = 0\nrunning_loss = 0\nprint_every = 10\ntrain_losses, test_losses = [], []\nfor epoch in range(epochs):\n    for image, image_id in train_loader:\n        steps += 1\n        image_id = (image_id + \".jpg\")\n        image_id = image_id.to(device)\n        image = image.to(device)\n    \n        optimizer.zero_grad()\n        logps = model.forward(image)\n        loss = criterion(logps, image_id)\n        loss.backward()\n        optimizer.step()\n        running_loss += loss.item()\n        \n        if steps % print_every == 0:\n            test_loss = 0\n            accuracy = 0\n            model.eval()\n            with torch.no_grad():\n                for inputs, labels in test_loader:\n                    inputs, labels = inputs.to(device), labels.to(device)\n                    logps = model.forward(inputs)\n                    batch_loss = criterion(logps, labels)\n                    test_loss += batch_loss.item()\n                    \n                    ps = torch.exp(logps)\n                    top_p, top_class = ps.topk(1, dim=1)\n                    equals = top_class == labels.view(*top_class.shape)\n                    accuracy += torch.mean(equals.type(torch.FloatTensor)).item()\n            train_losses.append(running_loss/len(trainloader))\n            test_losses.append(test_loss/len(testloader))                    \n            print(f\"Epoch {epoch+1}/{epochs}.. \"\n                  f\"Train loss: {running_loss/print_every:.3f}.. \"\n                  f\"Test loss: {test_loss/len(testloader):.3f}.. \"\n                  f\"Test accuracy: {accuracy/len(testloader):.3f}\")\n            running_loss = 0\n            model.train()\ntorch.save(model, 'aerialmodel.pth')","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}