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_tensor
、b_tensor
、c_tensor
将是第一维 50 (batch_size
) 的张量。
因此,根据您给出的示例,您的 get_train_test_loader
函数使用的任何数据集 class 似乎都存在一些问题。最好单独实例化数据集,然后创建数据加载器,而不是使用像您拥有的那样的一揽子功能。
目前正在使用 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_tensor
、b_tensor
、c_tensor
将是第一维 50 (batch_size
) 的张量。
因此,根据您给出的示例,您的 get_train_test_loader
函数使用的任何数据集 class 似乎都存在一些问题。最好单独实例化数据集,然后创建数据加载器,而不是使用像您拥有的那样的一揽子功能。