Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
pytorch数据加载器默认值\u collate参数与to(设备)一起使用_Pytorch_Batch Processing_Data Stream_Dataloader - Fatal编程技术网

pytorch数据加载器默认值\u collate参数与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,

我一直在尝试使用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,
                                 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))))