{"cells":[{"metadata":{},"cell_type":"markdown","source":"## Skorch training baseline for Pandas\n\nThis is a simple training baseline for the challenge: [https://www.kaggle.com/c/prostate-cancer-grade-assessment](http://).\nSkorch introduces scikit-learn like functionality for PyTorch\n\nI used reseized pandas dataset of size (512 x 512) which did not yeild any good results but I thought of sharing it anyway.\nI have also shareed the training files. \n\nHope u find it useful! Upvote if u like it ! "},{"metadata":{"trusted":true},"cell_type":"code","source":"!pip install -U skorch","execution_count":null,"outputs":[]},{"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)\nimport cv2\n\n# torch imports\nimport torch\nfrom torchvision.transforms import transforms\nimport torch.optim as optim\nimport torchvision\nimport torch.nn as nn\nfrom torch.utils.data import Dataset\n\n\n# skorch imports\nfrom skorch import NeuralNetClassifier\nfrom skorch.callbacks import LRScheduler, Checkpoint, Freezer\nfrom skorch.helper import predefined_split\n\nimport os\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":"%%writefile config.py\n\ntrain_dir = '../input/pandaresizeddataset512x512/train/'\ntest_dir = '../input/pandaresizeddataset512x512/test_images/'\ntrain_csv = '../input/prostate-cancer-grade-assessment/train.csv'\ntest_csv = '../input/prostate-cancer-grade-assessment/test.csv'\nbatch_size = 32","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"%%writefile data.py\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport cv2\nimport config\n\n# torch imports\nimport torch\nfrom torch.utils.data import Dataset\n\nclass PandaDataset(Dataset):\n    def __init__(self, csv_file, transform=None):\n        self.df = pd.read_csv(csv_file)\n        self.transform = transform\n\n    def __getitem__(self, index):\n        image_ids = self.df['image_id'].values\n        labels = self.df['isup_grade'].values\n\n        image = cv2.imread(config.train_dir + image_ids[index] + '.png')\n        label = labels[index]\n\n        if self.transform:\n            image = self.transform(image)\n\n        image = image.clone().detach()\n        label = torch.tensor(label)\n\n        return image, label\n\n    def __len__(self):\n        return len(self.df)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"%%writefile engine.py\n\n# torch imports\nimport torch\nfrom torchvision.transforms import transforms\nfrom torch.utils.data import Dataset, random_split\n\nfrom data import PandaDataset\nimport config\n\nclass Engine:\n    def __init__(self):\n        self.transforms = transforms.Compose(\n            [\n                transforms.ToPILImage(),\n                transforms.RandomHorizontalFlip(),\n                transforms.ToTensor()\n            ]\n        )\n        self.train_loss = []\n        self.loss_val = []\n\n    def create_data_loaders(self):\n        dataset = PandaDataset(config.train_csv, transform=self.transforms)\n\n        train_size = int(0.8 * len(dataset))\n        test_size = len(dataset) - train_size\n        train_dataset, valid_dataset = random_split(dataset, [train_size, test_size])\n\n        image_datasets = {\n            'train': train_dataset,\n            'validation': valid_dataset\n        }\n\n        return image_datasets","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"%%writefile train.py\n\n# torch imports\nimport torch\nimport torch.optim as optim\nimport torchvision\nimport torch.nn as nn\nfrom torch.optim.lr_scheduler import CyclicLR\n\n# skorch imports\nfrom skorch import NeuralNetClassifier\nfrom skorch.callbacks import LRScheduler, Checkpoint, Freezer\nfrom skorch.helper import predefined_split\n\nfrom engine import Engine\nfrom data import PandaDataset\nimport config\n\nclass PretrainedModel(nn.Module):\n    def __init__(self, output_features):\n        super().__init__()\n        model = torchvision.models.densenet121(pretrained=True)\n        num_ftrs = model.classifier.in_features\n        model.classifier = nn.Linear(num_ftrs, output_features)\n        self.model = model\n\n    def forward(self, x):\n        return self.model(x)\n\n# print(PretrainedModel(6))\n# exit(0)\ndatasets = Engine().create_data_loaders()\n\nlrscheduler = LRScheduler(\n    policy='StepLR',\n    step_size=7,\n    gamma=0.1\n)\n\ncheckpoint = Checkpoint(\n    f_params='densenet_skorch.pt',\n    monitor='valid_acc_best'\n)\n\nfreezer = Freezer(lambda x: not x.startswith('model.classifier'))\n\nnet = NeuralNetClassifier(\n    PretrainedModel,\n    criterion=nn.CrossEntropyLoss,\n    batch_size=config.batch_size,\n    max_epochs=5,\n    module__output_features=6,\n    optimizer=optim.SGD,\n    iterator_train__shuffle=True,\n    iterator_train__num_workers=4,\n    iterator_valid__shuffle=True,\n    iterator_valid__num_workers=4,\n    train_split=predefined_split(datasets['validation']),\n    callbacks=[lrscheduler, checkpoint, freezer],\n    device='cuda'  # comment to train on cpu\n)\n\n\n#start training\nnet.fit(datasets['train'], y=None)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!python train.py\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","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}