我正在尝试将hdf5数据集加载到pytorch培训中进行循环。
无论数据加载器中有num_workers个,这都会随机引发“ KeyError:'无法打开对象(找不到组件)'”(下面的回溯)。
我能够开始训练循环,但是如果没有这个错误,就无法通过一个纪元的1/4,这对于随机的“数据集”(每个2darray)都会发生。我可以使用常规的f['group/subroup'][()]
在控制台中分别加载这些数组,这样就不会出现hdf文件损坏或数据集/数组出问题的情况。
我尝试过:
X = f[ID]
然后X = X[()]
因为这种情况以num_workers = 0重复出现,所以我认为这不是多线程问题,尽管回溯似乎指向了/ torch / utils / data / dataloader中准备下一批的行。
我只是想不出为什么h5py无法随机看到奇数个单独的数据集。
ID是匹配hdf路径的字符串,例如:
ID = "ID_12345//Ep_-1//AN_67891011//ABC"
摘录自数据加载器:
def __getitem__(self, index):
ID = self.list_IDs[index]
# Start hdf file in read mode:
f = h5py.File(self.hdf_file, 'r', libver='latest', swmr=True)
X = f[ID][()]
X = X[:, :, np.newaxis] # torchvision 0.2.1 needs (H x W x C) for transforms
y = self.y_list[index]
if self.transform:
X = self.transform(X)
return ID, X, y
`
预期:训练循环
实际:ID /数据集/示例最初加载良好,然后经过20到200个步骤...
回溯(最近通话最近一次):
文件“ Documents / BSSA-loc / mamdl / models / main_v3.py”,第287行,在 main()main中的文件“ Documents / BSSA-loc / mamdl / models / main_v3.py”,第203行 对于我,(枚举(train_loader)中的(ID,图像,标签):文件“ /home/james/anaconda3/envs/jc/lib/python3.7/site-packages/torch/utils/data/dataloader.py”, 第615行,下一个 批处理= self.collate_fn([i中的索引为self.dataset [i]])文件 “ /home/james/anaconda3/envs/jc/lib/python3.7/site-packages/torch/utils/data/dataloader.py”, 615行,在 批处理= self.collate_fn([i中的索引为self.dataset [i]])文件 “ /home/james/Documents/BSSA-loc/mamdl/src/data_loading/Data_loader_v3.py”, 第59行,在 getitem X = f [ID] [()]文件“ h5py / _objects.pyx”,第54行,位于h5py._objects.with_phil.wrapper中,文件“ h5py / _objects.pyx”,第55行, 在h5py._objects.with_phil.wrapper文件中 “ /home/james/anaconda3/envs/jc/lib/python3.7/site-packages/h5py/_hl/group.py”, 第262行,在 getitem oid = h5o.open(self.id,self._e(name),lapl = self._lapl)文件“ h5py / _objects.pyx”,第54行,位于h5py._objects.with_phil.wrapper
在h5py._objects.with_phil.wrapper中的文件“ h5py / _objects.pyx”,第55行 在h5py.h5o.open中将文件“ h5py / h5o.pyx”插入第190行KeyError:'无法打开对象(未找到组件)'
答案 0 :(得分:0)
记录下来,我最好的猜测是这是由于我的hdf构造代码中的一个错误,该错误在附加模式下已停止并多次启动。
当查询f['group/subroup'][()]
时,某些数据集看起来好像是完整的,但无法使用pytorch数据加载器加载。
自从以不同方式重建hdf以来,就没有这个问题。