因此,这是一个最小的代码来说明这个问题:
以下是数据集:
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
我做错什么了?在
我知道如何纠正这个错误,但我没有一个完整的解释为什么会发生。在
首先,解决方案:您需要确保图像数据存储为
numpy.array
s,当您调用json.loads
时,它将它们作为float
s的pythonlist
s来加载它们。这会导致torch.utils.data.DataLoader
将列表中的每个浮点单独转换为torch.DoubleTensor
。在看看
torch.utils.data.DataLoader
中的default_collate
-你的__getitem__
返回了一个dict
,这是一个映射,因此在dict
的每个元素上再次调用default_collate
。第一对是int
s,但是接下来你得到的图像数据是list
,即collections.Sequence
-这就是为什么在列表的每个元素上调用default_collate
时,事情变得很奇怪。这显然不是你想要的。我不知道torch
中关于list
与numpy.array
内容的假设是什么,但是考虑到这个错误,这个假设似乎被违背了。在修复非常简单,只需确保两个图像带是
^{1}$numpy.array
s,例如__init__
或者在加载json之后,无论在何处执行都不重要,只要您这样做。在
为什么上面的结果是
too many open files
?在我不知道,但正如评论所指出的,这很可能与进程间通信和锁定两个队列上的文件有关。在
脚注:由于比赛仍在进行中,Kaggle无法下载
train.json
。我创建了一个应该具有相同结构的虚拟json文件,并在该虚拟文件上测试了修复。相关问题 更多 >
编程相关推荐