PyTorch DataLoader 错误:“type”类型的对象没有 len()

问题描述

我对编程很陌生,现在知道我的错误来自哪里。

我得到了以下代码来设置用于训练分类器的数据集:

class cows_train(Dataset):

    def __init__(self,folder_path):
        self.image_list = glob.glob(folder_path+'/content/cows/train')
        self.data_len = len(self.image_list)

    def __getitem__(self,index):
        single_image_path = self.image_list[index]
        im_as_im = Image.open(single_image_path)
        im_as_np = np.asarray(im_as_im)/255
        im_as_np = np.expand_dims(im_as_np,0)
        im_as_ten = torch.from_numpy(im_as_np).float()
        class_indicator_location = single_image_path.rfind('/content/cows/train/_annotations.csv')
        label = int(single_image_path[class_indicator_location+2:class_indicator_location+3])
        return (im_as_ten,label)

    def __len__(self):
        return self.data_len

这对于 DataLoader

transform = transforms.Compose(
    [transforms.ToTensor(),transforms.normalize((0.5,0.5,0.5),(0.5,0.5))])

batch_size = 4

trainset = cows_train
trainloader =    torch.utils.data.DataLoader(dataset = trainset,batch_size=10,shuffle=True,num_workers=2)

classes = ('cow_left','cow_other')

我收到的输出

TypeError Traceback (most recent call last)
<ipython-input-6-54702f98a725> in <module>()
      6 
      7 trainset = cows_train
----> 8 trainloader = torch.utils.data.DataLoader(dataset = trainset,num_workers=2)
      9 
     10 testset = cows_test

2 frames
/usr/local/lib/python3.7/dist-packages/torch/utils/data/DataLoader.py in __init__(self,dataset,batch_size,shuffle,sampler,batch_sampler,num_workers,collate_fn,pin_memory,drop_last,timeout,worker_init_fn,multiprocessing_context,generator,prefetch_factor,persistent_workers)
    264                     # Cannot statically verify that dataset is Sized
    265                     # Somewhat related: see NOTE [ Lack of Default `__len__` in Python Abstract Base Classes ]
--> 266                     sampler = RandomSampler(dataset,generator=generator)  # type: ignore
    267                 else:
    268                     sampler = SequentialSampler(dataset)

/usr/local/lib/python3.7/dist-packages/torch/utils/data/sampler.py in __init__(self,data_source,replacement,num_samples,generator)
    100                              "since a random permute will be performed.")
    101 
--> 102         if not isinstance(self.num_samples,int) or self.num_samples <= 0:
    103             raise ValueError("num_samples should be a positive integer "
    104                              "value,but got num_samples={}".format(self.num_samples))

/usr/local/lib/python3.7/dist-packages/torch/utils/data/sampler.py in num_samples(self)
    108         # dataset size might change at runtime
    109         if self._num_samples is None:
--> 110             return len(self.data_source)
    111         return self._num_samples
    112 

TypeError: object of type 'type' has no len()

问题是:我不明白为什么 typ 没有长度,在我看来它是定义的......有人请帮忙吗?

添加:这是代码中出现“return len(self.data_source)”的地方

def num_samples(self) -> int:
    if self._num_samples is None:
        return len(self.data_source)
    return self._num_samples

解决方法

您没有正确创建数据集对象。目前,您:

audio_id

这只会将类类型分配给 trainset = cows_train 。要创建类的对象,您需要使用:

trainset