SubsetRandomSampler для разделения набора поездов на набор поездов / валов стирает точки данных и устанавливает тензоры в 0 - PullRequest
0 голосов
/ 01 марта 2020

У меня есть папка поезда и тестовая папка с изображениями, но я бы хотел добавить набор проверки с использованием SubsetRandomSampler. Изображения в папке поезда организованы в стандартном формате ImageFolder:

  • train / class_1 / class_1_000.jpg

Я попытался создать отдельный действительный набор данных с помощью SubsetRandomSampler, используя этот код:

batch_size = 20
num_workers = 0
valid_size = 0.2

train_size = len(os.listdir(train_folder))
#print(train_size)
indices = list(range(train_size))
#print(indices)
np.random.shuffle(indices)
split = int(np.floor(valid_size * train_size))
train_idx, valid_idx = indices[split:], indices[:split]

train_sampler = SubsetRandomSampler(train_idx)
valid_sampler = SubsetRandomSampler(valid_idx)

class_to_idx = {classes[i]: i for i in range(len(classes))}
#print(class_to_idx)

training_transform = torchvision.transforms.Compose([
          transforms.RandomRotation(75),
          transforms.Resize(256),
          transforms.CenterCrop(224),
          transforms.RandomHorizontalFlip(p=0.5),
          #transforms.ColorJitter(brightness = 2, contrast = 0.5, saturation = 0.5),
          transforms.ToTensor(),
          transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])


test_transform = torchvision.transforms.Compose([
          transforms.Resize(256),
          transforms.CenterCrop(224),
          transforms.ToTensor(),
          transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])


train_data = torchvision.datasets.ImageFolder(train_folder, transform=training_transform)
train_data_loader = data.DataLoader(train_data, batch_size=batch_size, sampler= train_sampler , num_workers=num_workers)

for step, (tx, ty) in enumerate(train_data_loader, 0):
  print('---train_set_tensors---', tx.shape, ty)

valid_data = torchvision.datasets.ImageFolder(train_folder, transform= test_transform)
valid_data_loader = data.DataLoader(valid_data, batch_size=batch_size, sampler = valid_sampler, num_workers= num_workers)

for step, (tx, ty) in enumerate(valid_data_loader, 0):
  print('---valid_set_tensors---', tx.shape, ty)

test_data = torchvision.datasets.ImageFolder(test_folder, transform = test_transform)
test_data_loader = data.DataLoader(test_data, batch_size=batch_size, shuffle=True, num_workers= num_workers)
print('Test image information: ', test_data)
#for step, (tx, ty) in enumerate(test_data_loader, 0):
#  print('---test_set_tensors---', tx.shape, ty)

Когда я использую for step, (tx, ty) in enumerate(train_data_loader, 0): print('---train_set_tensors---', tx.shape, ty), я могу исследовать структуру каждого отдельного тензора. Когда я не использую SubsetRandomSampler и вообще не удаляю набор проверки, я получаю выходные данные каждого отдельного тензора из набора поездов (75 750). Однако при добавлении SubsetRandomSampler / с использованием предыдущего кода я получаю этот вывод. Всего 0, и почти никакого вывода:

Train image information:  Dataset ImageFolder
    Number of datapoints: 75750
    Root location: food-101/train
    StandardTransform
Transform: Compose(
               RandomRotation(degrees=(-75, 75), resample=False, expand=False)
               Resize(size=256, interpolation=PIL.Image.BILINEAR)
               CenterCrop(size=(224, 224))
               RandomHorizontalFlip(p=0.5)
               ToTensor()
               Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
           )
---train_set_tensors--- torch.Size([20, 3, 224, 224]) tensor([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
---train_set_tensors--- torch.Size([20, 3, 224, 224]) tensor([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
---train_set_tensors--- torch.Size([20, 3, 224, 224]) tensor([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
---train_set_tensors--- torch.Size([20, 3, 224, 224]) tensor([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
---train_set_tensors--- torch.Size([1, 3, 224, 224]) tensor([0])

Valid image information:  Dataset ImageFolder
    Number of datapoints: 75750
    Root location: food-101/train
    StandardTransform
Transform: Compose(
               Resize(size=256, interpolation=PIL.Image.BILINEAR)
               CenterCrop(size=(224, 224))
               ToTensor()
               Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
           )
---valid_set_tensors--- torch.Size([20, 3, 224, 224]) tensor([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

Что-то не работает ... во-первых, количество точек данных в тестовом и действительном наборах данных одинаково, чего не должно быть. Кажется, что информация не загружается, все несколько тензорных выходов, которые на самом деле появляются, равны нулю. Когда я проверяю свой код для SubsetRandomSampler по сравнению с другими в Интернете, я не вижу никаких выдающихся ошибок. Что происходит с моим кодом?

...