Python 将类对象添加到Pytorch数据加载器:批处理必须包含张量
我有一个自定义Pytorch数据集,它返回一个包含类对象“查询”的字典 问题是,当我将查询放入数据加载器时,我得到了Python 将类对象添加到Pytorch数据加载器:批处理必须包含张量,python,pytorch,Python,Pytorch,我有一个自定义Pytorch数据集,它返回一个包含类对象“查询”的字典 问题是,当我将查询放入数据加载器时,我得到了default\u collate:batch必须包含张量、numpy数组、数字、dict或列表;找到。有没有办法在我的数据加载器中有一个类对象?它在下面代码中的next(迭代器)处爆炸 train_queries = QueryDataset(train_queries) train_loader = torch.utils.data.DataLoader(train_queri
default\u collate:batch必须包含张量、numpy数组、数字、dict或列表;找到
。有没有办法在我的数据加载器中有一个类对象?它在下面代码中的next(迭代器)
处爆炸
train_queries = QueryDataset(train_queries)
train_loader = torch.utils.data.DataLoader(train_queries,
batch_size=10],
shuffle=True,
drop_last=False)
for i in range(epochs):
iterator = iter(train_loader)
for i in range(len(train_loader)):
batch = next(iterator)
out = model(batch)
loss = criterion(out["pred"], batch["targets"])
self.optimizer.zero_grad()
loss.sum().backward()
self.optimizer.step()
为了做到这一点,您需要定义自己的。 一个草率的方法只是向你展示这里的东西是如何工作的,应该是这样的:
导入火炬
类别设备信息技术:
定义初始化(自身,数据):
self.data=数据
def打印_数据(自身):
打印(自我数据)
类QueryDataset(torch.utils.data.Dataset):
定义初始化(自我、查询、值、目标):
超级(查询数据集)。\uuuu初始化
self.querys=查询
self.values=值
self.targets=目标
定义(自我):
返回5
def uu getitem uu(self,idx):
sample={'query':self.querys[idx],
“值”:自身值[idx],
“目标”:self.targets[idx]}
回样
def自定义校对(dict):
返回设备dict(dict)
dt=查询数据集(“q”、“v”、“t”)
dl=torch.utils.data.DataLoader(dtt,批量大小=1,collate\U fn=custom\U collate)
t=下一个(国际热核实验堆(dl))
t、 打印数据()
基本上,colate\u fn
允许您实现自定义批处理或添加对自定义数据类型的支持,如我之前提供的链接所述。正如您所看到的,这只是一个概念,您需要根据自己的需要对其进行更改。您需要定义自己的概念才能做到这一点。 一个草率的方法只是向你展示这里的东西是如何工作的,应该是这样的:
导入火炬
类别设备信息技术:
定义初始化(自身,数据):
self.data=数据
def打印_数据(自身):
打印(自我数据)
类QueryDataset(torch.utils.data.Dataset):
定义初始化(自我、查询、值、目标):
超级(查询数据集)。\uuuu初始化
self.querys=查询
self.values=值
self.targets=目标
定义(自我):
返回5
def uu getitem uu(self,idx):
sample={'query':self.querys[idx],
“值”:自身值[idx],
“目标”:self.targets[idx]}
回样
def自定义校对(dict):
返回设备dict(dict)
dt=查询数据集(“q”、“v”、“t”)
dl=torch.utils.data.DataLoader(dtt,批量大小=1,collate\U fn=custom\U collate)
t=下一个(国际热核实验堆(dl))
t、 打印数据()
基本上,colate\u fn
允许您实现自定义批处理或添加对自定义数据类型的支持,如我之前提供的链接所述。正如您所看到的,这只是一个概念,您需要根据自己的需要对其进行更改。对于那些好奇的人来说,这是我用来让事情正常运行的DeviceICT和自定义整理功能
class DeviceDict(dict):
def __init__(self, *args):
super(DeviceDict, self).__init__(*args)
def to(self, device):
dd = DeviceDict()
for k, v in self.items():
if torch.is_tensor(v):
dd[k] = v.to(device)
else:
dd[k] = v
return dd
def collate_helper(elems, key):
if key == "query":
return elems
else:
return torch.utils.data.dataloader.default_collate(elems)
def custom_collate(batch):
elem = batch[0]
return DeviceDict({key: collate_helper([d[key] for d in batch], key) for key in elem})
对于那些好奇的人来说,这是我用来让事情运转起来的DeviceICT和定制校对功能
class DeviceDict(dict):
def __init__(self, *args):
super(DeviceDict, self).__init__(*args)
def to(self, device):
dd = DeviceDict()
for k, v in self.items():
if torch.is_tensor(v):
dd[k] = v.to(device)
else:
dd[k] = v
return dd
def collate_helper(elems, key):
if key == "query":
return elems
else:
return torch.utils.data.dataloader.default_collate(elems)
def custom_collate(batch):
elem = batch[0]
return DeviceDict({key: collate_helper([d[key] for d in batch], key) for key in elem})
谢谢,这方面的措施奏效了。我不得不玩一下collate_fn,但它最终还是起了作用。我很高兴,很高兴它起到了作用:)谢谢,类似的东西也起了作用。我不得不玩一下collate_fn,但它最终起了作用。我很高兴,很高兴它起了作用:)