создание поезда и тестового загрузчика данных

#python #pytorch #dataset #dataloader

#python #pytorch #набор данных #загрузчик данных

Вопрос:

На самом деле у меня есть каталог RealPhotos , содержащий 17000 jpg фотографий. Мне было бы интересно создать загрузчик данных поезда и загрузчик тестовых данных

 ls RealPhotos/
2007_000027.jpg  2008_007119.jpg  2010_001501.jpg  2011_002987.jpg
2007_000032.jpg  2008_007120.jpg  2010_001502.jpg  2011_002988.jpg
2007_000033.jpg  2008_007123.jpg  2010_001503.jpg  2011_002992.jpg
2007_000039.jpg  2008_007124.jpg  2010_001505.jpg  2011_002993.jpg
2007_000042.jpg  2008_007129.jpg  2010_001511.jpg  2011_002994.jpg
2007_000061.jpg  2008_007130.jpg  2010_001514.jpg  2011_002996.jpg
2007_000063.jpg  2008_007131.jpg  2010_001515.jpg  2011_002997.jpg
2007_000068.jpg  2008_007133.jpg  2010_001516.jpg  2011_002999.jpg
2007_000121.jpg  2008_007134.jpg  2010_001518.jpg  2011_003002.jpg
2007_000123.jpg  2008_007138.jpg  2010_001520.jpg  2011_003003.jpg
...
 

Я знаю, что могу подклассифицировать TensorDataset, чтобы сделать его совместимым с немаркированными данными с

 class UnlabeledTensorDataset(TensorDataset):
    """Dataset wrapping unlabeled data tensors.
    
    Each sample will be retrieved by indexing tensors along the first
    dimension.
    
    Arguments:
        data_tensor (Tensor): contains sample data.
    """
    def __init__(self, data_tensor):
        self.data_tensor = data_tensor
    
    def __getitem__(self, index):
        return self.data_tensor[index]
 

И что-то в этом роде для обучения автоэнкодера

 X_train     = rnd.random((300,100))
train       = UnlabeledTensorDataset(torch.from_numpy(X_train).float())
train_loader= data_utils.DataLoader(train, batch_size=1)

for epoch in range(50):
    for batch in train_loader:
        data = Variable(batch)
        optimizer.zero_grad()
        output = model(data)
        loss = criterion(output, data)
 

Комментарии:

1. Вы хотите ArtificialPhotos быть в наборе поездов и RealPhotos быть в тестовом наборе?

2. @Ivan Извините, за то время, пока вы создавали ответ, я изменил свой вопрос. Не удаляйте то, что вы только что написали в своем ответе, а вместо этого отредактируйте его.

3. Итак, по сути, вы хотите разделить свои данные и создать два загрузчика?

4. Да, часть фотографий будет использоваться для тестирования автоэнкодера, а другая часть будет использоваться для обучения автоэнкодера.

5. @Ivan Просто из любопытства, есть ли что-нибудь, что вам нужно изменить в своем ответе?

Ответ №1:

Сначала вам нужно определить Dataset ( torch.utils.data.Dataset ), затем вы можете использовать DataLoader для него. Нет никакой разницы между вашим поездом и тестовым набором данных, вы можете определить общий набор данных, который будет просматривать конкретный каталог и сопоставлять каждый индекс с уникальным файлом.

 class MyDataset(Dataset):
    def __init__(self, directory):
        self.files = os.listdir(directory)

    def __getitem__(self, index):
        img = Image.open(self.files[index]).convert('RGB')
        return T.ToTensor()(img)
 

Откуда T ссылается torchvision.transform и импортируется изображение PIL .

Затем вы можете создать экземпляр набора данных с помощью

 data_set = MyDataset('./RealPhotos')
 

Оттуда вы можете использовать torch.utils.data.random_split для выполнения разделения:

 train_len = int(len(data_set)*0.7)
train_set, test_set = random_split(data_set, [train_len, data_set - train_len])
 

Затем используйте torch.utils.data.DataLoader , как вы делали:

 train_loader = DataLoader(train_set, batch_size=1, shuffle=True)
test_loader = DataLoader(test_set, batch_size=16, shuffle=False)
 

Комментарии:

1. Я предпочитаю первый ответ, который вы мне даете, потому что вы указали способ получить доступ к файлу в каталоге. Объединение этого ответа с первым было бы потрясающим

2. Я бы хотел поднять вопрос, но моя оценка слишком низкая. Спасибо за ответ!

3. Не беспокойтесь, увидимся в следующий раз 😉