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
у функции, которая используется, возникла проблема. Всегда лучше создать отдельный экземпляр набора данных, а затем создать загрузчик данных, чем использовать общую функцию, подобную той, что у вас есть.