У меня есть папка поезда и тестовая папка с изображениями, но я бы хотел добавить набор проверки с использованием 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 по сравнению с другими в Интернете, я не вижу никаких выдающихся ошибок. Что происходит с моим кодом?