报错记录:dataset与dataloader有关

一、记录报错,在写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就有了值,所以才不会报错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值