{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import os\nimport cv2\nimport glob\nimport torch\nimport shutil\nimport itertools\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nfrom pathlib import Path\nfrom keras.models import Sequential\nfrom keras.layers import Dense, Conv2D, MaxPooling2D, Flatten, Dropout\nfrom torch import nn\nfrom torch.optim import Adam\nfrom torch.nn import functional as F\nfrom torch.utils.data import DataLoader\nfrom torchvision import transforms, models, datasets\nfrom sklearn.model_selection import train_test_split","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_path = '../input/siim-isic-melanoma-classification/jpeg/train'\ntest_path = '../input/siim-isic-melanoma-classification/jpeg/test'\nnew_train = '/kaggle/working/train/train'\nnew_test = '/kaggle/working/test/test'\n\nos.mkdir('/kaggle/working/train')\nos.mkdir('/kaggle/working/test')\n\nos.mkdir('/kaggle/working/train/benign')\nos.mkdir('/kaggle/working/train/malignant')\nos.mkdir('/kaggle/working/test/benign')\nos.mkdir('/kaggle/working/test/malignant')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_csv = pd.read_csv('../input/siim-isic-melanoma-classification/train.csv')[1:].reset_index(drop=True)\ntest_csv = pd.read_csv('../input/siim-isic-melanoma-classification/test.csv')\n\nbenign = list(train_csv['image_name'][[j for i, j in zip(list(train_csv['target']), \n                                                         range(len(train_csv))) if i == 1][:400]])\nmalignant = list(train_csv['image_name'][[j for i, j in zip(list(train_csv['target']), \n                                                         range(len(train_csv))) if i == 0][:400]])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X = np.array([malignant, benign]).reshape(1, -1)[0]\n\ntrain_malignant = X[:300]\ntest_malignant = X[300:400]\ntrain_benign = X[400:700]\ntest_benign = X[700:]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"main_path = '../input/siim-isic-melanoma-classification/jpeg/train'\n\nfor i in [['/train/malignant', train_malignant], ['/test/malignant', test_malignant],\n          ['/train/benign', train_benign], ['/test/benign', test_benign]]:\n    path = i[0]\n    new_dataset = i[1]\n    dataset = glob.iglob(os.path.join(main_path, '*.jpg'))\n    \n    for img in dataset:\n        if img[54:-4] in new_dataset:\n            shutil.copy(img, '/kaggle/working'+path)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"normalizer = transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.25, 0.25, 0.25])\n\ndata_transforms = {\n    'train': transforms.Compose([\n        transforms.Resize((244, 244)),\n        transforms.ColorJitter(),\n        transforms.Pad(4),\n        transforms.RandomAffine(49),\n        transforms.ToTensor(),\n        normalizer\n    ]),\n    \n    'test': transforms.Compose([\n        transforms.Resize((244, 244)),\n        transforms.ToTensor(),\n        normalizer\n    ])\n}","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data_images = {\n    'train': datasets.ImageFolder('/kaggle/working/train', data_transforms['train']),\n    'test': datasets.ImageFolder('/kaggle/working/test', data_transforms['test']),\n}","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data_loaders = {\n    'train': DataLoader(data_images['train'], batch_size=32, shuffle=True, num_workers=0),\n    'test': DataLoader(data_images['test'], batch_size=32, shuffle=True, num_workers=0),\n}","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"device = torch.device('cuda:0' if torch.cuda.is_available() 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","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.fc = nn.Sequential(\n    nn.Linear(2048, 128),\n    nn.ReLU(inplace=True),\n    nn.Linear(128, 2),\n).to(device)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"optimizer = Adam(model.fc.parameters())\ncriterion = nn.CrossEntropyLoss()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def train_model(epochs, optimizer, criterion, model):\n    for epoch in range(epochs):\n        for phase in ['train', 'test']:\n            if phase == 'train':\n                model.train()\n            else:\n                model.eval()\n\n            running_loss, running_corrects = 0.0, 0\n\n            for inputs, labels in data_loaders[phase]:\n                inputs = inputs.to(device)\n                labels = labels.to(device)\n\n                outputs = model(inputs)\n                loss = criterion(outputs, labels)\n\n                if phase == 'train':\n                    optimizer.zero_grad()\n                    loss.backward()\n                    optimizer.step()\n\n                _, preds = torch.max(outputs, 1)\n                running_loss += loss.item() * inputs.size(0)\n                running_corrects += torch.sum(preds == labels.data)\n\n            epoch_loss = running_loss / len(data_images[phase])\n            epoch_acc = running_corrects.double() / len(data_images[phase])\n\n        print('Epoch', str(epoch+1) + '/' + str(epochs), 'loss:', epoch_loss, 'accuracy:', epoch_acc)\n    return model","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = train_model(3, optimizer, criterion, model)","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}