TypeError: 'float' object is not subscriptable when creating a weighted sampler

Hello everyone, I am working on action recognition and my train folder is structured like this:

-class 0
—video1 frame1.npy
—video1 frame2.npy
—video1 frame3.npy
—video2 frame1.npy
—video2 frame2.npy
—video2 frame3.npy
-class 1
—video1 frame1.npy
—video1 frame2.npy
—video1 frame3.npy

Below is the code for my weighted sampler so far:

    class_sample_count = []
    for videos in traindir:                                                         
        for frames in videos:
        weight_per_class = 1. / class_sample_count 
        samples_weight = np.array([weight_per_class[t] for t in frames])       
        samples_weight = torch.from_numpy(samples_weight)

    sampler = WeightedRandomSampler(samples_weight.type('torch.DoubleTensor'), len(samples_weight))   

However, I am getting an error

samples_weight = np.array([weight_per_class[t] for t in frames])

TypeError: 'float' object is not subscriptable

Any advice for me is appreciated. Thank you in advance

weight_per_class is a float type variable but not a list or something index-able.

1 Like

I have edited my code for the weighted sampler:

class_weights = []
    for classes, videos, frames in os.walk(traindir):                                                         
        if len(frames) > 0:
    sample_weights = [0] *len(train_dataset)

    for idx, (frames, label, file_name) in enumerate(train_dataset):
        class_weight = class_weights[label]
        sample_weights[idx] = class_weight
    sampler = WeightedRandomSampler(sample_weights, num_samples=len(sample_weights), replacement=True)

I have put this all in my main. It’s not throwing the error I mentioned before anymore. However, there’s a new error firing in my dataset.py

dataset.py", line 35, in __getitem__
    class_path = self.root_dir + '/' + self.classes[label]

UnboundLocalError: local variable 'label' referenced before assignment

Here is the code for my dataset.py

class loadedDataset(Dataset):
    def __init__(self, root_dir, transform=None):
        self.root_dir = root_dir
        self.transform = transform
        self.classes = sorted(os.listdir(self.root_dir))
        self.count = [len(os.listdir(self.root_dir + '/' + c)) for c in self.classes]
        self.acc_count = [self.count[0]]
        for i in range(1, len(self.count)):
                self.acc_count.append(self.acc_count[i-1] + self.count[i])
        # self.acc_count = [self.count[i] + self.acc_count[i-1] for i in range(1, len(self.count))]

    def __len__(self):
        l = np.sum(np.array([len(os.listdir(self.root_dir + '/' + c)) for c in self.classes]))
        return l

    def __getitem__(self, idx):
        for i in range(len(self.acc_count)):
            if idx < self.acc_count[i]:
                label = i

        class_path = self.root_dir + '/' + self.classes[label] 

        if label:
            file_path = class_path + '/' + sorted(os.listdir(class_path))[idx-self.acc_count[label]]
            file_path = class_path + '/' + sorted(os.listdir(class_path))[idx]

        _, file_name = os.path.split(file_path)

        frames = []
        #self.file_path = file_path
        # print os.listdir(file_path)
        file_list = sorted(os.listdir(file_path))
        # print file_list

        # v: maximum translation in every step
        v = 2
        offset = 0
        for i, f in enumerate(file_list):
            frame = torch.load(file_path + '/' + f)
            offset += random.randrange(-v, v)
            offset = min(offset, 3 * v)
            offset = max(offset, -3 * v)
            #frame = frame.transform(frame.size, Image.AFFINE, (1, 0, offset, 0, 1, 0))
            if self.transform is not None:
                frame = self.transform[0](frame)

        return frames, label, file_name

I didn’t encounter this error before I put in my weight sampler code.

Any ideas on this? Thanks in advance

label is not assigned.
Check if statement works as you designed.