【debug】一个Epoch前几个batch正常训练,最后一个batch的数据不足报错

🚀Debug专栏

        其他debug记录请参考上方【debug专栏】


目录

🚀Debug专栏

🍀🍀背景

🔔🔔详细报错

🍭🍭原因分析

🌻🌻解决步骤

🐸解决方案1

🐸解决方案2

🐸解决方案3

🌷🌷总结

整理不易,欢迎一键三连!!!

送你们一条美丽的--分割线--



🍀🍀背景

        在网络训练过程中,改变了数据集,一个epoch中,前几个batch都正常训练,最后一个batch训练时报错尺寸对不上。

🔔🔔详细报错

        报错说是尺寸对不上,翻译过来: torch.sum的两个Tensor的维度不对应,不能进行求和处理。

        # size [batch_size, cHeads, centrs, graphsize]
        dist = torch.sum(torch.abs(points - batch_centroids_broad) ** 2, 4)

        详细报错如下:

 RuntimeError: The size of tensor a (450) must match the size of tensor b (5) at non-singleton dimension 0

🍭🍭原因分析

        在模型训练过程中,一个epoch的前几轮batch数据可以正常训练输出loss,在最后一轮batch数据报错,大概率就是数据量和epoch不匹配,导致最后一个batch的数据不能被整除,所以导致该问题。

        而且从报错信息上看,不是影像长宽尺寸对不上,是(b,c,w,h)的b位置对不上,那就肯定是最后一个batch尺寸对不上了。


🌻🌻解决步骤

🐸解决方案1

        手动将epoch的参数调整一下,保证 num-data  /  batchz-size= epoch  中的所有参数均为整数。

🐸解决方案2

        删除最后一个batch的数据,不参与训练,具体的操作是在定义dataloader的时候,设置drop_last参数为True

torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=None, sampler=None, batch_sampler=None, num_workers=0, collate_fn=None, pin_memory=False, drop_last=False, timeout=0, worker_init_fn=None, multiprocessing_context=None, generator=None, *, prefetch_factor=None, persistent_workers=False, pin_memory_device='')


#drop_last:设置为True表示在数据量与batch_size不能被整除的情况下,删除不完整的batch数据;默认设置为False

        drop_last:设置为True表示在数据量与batch_size不能被整除的情况下,删除不完整的batch数据;默认设置为False

        官网使用drop_last函数定义:

        drop_last (booloptional) – set to True to drop the last incomplete batch, if the dataset size is not divisible by the batch size. If False and the size of dataset is not divisible by the batch size, then the last batch will be smaller. (default: False)

        参考官网定义:torch.utils.data.DataLoader

🐸解决方案3

        一般内存的设备设置 num_workers = 0 ,这个问题经常出现,还是多加小心,最多跑慢点。


🌷🌷总结

        针对尺寸报错的问题,首先检查是否是样本长宽不一致导致的,有时确实会莫名其妙出现尺寸对不上的情况,所以在送进模型之前,还是做一个【样本检查】比较安全。

        如果不是样本尺寸的问题,还报错尺寸不对,那就要怀疑是batch设置的问题了,一般最省事的办法就是直接用官网的torch.utils.data.DataLoader函数定义样本集时,设置参数为True,对于不能整除的batch直接忽略不计,这样就能保证样本能正常训练了。

        若不想舍弃样本,就得人为设置batch的时候注意保持【num-data/ batchz-size= epoch】这三个数都是整数。这样就可以保证样本万事大吉啦!

整理不易,欢迎一键三连!!!

送你们一条美丽的--分割线--


🌷🌷🍀🍀🌾🌾🍓🍓🍂🍂🙋🙋🐸🐸🙋🙋💖💖🍌🍌🔔🔔🍉🍉🍭🍭🍋🍋🍇🍇🏆🏆📸📸⛵⛵⭐⭐🍎🍎👍👍🌷🌷

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zy_destiny

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值