我在尝试实现一个双胞胎网络,该网络需要输入两张图片。我加载这些图片并创建了两个独立的数据加载器。
在我的循环中,我希望同时遍历这两个数据加载器,以便能够用这两张图片训练网络。
for i, data in enumerate(zip(dataloaders1, dataloaders2)): # 获取输入 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) # 清零参数梯度 optimizer.zero_grad() # 前向传播 + 反向传播 + 优化 outputs1 = alexnet(inputs1) outputs2 = alexnet(inputs2)
数据加载器的返回值是一个元组。然而,当我尝试使用zip
来迭代它们时,我得到了以下错误:
OSError: [Errno 24] Too many open filesException NameError: "global name 'FileNotFoundError' is not defined" in <bound method _DataLoaderIter.__del__ of <torch.utils.data.dataloader._DataLoaderIter object at 0x7f2d3c00c190>> ignored
zip不应该可以处理所有可迭代的项目吗?但在这里似乎我不能在数据加载器上使用它。
还有其他方法可以实现吗?或者我对双胞胎网络的实现方法有什么误解吗?
回答:
我看到你在努力创建一个正确的数据加载器函数。我会这样做:
class Siamese(Dataset): def __init__(self, transform=None): #在这里初始化数据 def __len__(self): return #返回数据的长度 def __getitem__(self, idx): #在这里获取图片和标签 #返回的图片必须是张量 #标签应该是整数 return img1, img2 , label1, label2