Вопрос или проблема
Я хочу выполнить следующую задачу в PyTorch –
У меня есть набор данных COCO, где каждый образец данных используется для обучения YOLO v3. После обработки моделью образец должен быть удалён, если он удовлетворяет определённому условию. Таким образом, образец данных больше не используется для обучения в последующих эпохах.
Теперь у меня есть два вопроса по реализации –
1) Как обрабатывать каждый образец индивидуально? Должен ли я устанавливать размер упаковки = 1? Или есть какое-то преимущество в отключении автоматической упаковки? Если да, то как мне это сделать.
2) Как именно удалить образец из набора данных для дальнейших эпох? Есть ли способ пропустить этот образец в DataLoader?
1) Как обрабатывать каждый образец индивидуально? Должен ли я устанавливать размер упаковки = 1? Или есть какое-то преимущество в отключении автоматической упаковки? Если да, то как мне это сделать.
Если вы установите размер упаковки на 1, то вы фактически отключаете упаковку. Образцы будут обрабатываться один за другим, и градиенты будут вычисляться для отдельных образцов. Это не обязательно проблема – просто имейте в виду, что вы потеряете преимущества мини-упаковки.
Если вы используете DataLoader
от PyTorch, просто установите batch_size
и batch_sampler
в None
. Согласно документации, это отключит автоматическую упаковку.
2) Как именно удалить образец из набора данных для дальнейших эпох? Есть ли способ пропустить этот образец в DataLoader?
Вы можете реализовать пользовательский набор данных PyTorch. Внутри отслеживайте, какие образцы были удалены. Если вы используете набор данных на основе итераторов, то следующий шаг довольно прост. Просто пропустите удалённые образцы в __iter__()
.
С набором данных на основе отображений будет немного сложнее. Ваша функция len()
должна возвращать len(dataset) - # удалённых образцов
. И вам придётся найти какую-то схему индексации, которая предотвратит доступ к удалённым образцам. Одна наивная идея – просто переиндексировать после каждого удаления. Очевидная проблема заключается в том, что случайный образец сервера данных не будет знать об этом, так что один и тот же образец может обрабатываться несколько раз в одной эпохе. Другая идея – индексировать ваши образцы по какому-то уникальному ключу, а не по целым числам.
2) Я бы попробовал использовать это:
https://pytorch.org/docs/stable/data.html#torch.utils.data.SubsetRandomSampler
Это выборщик, который ограничивает сервер данных определённым индексом. Оберните его с помощью batchsampler. Также измените набор данных, чтобы он выдавал (изображение, цель, индекс) вместо обычного (изображение, цель).
1) collate_fcn()
в сервере данных делает это…упаковка будет передана collate_fcn
для предварительной обработки. Мне было трудно понять это в начале.
https://discuss.pytorch.org/t/how-to-create-a-dataloader-with-variable-size-input/8278
Можете рассказать, сработает ли это? Или каково ваше окончательное решение? Удачи!
Ответ или решение
Реализация обучения в PyTorch с использованием набора данных COCO и YOLO v3
При решении задачи обучения модели YOLO v3 на наборе данных COCO, необходимо учитывать несколько ключевых аспектов. В данном руководстве разберемся с индивидуальной обработкой образцов, механикой удаления образцов из обучения и оптимизацией работы с DataLoader
.
1. Обработка каждого образца индивидуально
Если вы хотите обрабатывать образцы по одному, установка размера мини-бatch на единицу (batch size = 1) является наиболее простым решением. Однако стоит помнить, что это приведет к потере преимущества мини-батчевого градиентного спуска, такого как лучшая сходимость и более стабильные обновления градиентов.
Чтобы временно отключить автоматическое пакетирование (batching) в PyTorch’s DataLoader
, вы можете настроить параметры следующим образом:
from torch.utils.data import DataLoader
dataloader = DataLoader(dataset, batch_size=1, shuffle=False)
Это обеспечит, что каждый образец будет обрабатываться отдельно.
Также, если вам необходимо отключить автоматическое пакетирование для специфической логики обработки, вы можете использовать collate_fn
в DataLoader. Этот параметр позволяет вам контролировать, как данные объединяются в пакет. Например, вы можете обрабатывать каждый образец по отдельности в collate_fn
.
2. Удаление образцов из набора данных для дальнейших эпох
Для удаления образцов из набора данных на дальнейших эпохах, рекомендуется создать собственный класс набора данных. В этом классе вы сможете отслеживать удаленные образцы и пропускать их.
Ниже представлен пример реализации:
from torch.utils.data import Dataset, DataLoader
class CustomDataset(Dataset):
def __init__(self, data):
self.data = data
self.deleted_indices = set()
def __len__(self):
return len(self.data) - len(self.deleted_indices)
def __getitem__(self, idx):
actual_idx = self._get_actual_index(idx)
item = self.data[actual_idx]
return item
def _get_actual_index(self, idx):
actual_count = -1
for index in range(len(self.data)):
if index not in self.deleted_indices:
actual_count += 1
if actual_count == idx:
return index
raise IndexError("Index out of range")
def delete_sample(self, index):
self.deleted_indices.add(index)
Создайте экземпляр вашего набора данных и передайте его в DataLoader
. При необходимости удаления образца просто вызовите метод delete_sample(index)
, передав индекс образца, который должен быть удален.
Для более продвинутого подхода вы можете использовать SubsetRandomSampler
, который ограничивает выборку DataLoader
до определённых индексов. Это позволяет избегать повторного доступа к удалённым образцам без их физического удаления из массива.
from torch.utils.data import SubsetRandomSampler
# Предположим, you have a list of valid indices
valid_indices = [i for i in range(len(dataset)) if i not in deleted_indices]
sampler = SubsetRandomSampler(valid_indices)
dataloader = DataLoader(dataset, sampler=sampler)
Заключение
Таким образом, обработка каждого образца в PyTorch и управление удалением образцов из набора данных требуют внимательного подхода. Установив размер мини-бatch в 1 и настроив DataLoader
с учетом ваших потребностей, вы сможете успешно реализовать стратегию обучения для вашего проекта. Помните, что создание пользовательского набора данных даст вам максимальную гибкость и контроль над обработкой данных, позволяя отделить удаленные образцы от дальнейших эпох.