{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"#we need to import some libraries\nimport numpy as np\nimport pandas as pd\nimport os\nimport sys\nprint(os.listdir(\"../input\"))\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.preprocessing import OneHotEncoder\nfrom PIL import Image\nfrom torch.utils.data import Dataset\nfrom torch.autograd import Variable\nfrom torchvision import transforms\nimport torchvision.models as models\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torch.optim import lr_scheduler\nimport random\nimport torch.backends.cudnn as cudnn\nfrom time import time\nfrom tqdm import tqdm","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"# load image data\ndataFile = pd.read_csv('../input/train.csv')\ndataFile.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"c8921d60866250f094340c3ddfa367594d3bd356"},"cell_type":"code","source":"class WhaleDataset(Dataset):\n    def __init__(self, datafolder, datatype='train', dataFile=None, transform=None, labelArray=None):\n        self.datafolder = datafolder\n        self.datatype = datatype\n        self.labelArray = labelArray\n        if self.datatype == 'train':\n            self.dataFile = dataFile.values\n        self.image_files_list = [s for s in os.listdir(datafolder)]\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.image_files_list)\n    \n    def __getitem__(self, idx):\n        if self.datatype == 'train':\n            img_name = os.path.join(self.datafolder, self.dataFile[idx][0])\n            label = self.labelArray[idx]\n            \n        elif self.datatype == 'test':\n            img_name = os.path.join(self.datafolder, self.image_files_list[idx])\n            label = np.zeros((5005,))\n        \n        img = Image.open(img_name).convert('RGB')\n        image = self.transform(img)\n        \n        if self.datatype == 'train':\n            return image, label\n        elif self.datatype == 'test':\n            # so that the images will be in a correct order\n            return image, label, self.image_files_list[idx]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"6133582895e15d2a2da0a30f770de2c20af2e6e3"},"cell_type":"code","source":"def prepare_labels(y):\n    values = np.array(y)\n    label_encoder = LabelEncoder()\n    integer_encoded = label_encoder.fit_transform(values)\n\n    onehot_encoder = OneHotEncoder(sparse=False)\n    integer_encoded = integer_encoded.reshape(len(integer_encoded), 1)\n    onehot_encoded = onehot_encoder.fit_transform(integer_encoded)\n    #print(onehot_encoded.shape)\n\n    y = onehot_encoded\n    #print(y.shape)\n    return y, label_encoder\n\ny, label_encoder = prepare_labels(dataFile['Id'])","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-output":false,"trusted":true,"_uuid":"fccc8f48d518c0872f6f9c7da24be88cdf16211d"},"cell_type":"code","source":"device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\nmodel = models.resnet101(pretrained = True)\nnum_ftrs = model.fc.in_features\nmodel.fc = nn.Linear(num_ftrs, 5005)\nmodel = model.to(device)\n\ncriterion = nn.BCEWithLogitsLoss()\n\noptimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)\n\nexp_lr_scheduler = lr_scheduler.StepLR(optimizer, step_size=7, gamma=0.1)\n        ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"6e9aa5e7f056167f141c0f0a0620588bff1e730d"},"cell_type":"code","source":"input_size = 224 \nmean=[0.485, 0.456, 0.406]\nstd=[0.229, 0.224, 0.225]\ndata_transforms =  transforms.Compose([\n        transforms.RandomResizedCrop(input_size),\n        transforms.RandomHorizontalFlip(),  # simple data augmentation\n        transforms.ToTensor(),\n        transforms.Normalize(mean, std)\n        ])\ntrain_dataset= WhaleDataset(datafolder='../input/train/', datatype='train', \n                            dataFile=dataFile, transform=data_transforms, \n                            labelArray=y)\ndset_loaders = torch.utils.data.DataLoader(train_dataset, batch_size=32, num_workers=0, pin_memory=True)\nN_train = len(y)\nprint(N_train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"13f2532027120013b9c73c5ea74c86d2a5a1bbc6"},"cell_type":"code","source":"batch_size = 32\nnum_epochs = 5\nfor epoch in range(num_epochs):\n    print('Epoch {}/{}'.format(epoch, num_epochs - 1))\n    print('-' * 10)\n    \n    running_loss, running_corrects, tot = 0.0, 0.0, 0.0\n    ########################\n    model.train()\n    torch.set_grad_enabled(True)\n    ## Training \n    for batch_idx, (inputs, labels) in enumerate(dset_loaders):\n        optimizer.zero_grad()\n        inputs = inputs.to(device)\n        labels = labels.to(device)\n        outputs = model(inputs)\n\n        loss = criterion(outputs, labels.float())\n        running_loss += loss*inputs.shape[0]\n        loss.backward()\n        optimizer.step()\n        ############################################\n        _, preds = torch.max(outputs.data, 1)\n        _, tmplabel = torch.max(labels.data, 1)\n\n        running_loss += loss.item()\n        running_corrects += preds.eq(tmplabel).cpu().sum()\n        tot += labels.size(0)\n        sys.stdout.write('\\r')\n        try:\n            batch_loss = loss.item()\n        except NameError:\n            batch_loss = 0\n\n        top1error = 1 - float(running_corrects)/tot\n        if batch_idx % 100 == 0:\n            sys.stdout.write('| Epoch [%2d/%2d] Iter [%3d/%3d]\\tBatch loss %.4f\\n'\n                             % (epoch + 1, num_epochs, batch_idx + 1,\n                            (len(os.listdir('../input/train')) // batch_size), batch_loss/batch_size))\n            sys.stdout.flush()\n            sys.stdout.write('\\r')\n        \n    #accuracy = float(running_corrects)/N_train\n    epoch_loss = running_loss/N_train\n\n    print('\\n| Training loss %.4f'\\\n            % (epoch_loss))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"4b4ea894b199a81570eab5f78dd9145a51d8441b"},"cell_type":"code","source":"#Evaluate and predict test data\nsub = pd.read_csv('../input/sample_submission.csv')\ntest_transforms = transforms.Compose([\n        transforms.Resize(input_size),\n        transforms.CenterCrop(input_size),\n        transforms.ToTensor(),\n        transforms.Normalize(mean, std)\n    ])\n\ntest_set = WhaleDataset(\n    datafolder='../input/test/', \n    datatype='test', \n    transform=test_transforms\n)\ntest_loader = torch.utils.data.DataLoader(test_set, batch_size=32, num_workers=0, pin_memory=True)\n\nmodel.eval()\nfor (inputs, labels, name) in tqdm(test_loader):\n    inputs = inputs.to(device)\n    output = model(inputs)\n    output = output.cpu().detach().numpy()\n    for i, (e, n) in enumerate(list(zip(output, name))):\n        sub.loc[sub['Image'] == n, 'Id'] = ' '.join(label_encoder.inverse_transform(e.argsort()[-5:][::-1]))\nprint(output.shape)\nsub.to_csv('submission.csv', index=False)","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}