Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.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
Python 将类对象添加到Pytorch数据加载器:批处理必须包含张量_Python_Pytorch - Fatal编程技术网

Python 将类对象添加到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

我有一个自定义Pytorch数据集,它返回一个包含类对象“查询”的字典

问题是,当我将查询放入数据加载器时,我得到了
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,但它最终起了作用。我很高兴,很高兴它起了作用:)