Как 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()

подразумевает, что можно получить несколько элементов одновременно, что заставляет меня задуматься:

  1. Как это преобразование работает с несколькими элементами? Возьмем, к примеру, пользовательские преобразования из учебника. Они не выглядят так, как будто их можно применить к партии образцов за один вызов.

  2. В связи с этим, как DataLoader извлекает пакет из нескольких образцов параллельно и применяет указанное преобразование, если преобразование может быть применено только к одному образцу?

2 ответа

Решение
  1. Как это преобразование работает с несколькими элементами?Они работают с несколькими элементами с помощью загрузчика данных. Используя преобразования, вы указываете, что должно произойти с единичной эмиссией данных (например, batch_size=1). Загрузчик данных принимает указанный вамиbatch_size и звонит в __getitem__в наборе данных факела, применяя преобразование к каждому образцу, отправляемому на обучение / проверку. Затем он сопоставляет n образцы в размер вашего пакета, отправленные из загрузчика данных.

  2. В связи с этим, как DataLoader извлекает пакет из нескольких образцов параллельно и применяет указанное преобразование, если преобразование может быть применено только к одному образцу?Надеюсь, это имеет для вас смысл. Распараллеливание выполняется классом набора данных резака и загрузчиком данных, где вы указываете num_workers. Torch обработает набор данных и распределит его между рабочими.

из документации трансформ от torchvision:

Все преобразования принимают в качестве входных данных изображение PIL, тензорное изображение или пакет тензорных изображений. Тензорное изображение - это тензор с формой (C, H, W), где C - количество каналов, H и W - высота и ширина изображения. Пакет тензорных изображений - это тензор формы (B, C, H, W), где B - количество изображений в пакете. Детерминированные или случайные преобразования, применяемые к пакету тензорных изображений, одинаково преобразуют все изображения пакета.

Это означает, что вы можете передать пакет изображений, и преобразование будет применяться ко всему пакету, если оно соответствует форме. Индексы списка действуют на iloc из фрейма данных, который выбирает либо один индекс, либо их список, возвращая запрошенное подмножество.

Другие вопросы по тегам