{"cells":[{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"#import custom_models\n\n#python packages\nfrom PIL import Image\nfrom tqdm.notebook import tqdm\n#from tqdm import tqdm\nimport gc\nimport datetime\nimport os\nimport copy\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport time\nfrom skimage import io\n#torch\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torch.optim as optim\nfrom torch.utils.data import Dataset, DataLoader, random_split\n#torchvision\nimport torchvision\nfrom torchvision import datasets, models, transforms\nprint(\"PyTorch Version: \",torch.__version__)\nprint(\"Torchvision Version: \",torchvision.__version__)\n# Detect if we have a GPU available\ndevice = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\nif torch.cuda.is_available():\n    print(\"Using GPU!\")\nelse:\n    print(\"WARNING: Could not find GPU! Using CPU only\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class MultimodalDataset(Dataset):\n    \"\"\"\n    Custom dataset definition\n    \"\"\"\n    def __init__(self, csv_path, img_path, transform=None):\n        \"\"\"\n        \"\"\"\n        self.df = pd.read_csv(csv_path)\n        self.img_path = img_path\n        self.transform = transform\n        \n            \n    def __getitem__(self, index):\n        \"\"\"\n        \"\"\"\n        img_name = self.df.iloc[index][\"image_name\"] \n        img_path = os.path.join(self.img_path, img_name)\n        image = Image.open(img_path)\n        image = image.convert(\"RGB\")\n        image = np.asarray(image)\n        if self.transform is not None:\n            image = self.transform(image)\n            \n        dtype = torch.cuda.FloatTensor if torch.cuda.is_available() else torch.FloatTensor # ???\n        features = np.fromstring(self.df.iloc[index][\"features\"][1:-1], sep=\",\") #turns features into an array\n        features = torch.from_numpy(features.astype(\"float\")) #turns the features array into a vector\n        #label = int(self.df.iloc[index]['label'])\n        labels = torch.tensor(list(self.df.iloc[index][\"target\"]), dtype = torch.float64)\n        #print(\"Label type: \", type(label))\n        #label = np.int_(label) #???\n        #print(\"label type post casting: \", type(label))\n        return image, features, labels\n        \n    def __len__(self):\n        return len(self.df)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def get_dataloaders(input_size, batch_size, augment=False, shuffle = True):\n    # How to transform the image when you are loading them.\n    # you'll likely want to mess with the transforms on the training set.\n    \n    # For now, we resize/crop the image to the correct input size for our network,\n    # then convert it to a [C,H,W] tensor, then normalize it to values with a given mean/stdev. These normalization constants\n    # are derived from aggregating lots of data and happen to produce better results.\n    data_transforms = {\n        'train': transforms.Compose([\n            transforms.ToPILImage(),\n            transforms.Resize(input_size),\n            transforms.CenterCrop(input_size),\n            #Add extra transformations for data augmentation\n            transforms.RandomApply([\n                transforms.RandomChoice([\n                    transforms.RandomAffine(degrees=20),\n                    transforms.RandomAffine(degrees=0,scale=(0.1, 0.15)),\n                    transforms.RandomAffine(degrees=0,translate=(0.2,0.2)),\n                    #transforms.RandomAffine(degrees=0,shear=0.15),\n                    transforms.RandomHorizontalFlip(p=1.0)\n                ] if augment else [transforms.RandomAffine(degrees=0)])#else do nothing\n            ], p=0.5),\n            transforms.ToTensor(),\n            transforms.Normalize([0.5], [0.225])\n        ]),\n        #'val': transforms.Compose([\n            #transforms.ToPILImage(),\n            #transforms.Resize(input_size),\n            #transforms.CenterCrop(input_size),\n            #transforms.ToTensor(),\n            #transforms.Normalize([0.5], [0.225])\n        #]),\n        'test': transforms.Compose([\n            transforms.ToPILImage(),\n            transforms.Resize(input_size),\n            transforms.CenterCrop(input_size),\n            transforms.ToTensor(),\n            transforms.Normalize([0.5], [0.225])\n        ])\n    }\n    # Create training and validation datasets\n    data_subsets = {x: MultimodalDataset(csv_path=\"../input/melanoma/features_\"+x+\".csv\", \n                                         img_path=\"../input/siim-isic-melanoma-classification/jpeg/\"+x, \n                                         transform=data_transforms[x]) for x in data_transforms.keys()}\n    # Create training and validation dataloaders\n    # Never shuffle the test set\n    dataloaders_dict = {x: DataLoader(data_subsets[x], batch_size=batch_size, shuffle=False if x != 'train' else shuffle, num_workers=4) for x in data_transforms.keys()}\n    return dataloaders_dict","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"shuffle_datasets = True\ndataloaders = get_dataloaders(224, 64, shuffle_datasets)\ndataloaders","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}