2019-11-13 11:45:05 -05:00
|
|
|
import torch
|
|
|
|
from torch.utils.data import SubsetRandomSampler
|
|
|
|
import torchvision
|
|
|
|
|
|
|
|
BATCH_SIZE = 300
|
2020-01-17 15:12:28 -05:00
|
|
|
TEST_SIZE = 300
|
|
|
|
#TEST_SIZE = 10000 #legerement +Rapide / + Consomation memoire !
|
2019-11-13 11:45:05 -05:00
|
|
|
|
2020-01-20 11:05:40 -05:00
|
|
|
download_data=False
|
2020-01-20 17:09:31 -05:00
|
|
|
num_workers=2 #4
|
2020-01-20 11:05:40 -05:00
|
|
|
pin_memory=False #True :+ GPU memory / + Lent
|
|
|
|
|
2019-11-13 11:45:05 -05:00
|
|
|
#ATTENTION : Dataug (Kornia) Expect image in the range of [0, 1]
|
|
|
|
#transform_train = torchvision.transforms.Compose([
|
|
|
|
# torchvision.transforms.RandomHorizontalFlip(),
|
|
|
|
# torchvision.transforms.ToTensor(),
|
2020-01-20 17:09:31 -05:00
|
|
|
# torchvision.transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)), #CIFAR10
|
2019-11-13 11:45:05 -05:00
|
|
|
#])
|
|
|
|
transform = torchvision.transforms.Compose([
|
|
|
|
torchvision.transforms.ToTensor(),
|
|
|
|
#torchvision.transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)), #CIFAR10
|
|
|
|
])
|
2020-01-20 17:09:31 -05:00
|
|
|
|
|
|
|
#data_train = torchvision.datasets.MNIST(
|
|
|
|
# "./data", train=True, download=True,
|
|
|
|
# transform=torchvision.transforms.Compose([
|
|
|
|
# #torchvision.transforms.RandomAffine(degrees=180, translate=None, scale=None, shear=None, resample=False, fillcolor=0),
|
|
|
|
# torchvision.transforms.ToTensor()
|
|
|
|
# ])
|
|
|
|
#)
|
2019-11-13 11:45:05 -05:00
|
|
|
data_test = torchvision.datasets.MNIST(
|
|
|
|
"./data", train=False, download=True, transform=torchvision.transforms.ToTensor()
|
|
|
|
)
|
2020-01-20 17:09:31 -05:00
|
|
|
|
2019-12-02 06:37:19 -05:00
|
|
|
|
|
|
|
from torchvision.datasets.vision import VisionDataset
|
|
|
|
from PIL import Image
|
|
|
|
import augmentation_transforms
|
|
|
|
import numpy as np
|
|
|
|
|
|
|
|
class AugmentedDataset(VisionDataset):
|
2019-12-04 12:28:32 -05:00
|
|
|
def __init__(self, root, train=True, transform=None, target_transform=None, download=False, subset=None):
|
2019-12-02 06:37:19 -05:00
|
|
|
|
|
|
|
super(AugmentedDataset, self).__init__(root, transform=transform, target_transform=target_transform)
|
|
|
|
|
|
|
|
supervised_dataset = torchvision.datasets.CIFAR10(root, train=train, download=download, transform=transform)
|
|
|
|
|
2019-12-04 12:28:32 -05:00
|
|
|
self.sup_data = supervised_dataset.data if not subset else supervised_dataset.data[subset[0]:subset[1]]
|
|
|
|
self.sup_targets = supervised_dataset.targets if not subset else supervised_dataset.targets[subset[0]:subset[1]]
|
|
|
|
assert len(self.sup_data)==len(self.sup_targets)
|
2019-12-02 06:37:19 -05:00
|
|
|
|
|
|
|
for idx, img in enumerate(self.sup_data):
|
|
|
|
self.sup_data[idx]= Image.fromarray(img) #to PIL Image
|
|
|
|
|
|
|
|
self.unsup_data=[]
|
|
|
|
self.unsup_targets=[]
|
|
|
|
|
|
|
|
self.data= self.sup_data
|
|
|
|
self.targets= self.sup_targets
|
|
|
|
|
2019-12-04 12:28:32 -05:00
|
|
|
self.dataset_info= {
|
|
|
|
'name': 'CIFAR10',
|
|
|
|
'sup': len(self.sup_data),
|
|
|
|
'unsup': len(self.unsup_data),
|
|
|
|
'length': len(self.sup_data)+len(self.unsup_data),
|
|
|
|
}
|
|
|
|
|
2019-12-02 06:37:19 -05:00
|
|
|
|
|
|
|
self._TF = [
|
2019-12-04 16:34:02 -05:00
|
|
|
## Geometric TF ##
|
|
|
|
'Rotate',
|
2019-12-04 12:58:11 -05:00
|
|
|
'TranslateX',
|
|
|
|
'TranslateY',
|
2019-12-04 16:34:02 -05:00
|
|
|
'ShearX',
|
2019-12-04 12:58:11 -05:00
|
|
|
'ShearY',
|
2019-12-04 16:34:02 -05:00
|
|
|
|
|
|
|
'Cutout',
|
|
|
|
|
|
|
|
## Color TF ##
|
2019-12-04 12:58:11 -05:00
|
|
|
'Contrast',
|
|
|
|
'Color',
|
2019-12-04 16:34:02 -05:00
|
|
|
'Brightness',
|
|
|
|
'Sharpness',
|
|
|
|
#'Posterize',
|
|
|
|
#'Solarize',
|
|
|
|
|
|
|
|
'Invert',
|
|
|
|
'AutoContrast',
|
|
|
|
'Equalize',
|
2019-12-04 12:28:32 -05:00
|
|
|
]
|
2019-12-02 06:37:19 -05:00
|
|
|
self._op_list =[]
|
|
|
|
self.prob=0.5
|
|
|
|
for tf in self._TF:
|
|
|
|
for mag in range(1, 10):
|
|
|
|
self._op_list+=[(tf, self.prob, mag)]
|
|
|
|
self._nb_op = len(self._op_list)
|
|
|
|
|
|
|
|
def __getitem__(self, index):
|
|
|
|
"""
|
|
|
|
Args:
|
|
|
|
index (int): Index
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
tuple: (image, target) where target is index of the target class.
|
|
|
|
"""
|
|
|
|
img, target = self.data[index], self.targets[index]
|
|
|
|
|
|
|
|
# doing this so that it is consistent with all other datasets
|
|
|
|
# to return a PIL Image
|
|
|
|
#img = Image.fromarray(img)
|
|
|
|
|
|
|
|
if self.transform is not None:
|
|
|
|
img = self.transform(img)
|
|
|
|
|
|
|
|
if self.target_transform is not None:
|
|
|
|
target = self.target_transform(target)
|
|
|
|
|
|
|
|
return img, target
|
|
|
|
|
|
|
|
def augement_data(self, aug_copy=1):
|
|
|
|
|
|
|
|
policies = []
|
|
|
|
for op_1 in self._op_list:
|
|
|
|
for op_2 in self._op_list:
|
|
|
|
policies += [[op_1, op_2]]
|
|
|
|
|
|
|
|
for idx, image in enumerate(self.sup_data):
|
2019-12-04 12:28:32 -05:00
|
|
|
if (idx/self.dataset_info['sup'])%0.2==0: print("Augmenting data... ", idx,"/", self.dataset_info['sup'])
|
2019-12-04 16:34:02 -05:00
|
|
|
#if idx==10000:break
|
2019-12-04 12:28:32 -05:00
|
|
|
|
2019-12-02 06:37:19 -05:00
|
|
|
for _ in range(aug_copy):
|
|
|
|
chosen_policy = policies[np.random.choice(len(policies))]
|
2019-12-04 12:58:11 -05:00
|
|
|
aug_image = augmentation_transforms.apply_policy(chosen_policy, image, use_mean_std=False) #Cast en float image
|
2019-12-02 06:37:19 -05:00
|
|
|
#aug_image = augmentation_transforms.cutout_numpy(aug_image)
|
|
|
|
|
2019-12-04 14:48:11 -05:00
|
|
|
self.unsup_data+=[(aug_image*255.).astype(self.sup_data.dtype)]#Cast float image to uint8
|
2019-12-02 06:37:19 -05:00
|
|
|
self.unsup_targets+=[self.sup_targets[idx]]
|
|
|
|
|
2019-12-04 14:48:11 -05:00
|
|
|
#self.unsup_data=(np.array(self.unsup_data)*255.).astype(self.sup_data.dtype) #Cast float image to uint8
|
|
|
|
self.unsup_data=np.array(self.unsup_data)
|
2019-12-02 06:37:19 -05:00
|
|
|
self.data= np.concatenate((self.sup_data, self.unsup_data), axis=0)
|
2019-12-04 12:28:32 -05:00
|
|
|
self.targets= np.concatenate((self.sup_targets, self.unsup_targets), axis=0)
|
2019-12-02 06:37:19 -05:00
|
|
|
|
2019-12-04 12:28:32 -05:00
|
|
|
assert len(self.unsup_data)==len(self.unsup_targets)
|
|
|
|
assert len(self.data)==len(self.targets)
|
|
|
|
self.dataset_info['unsup']=len(self.unsup_data)
|
|
|
|
self.dataset_info['length']=self.dataset_info['sup']+self.dataset_info['unsup']
|
2019-12-02 06:37:19 -05:00
|
|
|
|
|
|
|
def len_supervised(self):
|
2019-12-04 12:28:32 -05:00
|
|
|
return self.dataset_info['sup']
|
2019-12-02 06:37:19 -05:00
|
|
|
|
|
|
|
def len_unsupervised(self):
|
2019-12-04 12:28:32 -05:00
|
|
|
return self.dataset_info['unsup']
|
2019-12-02 06:37:19 -05:00
|
|
|
|
|
|
|
def __len__(self):
|
2019-12-04 12:28:32 -05:00
|
|
|
return self.dataset_info['length']
|
2019-12-02 06:37:19 -05:00
|
|
|
|
2019-12-04 12:28:32 -05:00
|
|
|
def __str__(self):
|
2019-12-04 12:58:11 -05:00
|
|
|
return "CIFAR10(Sup:{}-Unsup:{}-{}TF)".format(self.dataset_info['sup'], self.dataset_info['unsup'], len(self._TF))
|
2019-12-02 06:37:19 -05:00
|
|
|
|
2019-12-09 10:46:53 -05:00
|
|
|
class AugmentedDatasetV2(VisionDataset):
|
|
|
|
def __init__(self, root, train=True, transform=None, target_transform=None, download=False, subset=None):
|
|
|
|
|
|
|
|
super(AugmentedDatasetV2, self).__init__(root, transform=transform, target_transform=target_transform)
|
|
|
|
|
|
|
|
supervised_dataset = torchvision.datasets.CIFAR10(root, train=train, download=download, transform=transform)
|
|
|
|
|
|
|
|
self.sup_data = supervised_dataset.data if not subset else supervised_dataset.data[subset[0]:subset[1]]
|
|
|
|
self.sup_targets = supervised_dataset.targets if not subset else supervised_dataset.targets[subset[0]:subset[1]]
|
|
|
|
assert len(self.sup_data)==len(self.sup_targets)
|
|
|
|
|
|
|
|
for idx, img in enumerate(self.sup_data):
|
|
|
|
self.sup_data[idx]= Image.fromarray(img) #to PIL Image
|
|
|
|
|
|
|
|
self.unsup_data=[]
|
|
|
|
self.unsup_targets=[]
|
|
|
|
self.origin_idx=[]
|
|
|
|
|
|
|
|
self.dataset_info= {
|
|
|
|
'name': 'CIFAR10',
|
|
|
|
'sup': len(self.sup_data),
|
|
|
|
'unsup': len(self.unsup_data),
|
|
|
|
'length': len(self.sup_data)+len(self.unsup_data),
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
self._TF = [
|
|
|
|
## Geometric TF ##
|
|
|
|
'Rotate',
|
|
|
|
'TranslateX',
|
|
|
|
'TranslateY',
|
|
|
|
'ShearX',
|
|
|
|
'ShearY',
|
|
|
|
|
|
|
|
'Cutout',
|
|
|
|
|
|
|
|
## Color TF ##
|
|
|
|
'Contrast',
|
|
|
|
'Color',
|
|
|
|
'Brightness',
|
|
|
|
'Sharpness',
|
2019-12-09 13:49:24 -05:00
|
|
|
'Posterize',
|
|
|
|
'Solarize',
|
2019-12-09 10:46:53 -05:00
|
|
|
|
|
|
|
'Invert',
|
|
|
|
'AutoContrast',
|
|
|
|
'Equalize',
|
|
|
|
]
|
|
|
|
self._op_list =[]
|
|
|
|
self.prob=0.5
|
2019-12-09 13:49:24 -05:00
|
|
|
self.mag_range=(1, 10)
|
2019-12-09 10:46:53 -05:00
|
|
|
for tf in self._TF:
|
2019-12-09 13:49:24 -05:00
|
|
|
for mag in range(self.mag_range[0], self.mag_range[1]):
|
2019-12-09 10:46:53 -05:00
|
|
|
self._op_list+=[(tf, self.prob, mag)]
|
|
|
|
self._nb_op = len(self._op_list)
|
|
|
|
|
|
|
|
def __getitem__(self, index):
|
|
|
|
"""
|
|
|
|
Args:
|
|
|
|
index (int): Index
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
tuple: (image, target) where target is index of the target class.
|
|
|
|
"""
|
|
|
|
aug_img, origin_img, target = self.unsup_data[index], self.sup_data[self.origin_idx[index]], self.unsup_targets[index]
|
|
|
|
|
|
|
|
# doing this so that it is consistent with all other datasets
|
|
|
|
# to return a PIL Image
|
|
|
|
#img = Image.fromarray(img)
|
|
|
|
|
|
|
|
if self.transform is not None:
|
|
|
|
aug_img = self.transform(aug_img)
|
|
|
|
origin_img = self.transform(origin_img)
|
|
|
|
|
|
|
|
if self.target_transform is not None:
|
|
|
|
target = self.target_transform(target)
|
|
|
|
|
|
|
|
return aug_img, origin_img, target
|
|
|
|
|
|
|
|
def augement_data(self, aug_copy=1):
|
|
|
|
|
|
|
|
policies = []
|
|
|
|
for op_1 in self._op_list:
|
|
|
|
for op_2 in self._op_list:
|
|
|
|
policies += [[op_1, op_2]]
|
|
|
|
|
|
|
|
for idx, image in enumerate(self.sup_data):
|
|
|
|
if idx%(self.dataset_info['sup']/5)==0: print("Augmenting data... ", idx,"/", self.dataset_info['sup'])
|
|
|
|
#if idx==10000:break
|
|
|
|
|
|
|
|
for _ in range(aug_copy):
|
|
|
|
chosen_policy = policies[np.random.choice(len(policies))]
|
|
|
|
aug_image = augmentation_transforms.apply_policy(chosen_policy, image, use_mean_std=False) #Cast en float image
|
|
|
|
#aug_image = augmentation_transforms.cutout_numpy(aug_image)
|
|
|
|
|
|
|
|
self.unsup_data+=[(aug_image*255.).astype(self.sup_data.dtype)]#Cast float image to uint8
|
|
|
|
self.unsup_targets+=[self.sup_targets[idx]]
|
|
|
|
self.origin_idx+=[idx]
|
|
|
|
|
|
|
|
#self.unsup_data=(np.array(self.unsup_data)*255.).astype(self.sup_data.dtype) #Cast float image to uint8
|
|
|
|
self.unsup_data=np.array(self.unsup_data)
|
|
|
|
|
|
|
|
assert len(self.unsup_data)==len(self.unsup_targets)
|
|
|
|
|
|
|
|
self.dataset_info['unsup']=len(self.unsup_data)
|
|
|
|
self.dataset_info['length']=self.dataset_info['sup']+self.dataset_info['unsup']
|
|
|
|
|
|
|
|
|
|
|
|
def __len__(self):
|
|
|
|
return self.dataset_info['unsup']#self.dataset_info['length']
|
|
|
|
|
|
|
|
def __str__(self):
|
2019-12-09 13:49:24 -05:00
|
|
|
return "CIFAR10(Sup:{}-Unsup:{}-{}TF(Mag{}-{}))".format(self.dataset_info['sup'], self.dataset_info['unsup'], len(self._TF), self.mag_range[0], self.mag_range[1])
|
2019-12-09 10:46:53 -05:00
|
|
|
|
|
|
|
|
2019-12-04 12:28:32 -05:00
|
|
|
### Classic Dataset ###
|
2019-12-04 12:58:11 -05:00
|
|
|
data_train = torchvision.datasets.CIFAR10("./data", train=True, download=download_data, transform=transform)
|
|
|
|
#data_val = torchvision.datasets.CIFAR10("./data", train=True, download=download_data, transform=transform)
|
|
|
|
data_test = torchvision.datasets.CIFAR10("./data", train=False, download=download_data, transform=transform)
|
2019-12-04 12:28:32 -05:00
|
|
|
|
|
|
|
|
2019-11-20 16:06:27 -05:00
|
|
|
train_subset_indices=range(int(len(data_train)/2))
|
2019-11-13 11:45:05 -05:00
|
|
|
val_subset_indices=range(int(len(data_train)/2),len(data_train))
|
2019-11-21 12:29:17 -05:00
|
|
|
#train_subset_indices=range(BATCH_SIZE*10)
|
|
|
|
#val_subset_indices=range(BATCH_SIZE*10, BATCH_SIZE*20)
|
2020-01-10 13:21:34 -05:00
|
|
|
dl_train = torch.utils.data.DataLoader(data_train, batch_size=BATCH_SIZE, shuffle=False, sampler=SubsetRandomSampler(train_subset_indices), num_workers=num_workers, pin_memory=pin_memory)
|
2019-12-04 12:28:32 -05:00
|
|
|
|
|
|
|
### Augmented Dataset ###
|
2019-12-04 14:48:11 -05:00
|
|
|
#data_train_aug = AugmentedDataset("./data", train=True, download=download_data, transform=transform, subset=(0,int(len(data_train)/2)))
|
|
|
|
#data_train_aug.augement_data(aug_copy=10)
|
|
|
|
#print(data_train_aug)
|
2020-01-10 13:21:34 -05:00
|
|
|
#dl_train = torch.utils.data.DataLoader(data_train_aug, batch_size=BATCH_SIZE, shuffle=True, num_workers=num_workers, pin_memory=pin_memory)
|
2019-12-04 12:28:32 -05:00
|
|
|
|
|
|
|
|
2020-01-10 13:21:34 -05:00
|
|
|
dl_val = torch.utils.data.DataLoader(data_train, batch_size=BATCH_SIZE, shuffle=False, sampler=SubsetRandomSampler(val_subset_indices), num_workers=num_workers, pin_memory=pin_memory)
|
|
|
|
dl_test = torch.utils.data.DataLoader(data_test, batch_size=TEST_SIZE, shuffle=False, num_workers=num_workers, pin_memory=pin_memory)
|