1

当前使用 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 设备?

编辑:

我可以发送 images[0].to(device) 没问题。剩下的怎么寄?

4

1 回答 1

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我们应该用 3 个项目打开 for 循环:

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

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

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

于 2020-04-08T07:17:37.890 回答