pytorch数据加载器默认值\u collate参数与to(设备)一起使用
我一直在尝试使用to(设备)将to(设备)集成到我的数据加载器中,如中所示 我对时尚主义者的定义如下:pytorch数据加载器默认值\u collate参数与to(设备)一起使用,pytorch,batch-processing,data-stream,dataloader,Pytorch,Batch Processing,Data Stream,Dataloader,我一直在尝试使用to(设备)将to(设备)集成到我的数据加载器中,如中所示 我对时尚主义者的定义如下: device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') batch_size = 32 trainset = datasets.FashionMNIST('~/.pytorch/F_MNIST_data/', download=True,
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
batch_size = 32
trainset = datasets.FashionMNIST('~/.pytorch/F_MNIST_data/',
download=True,
train=True,
transform=transforms.ToTensor())
rain_loader = torch.utils.data.DataLoader(trainset, batch_size=batch_size, shuffle=False, collate_fn=lambda x: default_collate(x).to(device))
但我得到了以下错误:
AttributeError:'list'对象没有“to”属性。
默认collate的输出似乎是一个长度为2的列表,第一个元素是图像张量,第二个元素是标签张量(因为它是next(iter(train_loader))的输出,collate_fn=None),所以我尝试了以下定义的函数:
def to_device_list(l, device):
return [l[0].to(device), l[1].to(device)]
train_loader = torch.utils.data.DataLoader(trainset, batch_size=batch_size, shuffle=False, collate_fn=lambda x: to_device_list(x, device))
我得到了以下错误:
AttributeError:“tuple”对象没有“to”属性。
有关如何操作的任何帮助?fashion mnist数据集返回一个由
img
和target
组成的元组,其中img
是类的张量,target是int
值
现在,您的dataloader
从dataset
类获取批量大小的样本,以获得样本列表。注意,这个示例列表现在是,list[Tuple[Tensor,int]]
(在这里使用键入注释)。然后调用collate函数将List[Tuple[Tensor,int]
转换为List[Tensor]
,其中该列表有2个张量。第一个张量是大小为[32,1,28,28]的图像的堆叠数组,其中32是批量大小,第二个张量是int值的张量数组(类标签)
default\u collate
函数只是将结构数组转换为数组结构
现在,当您使用collate\u fn=lambda x:default\u collate(x).to(device)
时,请注意default\u collate返回一个张量列表。所以在列表中调用.to
是行不通的,应该在列表的所有元素上调用
解决方案
使用
map函数将list的每个元素(从
default\u collate
)传输到cuda,最后是调用list,因为map
在python3中的计算是惰性的。我知道太晚了,但添加了解决方案。对于任何面临此问题的人,我建议使用pycharm或其他ide中的调试工具,或者只是pudb。这样很容易找到问题所在。
collate_fn=lambda x: list(map(lambda x: x.to(device), default_collate(x))))