AttributeError: 'dict' object has no attribute 'self'

I have dataset class and dataloader as:

class SomeDataset(Dataset):
    def __init__(self, usage='val', dataset_pickle_file='./some.pkl', skip_every_n_image=1):
        super(SomeDataset, self).__init__()

        self.to_tensor = transforms.ToTensor()

        with open(dataset_pickle_file, 'rb') as file:
            self.data_info = pickle.load(file)[usage]
        self.idx = [i for i in range(0, len(self.data_info[0]), skip_every_n_image)]
        self.data_len = len(self.idx)

    def __len__(self):
        return self.data_len

    def __getitem__(self, index):  #1
        instanceNum = self.idx[index]
        color_img = self.data_info[0][instanceNum]
        color_imgPIL = Image.open(color_img)
        color_tensor = self.to_tensor(np.array(color_imgPIL))
        d_img = self.data_info[1][instanceNum] #2
        d_imgPIL = Image.open(d_img)
        d_tensor = self.to_tensor(np.array(d_imgPIL))
        output = {'image': color_tensor, 'dt': d_tensor}
        return output
train_dataloader = DataLoader(train_dataset, shuffle=True,
                                  batch_size=args.batch_size,
                                  num_workers=1)
d_net = ExtendedDnet().cuda()
optimizer = torch.optim.Adam(depth_net.parameters(), lr=args.learning_rate)
for epoch in range(2):
        d_net.train()
        for train_idx, train_data in enumerate(train_dataloader):
                 image = train_data['image'].cuda(non_blocking=True)

I am running the code in debug mode on PyCharm.
Just at the last line I am getting this error:

File “~/.pycharm_helpers/pydev/_pydevd_bundle/pydevd_resolver.py”, line 215, in resolve
return getattr(dict, key)
AttributeError: ‘dict’ object has no attribute ‘self’

Can you all please suggest what might be the issue? Thanks for the help!

Can you give the full error stack trace?

Anyway, I think your error is in color_img = self.data_info[0][instanceNum] this line, but it’s difficult to say without knowing what data_info contains

Hi Valerio, Thanks for helping!

self.data_info[0][instanceNum]

contains:

‘/media/storage2/~/train/color_007431.png’

So basically self.data_info[0] contains location of RGB images, self.data_info[1] contains depth images in local system and usage refers to train or validation.

Can you please mention how I can obtain the full error stack trace?
I just see this in the console:

File “~/.pycharm_helpers/pydev/_pydevd_bundle/pydevd_resolver.py”, line 215, in resolve
return getattr(dict, key)
AttributeError: ‘dict’ object has no attribute ‘self’

Weird, I have tried a simplified version of your script and it works for me:

import pickle
import torchvision.transforms as transforms
from torch.utils.data import Dataset
from PIL import Image
import numpy as np
from torch.utils.data import DataLoader


class SomeDataset(Dataset):
    def __init__(self, usage='val', dataset_pickle_file='./some.pkl', skip_every_n_image=1):
        super(SomeDataset, self).__init__()

        self.to_tensor = transforms.ToTensor()
        self.data_info = {}
        self.data_info[0] = ['./data/Leek2D/Renderings/S1_DD2.bmp', './data/Leek2D/Renderings/S1_DS2.bmp']
        self.data_info[1] = ['./data/Leek2D/Renderings/S1_DD2.bmp', './data/Leek2D/Renderings/S1_DS2.bmp']

        self.idx = [i for i in range(0, len(self.data_info[0]), skip_every_n_image)]
        self.data_len = len(self.idx)

    def __len__(self):
        return self.data_len

    def __getitem__(self, index):  #1
        instanceNum = self.idx[index]
        color_img = self.data_info[0][instanceNum]
        color_imgPIL = Image.open(color_img)
        color_tensor = self.to_tensor(np.array(color_imgPIL))
        d_img = self.data_info[1][instanceNum] #2
        d_imgPIL = Image.open(d_img)
        d_tensor = self.to_tensor(np.array(d_imgPIL))
        output = {'image': color_tensor, 'dt': d_tensor}
        return output


train_dataloader = DataLoader(SomeDataset(), shuffle=True,
                                  batch_size=1,
                                  num_workers=0)

for epoch in range(2):
        # d_net.train()
        for train_idx, train_data in enumerate(train_dataloader):
                 image = train_data['image']

Can you try it? (Change the self.data_info into some image you have on disk)