所以我正在写这个数据集类。在
__get_item__
这给了我这个错误:
> 0
> {}
>
> --------------------------------------------------------------------------- KeyError Traceback (most recent call
> last) <ipython-input-65-263240bbee7e> in <cell line: 1>()
> ----> 1 main()
>
> 3 frames <ipython-input-64-2b81d181af45> in __getitem__(self, idx)
> 12 print(idx)
> 13 print(self.dataset[idx])
> ---> 14 fname = os.path.join(self.data_dir+'/images/', self.dataset[idx]['image'])
> 15 #if os.path.exists(fname):
> 16 img = Image.open(fname).convert('RGB')
>
> KeyError: 'image'
>
>
数据集的一个样本索引是:
defaultdict(<class 'dict'>, {939: {'image': 'COCO_train2014_000000163939.jpg', 'texts': {0: 'the right half of a keyboard'}}
class RefCOCOgDataset(Dataset):
def __init__(self, dataset, transform=None, data_dir='dataset/refcocog'):
super(RefCOCOgDataset, self).__init__()
self.data_dir = data_dir
self.transform = transform
self.dataset = dataset
print(self.dataset)
def __getitem__(self, idx):
data_item = {i: torch.tensor(v[idx]) for i, v in self.dataset.items() if idx in
self.dataset.keys()}
print(idx)
print(self.dataset[idx])
fname = os.path.join(self.data_dir+'/images/', self.dataset[idx]['image'])
#if os.path.exists(fname):
img = Image.open(fname).convert('RGB')
image = self.transform(img)['image']
data_item['image'] = image.permute(2, 0, 1).float()
data_item['texts'] = self.dataset[idx]['texts']
print(data_item[idx])
return data_item
def __len__(self):
return len(self.dataset)
我的问题是,如何正确映射我的数据集,这样它就不会给我键盘错误,并且数据集可以正确加载到数据加载器中?我希望
idx
遍历我的 dataset
字典(例如 idx=939),以便像我编写的图像和文本代码那样正确映射。是否可以?抱歉,我不清楚 __get_item__
的这个迭代是如何工作的。有人可以对此有所了解吗?
提前致谢。
你透露了正在发生的事情的一部分,而不是提供一个 代表.
显然一些数据集
ds
有一个939
键。
但是在调用堆栈的隐藏部分
你取消了引用ds[0]
.
def __getitem__(self, idx):
data_item = {i: torch.tensor(v[idx]) for i, v in self.dataset.items() if idx in
self.dataset.keys()}
print(idx)
print(self.dataset[idx])
所以
0
被传入,而 if
注意到键中没有 0
,
所以我们得到一个空的dict
。
这对印刷品报告了这一点,当他们说0
和{}
.
鉴于此,不足为奇的是 试图取消引用
self.dataset[0]['image']
会报KeyError。
分解你的问题 进一步, 编写一个或多个单元测试, 并向我们展示新代码在您的用例中的行为方式。 如前所述,规格不清楚。