一、记录报错,在写dataset与dataloader时遇到的问题
卡了我好久。。。知道了答案豁然开朗,就第一次写下了博客去记录(同时谢谢善良的网友)
ValueError: num_samples should be a positive integer value, but got num_samples=0
这个错误是由于传递给一个函数的num_samples参数的值为0而引起的。
百度查到的几个解决办法分别为:
1、修改shuffle参数。
当dataloader设置了batch_sampler和sampler时,不需要shuffle来进行随机,所以将shuffle设置为FALSE即可。
ps:dataloader的参数:
- dataset:加载的数据集。
- batch_size:每个batch包含的数据数量 shuffle:是否打乱数据位置
- sampler:自定义从数据集中采样的策略,如果指定了,则shuffle必须为False
- batch_sampler:和sampler一样,与shuffle互斥
- num_workers:使用线程的数量,当为0时数据直接加载到主程序,默认为0
- drop_last:dataset中的数据个数可能不是batch_size的整数倍,为True会将多出来不足一个的batch的数据丢弃。
2、len返回的为0,DataLoader读出来后,就报了 got num_samples=0,将这个修改后就正常运行了。
我的错误和第二个原因一样。
因为我在写dataset类的init初始化时,将
self.patch=()
self.mos=[]
然后在getitem中再给self.patch和self.mos赋值,这样读到的len就是0.
总之,在dataset类的初始化中不可以设置为空,一定要给数据长度,否则报错!!!
神奇的是,在我找不到错的时候,碰巧在主程序里写了一句print(dataset[0])后才测试
for data in train_loader:
imgs,targets = data
print(imgs.shape)
print(targets.shape)
有这句print就可以进行,没这句print就报错。原因是执行了print后调用train_loader=DataLoader()函数,此时self.patch和self.mos就有了值,所以才不会报错。