{"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\"))\nprint(os.listdir(\"../input/proteinproject\"))\nprint(os.listdir(\"../input/human-protein-atlas-image-classification\"))\n\n# Any results you write to the current directory are saved as output.","execution_count":1,"outputs":[{"output_type":"stream","text":"['human-protein-atlas-image-classification', 'proteinproject', 'human-protein-resnet50-training-pytorch']\n['checkpoint-epoch10.pth', 'train_scaled', 'project', 'model_best_scaled_128.pth']\n['train', 'test', 'train.csv', 'sample_submission.csv']\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(os.listdir(\"../input/human-protein-resnet50-training-pytorch/saved/Protein_Resnet50/0419_084007\"))","execution_count":7,"outputs":[{"output_type":"stream","text":"['checkpoint-epoch8.pth', 'checkpoint-epoch4.pth', 'model_best.pth', 'config.json']\n","name":"stdout"}]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"# import module we'll need to import our custom module\nfrom shutil import copyfile\nimport distutils\nfrom distutils import dir_util\n\ndistutils.dir_util.copy_tree(\"../input/proteinproject/project\", \"../working\")\n\nprint(os.listdir(\"../working\"))\n","execution_count":8,"outputs":[{"output_type":"stream","text":"['__notebook_source__.ipynb', 'model', '.ipynb_checkpoints', 'utils', 'base', 'data_loader', 'trainer']\n","name":"stdout"}]},{"metadata":{"trusted":true,"_uuid":"52afa7f1d70508749d642f9947c4c9a121e02750"},"cell_type":"code","source":"%%writefile ../working/config.json\n{\n    \"name\": \"Protein_Resnet50\",\n    \"n_gpu\": 1,\n    \n    \"arch\": {\n        \"type\": \"Resnet50Model\",\n        \"args\": {}\n    },\n    \"data_loader\": {\n        \"type\": \"ProteinDataLoader\",\n        \"args\":{\n            \"data_dir\": \"../input/human-protein-atlas-image-classification/train\",\n            \"csv_path\": \"../input/human-protein-atlas-image-classification/train.csv\",\n            \"img_size\": 512,\n            \"batch_size\": 25,\n            \"shuffle\": false,\n            \"validation_split\": 0.15,\n            \"num_workers\": 0,\n            \"num_classes\": 28\n        }\n    },\n    \"optimizer\": {\n        \"type\": \"Adam\",\n        \"args\":{\n            \"lr\": 0.0001,\n            \"amsgrad\": true\n        }\n    },\n    \"loss\": \"focal_loss\",\n    \"metrics\": [],\n    \"lr_scheduler\": {\n        \"type\": \"StepLR\",\n        \"args\": {\n            \"step_size\": 2,\n            \"gamma\": 0.1\n        }\n    },\n    \"trainer\": {\n        \"epochs\": 9,\n        \"save_dir\": \"../working/saved/\",\n        \"save_period\": 3,\n        \"verbosity\": 2,\n        \n        \"monitor\": \"min val_loss\",\n        \"early_stop\": 5,\n        \n        \"tensorboardX\": false,\n        \"log_dir\": \"../working/saved/runs\"\n    }\n}","execution_count":9,"outputs":[{"output_type":"stream","text":"Writing ../working/config.json\n","name":"stdout"}]},{"metadata":{"trusted":true,"_uuid":"461ae31e8262ef5e5fdb0f0a9f41f2d4b3131262"},"cell_type":"code","source":"f = open(\"../working/config.json\", \"r\")\nprint(f.read())\nf.close()","execution_count":10,"outputs":[{"output_type":"stream","text":"{\n    \"name\": \"Protein_Resnet50\",\n    \"n_gpu\": 1,\n    \n    \"arch\": {\n        \"type\": \"Resnet50Model\",\n        \"args\": {}\n    },\n    \"data_loader\": {\n        \"type\": \"ProteinDataLoader\",\n        \"args\":{\n            \"data_dir\": \"../input/human-protein-atlas-image-classification/train\",\n            \"csv_path\": \"../input/human-protein-atlas-image-classification/train.csv\",\n            \"img_size\": 512,\n            \"batch_size\": 25,\n            \"shuffle\": false,\n            \"validation_split\": 0.15,\n            \"num_workers\": 0,\n            \"num_classes\": 28\n        }\n    },\n    \"optimizer\": {\n        \"type\": \"Adam\",\n        \"args\":{\n            \"lr\": 0.0001,\n            \"amsgrad\": true\n        }\n    },\n    \"loss\": \"focal_loss\",\n    \"metrics\": [],\n    \"lr_scheduler\": {\n        \"type\": \"StepLR\",\n        \"args\": {\n            \"step_size\": 2,\n            \"gamma\": 0.1\n        }\n    },\n    \"trainer\": {\n        \"epochs\": 9,\n        \"save_dir\": \"../working/saved/\",\n        \"save_period\": 3,\n        \"verbosity\": 2,\n        \n        \"monitor\": \"min val_loss\",\n        \"early_stop\": 5,\n        \n        \"tensorboardX\": false,\n        \"log_dir\": \"../working/saved/runs\"\n    }\n}\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"from torchvision import datasets, transforms\nfrom base import BaseDataLoader\nfrom PIL import Image\nimport numpy as np\nfrom torch.utils.data import Dataset, DataLoader\nfrom torch.utils.data.sampler import SubsetRandomSampler\nfrom torchvision import transforms as T\nfrom imgaug import augmenters as iaa\nimport pandas as pd\nimport pathlib\nfrom data_loader.data_loaders import ProteinDataset\n\n\nclass ProteinDataLoader2(BaseDataLoader):\n    def __init__(self, data_dir, csv_path, batch_size, shuffle, validation_split, num_workers, num_classes, img_size, training=True):\n        self.images_df = pd.read_csv(csv_path)\n        self.num_classes = num_classes\n        self.dataset = ProteinDataset(self.images_df, data_dir, num_classes, img_size, not training, training)\n        self.n_samples = len(self.dataset)\n        super(ProteinDataLoader2, self).__init__(self.dataset, batch_size, shuffle, validation_split, num_workers)\n\n    def _split_sampler(self, split):\n        if split == 0.0:\n            return None, None\n\n        # Dumb stratification.\n        validation_split = []\n        for idx, (value, count) in enumerate(self.images_df['Target'].value_counts().to_dict().items()):\n            if count > 1:\n                for _ in range(max(round(split * count), 1)):\n                    validation_split.append(value)\n\n        # Oversampling.\n        multi = [0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 4, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 4]\n        validation_split_idx = []\n        train_split_idx = []\n        for idx, value in enumerate(self.images_df['Target']):\n            try:\n                validation_split.remove(value)\n                validation_split_idx.append(idx)\n            except:\n                for _ in range(max(sum([multi[int(v)] for v in value.split(' ')]), 1)):\n                    train_split_idx.append(idx)\n\n        valid_idx = np.array(validation_split_idx)\n        train_idx = np.array(train_split_idx)\n\n        train_sampler = SubsetRandomSampler(train_idx)\n        valid_sampler = SubsetRandomSampler(valid_idx)\n\n        # turn off shuffle option which is mutually exclusive with sampler\n        self.shuffle = False\n        self.n_samples = len(train_idx)\n\n        return train_sampler, valid_sampler\n","execution_count":18,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import torch\nimport torch.nn as nn\nfrom base import BaseModel\nimport torchvision.models as models\n\n\nclass Resnet50Model(BaseModel):\n    def __init__(self, num_classes=28):\n        super(Resnet50Model, self).__init__()\n        self.resnet = models.resnet50(pretrained=False)\n        w = self.resnet.conv1.weight\n        self.resnet.conv1 = nn.Conv2d(4, 64, kernel_size=7, stride=2, padding=3, bias=False)\n        self.resnet.conv1.weight = nn.Parameter(torch.cat((w, 0.5 * (w[:, :1, :, :] + w[:, 2:, :, :])), dim=1))\n        self.resnet.fc = nn.Sequential(\n            nn.BatchNorm1d(512 * 4),\n            nn.Dropout(0.5),\n            nn.Linear(512 * 4, num_classes),\n        )\n\n    def forward(self, x):\n        return self.resnet(x)","execution_count":19,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"43bf9615dc0125309974b25d6e02be7939f9d770"},"cell_type":"code","source":"import os\nimport json\nimport argparse\nimport torch\nimport data_loader.data_loaders as module_data\nimport model.loss as module_loss\nimport model.metric as module_metric\nimport model.resnet as module_arch\nfrom trainer import Trainer\nfrom utils import Logger\n\n\ndef get_instance(module, name, config, *args):\n    return getattr(module, config[name]['type'])(*args, **config[name]['args'])\n\n\ndef train(config, resume):\n    train_logger = Logger()\n\n    # setup data_loader instances\n    data_loader = ProteinDataLoader2(**config['data_loader']['args'])\n    valid_data_loader = data_loader.split_validation()\n\n    # build model architecture\n    model = Resnet50Model()\n    # load state dict\n    checkpoint = torch.load(\"../input/human-protein-resnet50-training-pytorch/saved/Protein_Resnet50/0419_084007/model_best.pth\")\n    state_dict = checkpoint['state_dict']\n    if config['n_gpu'] > 1:\n        model = torch.nn.DataParallel(trained_model)\n    model.load_state_dict(state_dict)\n    print(model)\n\n    # get function handles of loss and metrics\n    loss = getattr(module_loss, config['loss'])\n    metrics = [getattr(module_metric, met) for met in config['metrics']]\n\n    # build optimizer, learning rate scheduler. delete every lines containing lr_scheduler for disabling scheduler\n    trainable_params = filter(lambda p: p.requires_grad, model.parameters())\n    optimizer = get_instance(torch.optim, 'optimizer', config, trainable_params)\n    lr_scheduler = get_instance(torch.optim.lr_scheduler, 'lr_scheduler', config, optimizer)\n\n    trainer = Trainer(model, loss, metrics, optimizer,\n                      resume=resume,\n                      config=config,\n                      data_loader=data_loader,\n                      valid_data_loader=valid_data_loader,\n                      lr_scheduler=lr_scheduler,\n                      train_logger=train_logger)\n\n    trainer.train()\n    \n    return model\n\n\n# Run!\nconfig = json.load(open(\"../working/config.json\"))\npath = os.path.join(config['trainer']['save_dir'], config['name'])\n\ntrained_model = train(config, None)","execution_count":null,"outputs":[{"output_type":"stream","text":"Resnet50Model(\n  (resnet): ResNet(\n    (conv1): Conv2d(4, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)\n    (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n    (relu): ReLU(inplace)\n    (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)\n    (layer1): Sequential(\n      (0): Bottleneck(\n        (conv1): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n        (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (relu): ReLU(inplace)\n        (downsample): Sequential(\n          (0): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n          (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        )\n      )\n      (1): Bottleneck(\n        (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n        (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (relu): ReLU(inplace)\n      )\n      (2): Bottleneck(\n        (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n        (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (relu): ReLU(inplace)\n      )\n    )\n    (layer2): Sequential(\n      (0): Bottleneck(\n        (conv1): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n        (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (relu): ReLU(inplace)\n        (downsample): Sequential(\n          (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)\n          (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        )\n      )\n      (1): Bottleneck(\n        (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n        (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (relu): ReLU(inplace)\n      )\n      (2): Bottleneck(\n        (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n        (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (relu): ReLU(inplace)\n      )\n      (3): Bottleneck(\n        (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n        (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (relu): ReLU(inplace)\n      )\n    )\n    (layer3): Sequential(\n      (0): Bottleneck(\n        (conv1): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n        (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (relu): ReLU(inplace)\n        (downsample): Sequential(\n          (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(2, 2), bias=False)\n          (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        )\n      )\n      (1): Bottleneck(\n        (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n        (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (relu): ReLU(inplace)\n      )\n      (2): Bottleneck(\n        (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n        (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (relu): ReLU(inplace)\n      )\n      (3): Bottleneck(\n        (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n        (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (relu): ReLU(inplace)\n      )\n      (4): Bottleneck(\n        (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n        (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (relu): ReLU(inplace)\n      )\n      (5): Bottleneck(\n        (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n        (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (relu): ReLU(inplace)\n      )\n    )\n    (layer4): Sequential(\n      (0): Bottleneck(\n        (conv1): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n        (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (relu): ReLU(inplace)\n        (downsample): Sequential(\n          (0): Conv2d(1024, 2048, kernel_size=(1, 1), stride=(2, 2), bias=False)\n          (1): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        )\n      )\n      (1): Bottleneck(\n        (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n        (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (relu): ReLU(inplace)\n      )\n      (2): Bottleneck(\n        (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n        (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (relu): ReLU(inplace)\n      )\n    )\n    (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))\n    (fc): Sequential(\n      (0): BatchNorm1d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n      (1): Dropout(p=0.5)\n      (2): Linear(in_features=2048, out_features=28, bias=True)\n    )\n  )\n)\nTrainable parameters: 23572636\n","name":"stdout"},{"output_type":"stream","text":"Train Epoch: 1 [0/26870 (0%)] Loss: 1.116572\nTrain Epoch: 1 [125/26870 (0%)] Loss: 1.207089\nTrain Epoch: 1 [250/26870 (1%)] Loss: 0.894413\nTrain Epoch: 1 [375/26870 (1%)] Loss: 1.179876\nTrain Epoch: 1 [500/26870 (2%)] Loss: 0.968262\n","name":"stderr"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"%%writefile ../working/config-test.json\n{\n    \"name\": \"Protein_Resnet50\",\n    \"n_gpu\": 1,\n    \n    \"arch\": {\n        \"type\": \"Resnet50Model\",\n        \"args\": {}\n    },\n    \"data_loader\": {\n        \"type\": \"ProteinDataLoader\",\n        \"args\":{\n            \"data_dir\": \"../input/human-protein-atlas-image-classification/test\",\n            \"csv_path\": \"../input/human-protein-atlas-image-classification/sample_submission.csv\",\n            \"img_size\": 512,\n            \"batch_size\": 1,\n            \"shuffle\": false,\n            \"validation_split\": 0.1,\n            \"num_workers\": 0,\n            \"num_classes\": 28\n        }\n    },\n    \"optimizer\": {\n        \"type\": \"Adam\",\n        \"args\":{\n            \"lr\": 0.0001,\n            \"amsgrad\": true\n        }\n    },\n    \"loss\": \"focal_loss\",\n    \"metrics\": [],\n    \"lr_scheduler\": {\n        \"type\": \"StepLR\",\n        \"args\": {\n            \"step_size\": 2,\n            \"gamma\": 0.1\n        }\n    },\n    \"trainer\": {\n        \"epochs\": 9,\n        \"save_dir\": \"../working/saved/\",\n        \"save_period\": 4,\n        \"verbosity\": 2,\n        \n        \"monitor\": \"min val_loss\",\n        \"early_stop\": 5,\n        \n        \"tensorboardX\": false,\n        \"log_dir\": \"../working/saved/runs\"\n    },\n    \"input_csv\": \"../input/human-protein-atlas-image-classification/sample_submission.csv\"\n}","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import os\nimport json\nimport argparse\nimport torch\nfrom tqdm import tqdm\nimport data_loader.data_loaders as module_data\nimport model.resnet as module_arch\nimport numpy as np\nimport pandas as pd\n\ndef test(config, resume_model):\n    # setup data_loader instances\n    data_loader = getattr(module_data, config['data_loader']['type'])(\n        config['data_loader']['args']['data_dir'],\n        config['data_loader']['args']['csv_path'],\n        img_size=config['data_loader']['args']['img_size'],\n        num_classes=config['data_loader']['args']['num_classes'],\n        batch_size=1,\n        shuffle=False,\n        validation_split=0.0,\n        training=False,\n        num_workers=0\n    )\n\n    # build model architecture\n    model = resume_model\n    model.summary()\n\n    # prepare model for testing\n    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n    model = model.to(device)\n    model.eval()\n\n    sample_submission = pd.read_csv(config['input_csv'])\n\n    os.makedirs(\"./submit\", exist_ok=True)\n\n    thresholds = [0.2, 0.4, 0.5]\n    for threshold in thresholds:\n        filenames, labels, submissions = [], [], []\n        with torch.no_grad():\n            for i, (data, target) in enumerate(tqdm(data_loader)):\n                data = data.to(device)\n                output = model(data)\n                label = output.sigmoid().cpu().data.numpy()\n\n                filenames.append(target)\n                labels.append(label > threshold)\n\n        for row in np.concatenate(labels):\n            subrow = ' '.join(list([str(i) for i in np.nonzero(row)[0]]))\n            submissions.append(subrow)\n        sample_submission['Predicted'] = submissions\n        sample_submission.to_csv(\"./submit/submission-{0:.2f}.csv\".format(threshold), index=None)\n        \n# Run!\nconfig = json.load(open(\"../working/config-test.json\"))\npath = os.path.join(config['trainer']['save_dir'], config['name'])\n\n# No testing for 128x128\ntest(config, trained_model)\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}