Pytorch отправляет входы / цели на устройство - PullRequest
0 голосов
/ 07 апреля 2020

В настоящее время используется библиотека 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)

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

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] .to (устройство) не проблема. Как я могу отправить остальные?

1 Ответ

0 голосов
/ 08 апреля 2020

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

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

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, мы должны открыть для l oop с 3 пунктами:

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

Внутри для l oop В контексте a_tensor, b_tensor, c_tensor будут тензоры с 1-м измерением 50 (batch_size).

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

...