__get_item__ 给出键错误:Python

问题描述 投票:0回答:1

所以我正在写这个数据集类。在

__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__
的这个迭代是如何工作的。有人可以对此有所了解吗? 提前致谢。

python pytorch dataset torchvision
1个回答
0
投票

你透露了正在发生的事情的一部分,而不是提供一个 代表.

显然一些数据集

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。


分解你的问题 进一步, 编写一个或多个单元测试, 并向我们展示新代码在您的用例中的行为方式。 如前所述,规格不清楚。

© www.soinside.com 2019 - 2024. All rights reserved.