{"cells":[{"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 in \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 \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory\n\nimport os\nprint(os.listdir(\"../input\"))\n\n# Any results you write to the current directory are saved as output.","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!ls ..","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import PIL","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from skimage import io, transform","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"import torch\nimport torchvision","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import cv2\nfrom collections import OrderedDict","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import matplotlib.pyplot as plt\nfrom PIL import Image\nfrom skimage import io","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from torch.utils.data import Dataset, DataLoader\nfrom torchvision import transforms, utils, models\nfrom torch import nn","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n\n# Assuming that we are on a CUDA machine, this should print a CUDA device:\n\nprint(device)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"root_dir = '../input/imet-2019-fgvc6/'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"labels = pd.read_csv(root_dir+'labels.csv')\ndf_train = pd.read_csv(root_dir+'train.csv')\ndf_sub = pd.read_csv(root_dir+'sample_submission.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(df_train.shape)\ndf_train.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"labels.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"labels.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"n_categories = len(labels['attribute_name'].unique())\nprint(n_categories)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"img_name = df_train.iloc[65, 0]\nplt.imshow(cv2.cvtColor(cv2.imread(root_dir+'train/'+img_name+'.png'), cv2.COLOR_BGR2RGB))\nprint(df_train.iloc[65, 1])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_train.iloc[3, 1].split(' ')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"arr = list(map(int, df_train.iloc[3, 1].split(' ')))\nprint(type(arr[0]))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"arr =[]\nfor i in range(df_train.shape[0]):\n    arr.append(list(map(int, df_train.iloc[i, 1].split(' '))))\ndf_train['attributes_int'] = arr","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class IMetDataset(Dataset):\n    def __init__(self, label_file, \n                 train_csv, \n                 train_dir,\n                 transform=None):\n        \n        self.label_file = label_file\n        self.train_df = train_csv\n        self.train_dir = train_dir\n        self.transform = transform\n        \n        \n    def __len__(self):\n        return self.train_df.shape[0]\n        \n    def __getitem__(self, idx):\n        img_name = os.path.join(self.train_dir, self.train_df.iloc[idx, 0]+'.png')\n        \n        #img = io.imread(img_name)\n         \n        img = cv2.imread(img_name)\n        img = cv2.cvtColor(cv2.imread(img_name), cv2.COLOR_BGR2RGB) \n        img=img.transpose((2, 0, 1)) \n        \n        if self.transform:\n            img = self.transform(img)\n        \n        labs = self.train_df.iloc[idx, 2]\n      #  print(\"Labels: \", labs)\n        ans = np.zeros((1103, 1))\n        for label in labs:\n            ans[label]=1\n        #print(ans.shape)\n     #   print(\"One hot indices: \", np.where(ans==1)[0])\n        \n        return [img, ans]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\nclass IMetTestDataset(Dataset):\n    def __init__(self, test_dir, transformations=None):\n        self.test_dir =  test_dir\n        self.img_list = os.listdir(root_dir+'test')\n        self.transform = transformations\n            \n    def __len__(self):\n        'Denotes the total number of samples'\n        return len(self.img_list)\n\n    def __getitem__(self, idx):\n        'Generates one sample of data'\n        # Select sample\n        img_loc = os.path.join(self.test_dir, self.img_list[idx])\n      #  print(img_loc)\n      #  img = io.imread(img_loc)\n        \n        img = cv2.imread(img_loc)\n        img = cv2.cvtColor(cv2.imread(img_loc), cv2.COLOR_BGR2RGB) \n        img=img.transpose((2, 0, 1)) \n        \n        if self.transform:\n            img = self.transform(img)\n        \n        img_name = self.img_list[idx].split('.')[0]\n        \n        return [img, img_name]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"transformations = transforms.Compose([\n                                transforms.ToPILImage(),\n                                transforms.Resize((224, 224)),\n                                transforms.RandomHorizontalFlip(),\n                                transforms.ToTensor(),\n                                transforms.Normalize(\n                                    [0.485, 0.456, 0.406], \n                                    [0.229, 0.224, 0.225]\n                                )\n                            ])\n\ntrain_dataset = IMetDataset(labels, df_train, root_dir+'train/', \n                            transformations)\n\ntest_dataset = IMetTestDataset(root_dir+'test/', transformations)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"trainloader = DataLoader(train_dataset, batch_size=64,\n                        shuffle=True, num_workers=0)\ntestloader = DataLoader(test_dataset, batch_size=1,\n                        shuffle=False, num_workers=0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.imshow(train_dataset[1001][0].numpy().transpose(1, 2, 0))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"os.listdir(\"../input/vgg16-pytorch/\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = models.vgg16(pretrained=False)\nmodel.load_state_dict(torch.load(\"../input/vgg16-pytorch/vgg16-397923af.pth\"))\nmodel","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.classifier[-1] = nn.Linear(in_features=4096, out_features=n_categories)\nmodel.classifier.add_module('sigmoid', nn.Sigmoid())\nmodel.classifier.named_parameters","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for param in model.parameters():\n    param.require_grad=False\nfor param in model.classifier.parameters():\n    param.require_grad=True\nfor param in model.features[-1: -4]:\n    param.require_grad=True","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#model.load_state_dict(torch.load(\"../models/model1.pth\"))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.to(device)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import torch.optim as optim\nfrom torch.autograd import Variable\ncriterion = nn.BCELoss(reduction='mean').to(device)\noptimizer = optim.SGD(model.parameters(), lr=0.001)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def show_cuda():\n    if device.type == 'cuda':\n        print(torch.cuda.get_device_name(0))\n        print('Memory Usage:')\n        print('Allocated:', round(torch.cuda.memory_allocated(0)/1024**3,1), 'GB')\n        print('Cached:   ', round(torch.cuda.memory_cached(0)/1024**3,1), 'GB')\nshow_cuda()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for epoch in range(15):\n    print(\"Epoch\", epoch, \"Started...\")\n    running_loss=0\n    for i, data in enumerate(trainloader, 0):\n        optimizer.zero_grad()\n        \n        images, label = data\n        \n        inputs = images.type(torch.FloatTensor)\n        '''\n        inputs=Variable(inputs).cuda()\n     #   labels = labels.view()\n        label = Variable(label).cuda()\n        '''\n        inputs, label = Variable(inputs.to(device)), Variable(label.to(device))\n        \n        outputs = model(inputs)\n        '''  \n        print(outputs.shape)\n        print(label.shape)\n        \n        print(type(outputs))\n        print(type(label))\n        \n        '''\n        loss=criterion(outputs.type(torch.FloatTensor), label.type(torch.FloatTensor))\n        \n        loss.backward()\n        optimizer.step()\n        loss=loss.item()\n        running_loss+=float(loss)\n    #    if running_loss<1.5:\n    #        break\n        if i%200==0:\n            print(\"Epoch: \", epoch,\"  Running Loss:\",running_loss)\n            \n            running_loss=0\n    print(\"Epoch\", epoch, \"Completed\")   \n    show_cuda()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"torch.cuda.empty_cache()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import gc\ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"output=[]\nnames = []\nwith torch.no_grad():\n    for i, data in enumerate(testloader, 0):\n        images, name = data    \n        inputs = images.type(torch.FloatTensor)\n        inputs, label = Variable(inputs.to(device)), Variable(label.to(device))\n        output.append(model(inputs).cpu().numpy())\n        names.append(name[0])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"ops = output","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"indices_op=[]\nfor i in range(len(ops)):\n    indices_op.append(np.where(ops[i]>=0.383)[1])\nindices_op_str=[]\nfor i in range(len(indices_op)):\n    indices_op_str.append(' '.join(map(str, indices_op[i])))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!mkdir ../models\ntorch.save(model.state_dict(), '../models/model1.pth')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"d = {'id':names, 'attribute_ids':indices_op_str}\ndf = pd.DataFrame(d)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df.to_csv('submission.csv', index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}