Pytorch 发送 inputs/targets 到设备

Pytorch sending inputs/targets to device

目前正在使用 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)

结果出错。变量数据、图像和目标都是 class 元组

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].发送到(设备)没问题。剩下的怎么发?

您应该在每次迭代时使用与您的数据集 returns 一样多的项目打开 for 循环。 下面是一个例子来说明我的观点:

考虑以下数据集:

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

注意它在每次迭代中 returns 3 个项目。

现在让我们用它做一个数据加载器:

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

现在当我们使用 train_loader 时,我们应该用 3 个项目打开 for 循环:

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

在 for 循环的上下文中,a_tensorb_tensorc_tensor 将是第一维 50 (batch_size) 的张量。

因此,根据您给出的示例,您的 get_train_test_loader 函数使用的任何数据集 class 似乎都存在一些问题。最好单独实例化数据集,然后创建数据加载器,而不是使用像您拥有的那样的一揽子功能。