当不应打开任何文件时,Pythorch的dataloader“打开的文件太多”错误

2024-09-30 06:11:38 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,这是一个最小的代码来说明这个问题:

以下是数据集:

class IceShipdataset(Dataset):
    BAND1='band_1'
    BAND2='band_2'
    IMAGE='image'

    @staticmethod
    def get_band_img(sample,band):
        pic_size=75
        img=np.array(sample[band])
        img.resize(pic_size,pic_size)
        return img

    def __init__(self,data,transform=None):
        self.data=data
        self.transform=transform

    def __len__(self):
        return len(self.data)  

    def __getitem__(self, idx):

        sample=self.data[idx]
        band1_img=IceShipDataset.get_band_img(sample,self.BAND1)
        band2_img=IceShipDataset.get_band_img(sample,self.BAND2)
        img=np.stack([band1_img,band2_img],2)
        sample[self.IMAGE]=img
        if self.transform is not None:
                sample=self.transform(sample)
        return sample

这是失败的代码:

^{pr2}$

在for循环中会出现奇怪的打开文件错误… 我的torch版本是0.3.0.post4

如果您需要json文件,可以在Kaggle(https://www.kaggle.com/c/statoil-iceberg-classifier-challenge)找到它

我应该指出,这个错误与我的笔记本电脑的状态无关:

yoni@yoni-Lenovo-Z710:~$ lsof | wc -l
89114
yoni@yoni-Lenovo-Z710:~$ cat /proc/sys/fs/file-max
791958

我做错什么了?在


Tags: sample代码selfimgdatasizegetband
1条回答
网友
1楼 · 发布于 2024-09-30 06:11:38

我知道如何纠正这个错误,但我没有一个完整的解释为什么会发生。在

首先,解决方案:您需要确保图像数据存储为numpy.arrays,当您调用json.loads时,它将它们作为floats的pythonlists来加载它们。这会导致torch.utils.data.DataLoader将列表中的每个浮点单独转换为torch.DoubleTensor。在

看看torch.utils.data.DataLoader中的default_collate-你的__getitem__返回了一个dict,这是一个映射,因此在dict的每个元素上再次调用default_collate。第一对是ints,但是接下来你得到的图像数据是list,即collections.Sequence-这就是为什么在列表的每个元素上调用default_collate时,事情变得很奇怪。这显然不是你想要的。我不知道torch中关于listnumpy.array内容的假设是什么,但是考虑到这个错误,这个假设似乎被违背了。在

修复非常简单,只需确保两个图像带是numpy.arrays,例如__init__

^{1}$

或者在加载json之后,无论在何处执行都不重要,只要您这样做。在


为什么上面的结果是too many open files?在

我不知道,但正如评论所指出的,这很可能与进程间通信和锁定两个队列上的文件有关。在

脚注:由于比赛仍在进行中,Kaggle无法下载train.json。我创建了一个应该具有相同结构的虚拟json文件,并在该虚拟文件上测试了修复。

相关问题 更多 >

    热门问题