Как PyTorch DataLoader взаимодействует с набором данных PyTorch для преобразования пакетов?
Я создаю собственный набор данных для задач, связанных с НЛП.
В руководстве по настройке пользовательских данных PyTorch мы видим, что
__getitem__()
оставляет место для преобразования, прежде чем он вернет образец:
def __getitem__(self, idx):
if torch.is_tensor(idx):
idx = idx.tolist()
img_name = os.path.join(self.root_dir,
self.landmarks_frame.iloc[idx, 0])
image = io.imread(img_name)
### SOME DATA MANIPULATION HERE ###
sample = {'image': image, 'landmarks': landmarks}
if self.transform:
sample = self.transform(sample)
return sample
Однако код здесь:
if torch.is_tensor(idx):
idx = idx.tolist()
подразумевает, что можно получить несколько элементов одновременно, что заставляет меня задуматься:
Как это преобразование работает с несколькими элементами? Возьмем, к примеру, пользовательские преобразования из учебника. Они не выглядят так, как будто их можно применить к партии образцов за один вызов.
В связи с этим, как DataLoader извлекает пакет из нескольких образцов параллельно и применяет указанное преобразование, если преобразование может быть применено только к одному образцу?
2 ответа
Как это преобразование работает с несколькими элементами?Они работают с несколькими элементами с помощью загрузчика данных. Используя преобразования, вы указываете, что должно произойти с единичной эмиссией данных (например,
batch_size=1
). Загрузчик данных принимает указанный вамиbatch_size
и звонит в__getitem__
в наборе данных факела, применяя преобразование к каждому образцу, отправляемому на обучение / проверку. Затем он сопоставляетn
образцы в размер вашего пакета, отправленные из загрузчика данных.В связи с этим, как DataLoader извлекает пакет из нескольких образцов параллельно и применяет указанное преобразование, если преобразование может быть применено только к одному образцу?Надеюсь, это имеет для вас смысл. Распараллеливание выполняется классом набора данных резака и загрузчиком данных, где вы указываете
num_workers
. Torch обработает набор данных и распределит его между рабочими.
из документации трансформ от torchvision:
Все преобразования принимают в качестве входных данных изображение PIL, тензорное изображение или пакет тензорных изображений. Тензорное изображение - это тензор с формой (C, H, W), где C - количество каналов, H и W - высота и ширина изображения. Пакет тензорных изображений - это тензор формы (B, C, H, W), где B - количество изображений в пакете. Детерминированные или случайные преобразования, применяемые к пакету тензорных изображений, одинаково преобразуют все изображения пакета.
Это означает, что вы можете передать пакет изображений, и преобразование будет применяться ко всему пакету, если оно соответствует форме. Индексы списка действуют на
iloc
из фрейма данных, который выбирает либо один индекс, либо их список, возвращая запрошенное подмножество.