Pytorch отправляет входные данные / цели на устройство

В настоящее время используется библиотека pycocotools 2.0.

Мой train_loader:

train_loader, test_loader = get_train_test_loader('dataset', batch_size=16, num_workers=4)

Однако обучающие строки кода:

        for i, data in enumerate(train_loader, 0):
            images, targets = data
            images = images.to(device)
            targets = targets.to(device)

Приводит к ошибке. Данные переменных, изображения и цели относятся к кортежу класса

Traceback (most recent call last):
  File "train.py", line 40, in <module>
    images = images.to(device)
AttributeError: 'tuple' object has no attribute 'to'

Как я могу правильно отправить их на устройство cuda?'

Редактировать:

Я могу отправить изображения [0]. На (устройство) без проблем. Как мне отправить остальное?

1 ответ

Решение

Вы должны открыть цикл for с таким количеством элементов, которое ваш набор данных возвращает на каждой итерации. Вот пример, иллюстрирующий мою точку зрения:

Рассмотрим следующий набор данных:

class CustomDataset:
    def __getitem__(self, index):
        ...
        return a, b, c

Обратите внимание, что он возвращает 3 элемента на каждой итерации.

Теперь давайте сделаем из этого загрузчик данных:

from torch.utils.data import DataLoader
train_dataset = CustomDataset()
train_loader = DataLoader(train_dataset, batch_size=50, shuffle=True)

Теперь, когда мы используем train_loader мы должны открыть цикл for с 3 элементами:

for i, (a_tensor, b_tensor, c_tensor) in enumerate(train_loader):
   ...

Внутри контекста цикла for a_tensor, b_tensor, c_tensor будут тензорами с 1-й размерностью 50 (batch_size).

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

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