我正在努力实现一个连体网络,接收两张图片。我加载这些图像并创建两个独立的数据采集器。
在我的循环中,我想同时通过两个数据采集器,这样我就可以在这两个图像上训练网络。
for i, data in enumerate(zip(dataloaders1, dataloaders2)):
    # get the inputs
    inputs1 = data[0][0].cuda(async=True);
    labels1 = data[0][1].cuda(async=True);
    inputs2 = data[1][0].cuda(async=True);
    labels2 = data[1][1].cuda(async=True);
    labels1 = labels1.view(batchSize,1)
    labels2 = labels2.view(batchSize,1)
    # zero the parameter gradients
    optimizer.zero_grad()
    # forward + backward + optimize
    outputs1 = alexnet(inputs1)
    outputs2 = alexnet(inputs2)数据中心的返回值是一个元组。但是,当我试图使用zip迭代它们时,我会得到以下错误:
OSError: [Errno 24] Too many open files
Exception NameError: "global name 'FileNotFoundError' is not defined" in <bound method _DataLoaderIter.__del__ of <torch.utils.data.dataloader._DataLoaderIter object at 0x7f2d3c00c190>> ignored                           难道zip不应该在所有可迭代项上工作吗?但在这里我似乎不能把它用在数据表上。
还有别的办法来追查吗?还是我不正确地接近了一个暹罗网络的实施?
发布于 2018-07-20 14:02:58
我看你在努力做一个正确的数据处理功能。我会这样做:
class Siamese(Dataset):
    def __init__(self, transform=None):
    
       #init data here
    
    def __len__(self):
        return   #length of the data
    def __getitem__(self, idx):
        #get images and labels here 
        #returned images must be tensor
        #labels should be int 
        return img1, img2 , label1, label2 发布于 2019-09-03 14:46:20
如果您想同时迭代两个数据集,则无需定义您自己的dataset类,只需使用TensorDataset,如下所示:
dataset = torch.utils.data.TensorDataset(dataset1, dataset2)
dataloader = DataLoader(dataset, batch_size=128, shuffle=True)
for index, (xb1, xb2) in enumerate(dataloader):
    ....如果您希望标签或迭代两个以上的数据集,只需将它们作为参数提供给TensorDataset后的dataset2。
发布于 2019-09-11 13:27:19
进一步说,cycle()和zip() 可能会造成内存泄漏问题--特别是在使用图像数据集时!为了解决这个问题,不要像这样迭代:
dataloaders1 = DataLoader(DummyDataset(0, 100), batch_size=10, shuffle=True)
dataloaders2 = DataLoader(DummyDataset(0, 200), batch_size=10, shuffle=True)
num_epochs = 10
for epoch in range(num_epochs):
    for i, (data1, data2) in enumerate(zip(cycle(dataloaders1), dataloaders2)):
        
        do_cool_things()你可以用:
dataloaders1 = DataLoader(DummyDataset(0, 100), batch_size=10, shuffle=True)
dataloaders2 = DataLoader(DummyDataset(0, 200), batch_size=10, shuffle=True)
num_epochs = 10
for epoch in range(num_epochs):
    dataloader_iterator = iter(dataloaders1)
    
    for i, data1 in enumerate(dataloaders2)):
        try:
            data2 = next(dataloader_iterator)
        except StopIteration:
            dataloader_iterator = iter(dataloaders1)
            data2 = next(dataloader_iterator)
        do_cool_things()请记住,如果您也使用标签,则应该在本例中将data1替换为(inputs1,targets1),将data2替换为inputs2,targets2,如@Sajad所说。
值得称赞的是:https://github.com/pytorch/pytorch/issues/1917#issuecomment-433698337
https://stackoverflow.com/questions/51444059
复制相似问题