针对“RuntimeError: each element in list of batch should be of equal size” 问题解决

第一次运行代码出现了这个问题:
image
这个问题的出现主要来源于DataLoader类中的collate.py文件造成的问题,由于每个batch里的长度不一致,因此导致出现了该问题。
通过百度方法和查看源码去解决该问题,总结下来
他的解决方法目前来说有三种(如果你有更好的方法,欢迎在评论区留言,我们一起学习):

解决方案1:

将代码中报错地方的batch_size的值改成1,即可解决,这也是最简单的解决办法,但是这种解决办法并没有真正从根源上进行解决。他只是没有进行批处理,转化为一条提的单独处理方案。
原始代码如果为:data_loader = DataLoader(dataset,batch_size=2,shuffle=True)
我们可以改成
data_loader = DataLoader(dataset,batch_size=1,shuffle=True)

解决方案2

这个问题出现的原因我们还可以发现是我们在读取数据集的过程中每个数据的长度不一,这个时候我们就可以将读取数据的阶段进行裁剪,例如设置读取到数据的每个长度为100(可以自行设置),即在def__gettiem__中进行裁剪,或者是直接在__init__阶段读取数据的时候就进行裁剪也可以。

这种解决方案的虽然可以从根本上解决这个问题,但是由于舍弃或者是添加了一部分的词或者是特征,容易导致最终结果效果不理想。

解决方案3

这个解决方案的灵感来源于Dataset和DataLoader类的介绍 大家可以进行相应的查看。他针对这部分的讲解非常的详细,这里进行相应的借用并进行介绍。
在DataLoader里,除了上面提到的shuffle参数和batch_size参数以外,还有一个非常重要的传入参数collate_fn,这个参数传入的是一个函数,这个函数主要是对每个batch进行处理,最终输出一个batch的返回值,换句话说collate_fn函数的返回值,就是遍历DataLoader的时候每个“batch”的返回值了(类似于上面例子中的二维tensor)。下面我写一个函数,让大家看看到底是怎么处理的。

def mycollate(item):

def mycollate(item):
    sample1, sample2 = item
    return {'第一个样本':sample1,'第二个样本':sample2}
 
from torch.utils.data import DataLoader
myDataloader = DataLoader(dataset, shuffle=True, batch_size=2, collate_fn=mycollate)

  我们现在再来打印一下myDataloader的每个元素。

for batch in myDataloader:
    print(batch)
    print('==========================L()=====')

结果展示:

{'第一个样本': tensor([ 11,  16,   7,   3,   9, 100, 100, 100, 100, 100, 100, 100]), '第二个样本': tensor([  7,  16,  11, 100, 100, 100, 100, 100, 100, 100, 100, 100])}
===============================
{'第一个样本': tensor([ 3,  9, 12,  2, 17,  1, 13,  6, 10, 18,  9,  0]), '第二个样本': tensor([  4,   5,  15,  14,   8, 100, 100, 100, 100, 100, 100, 100])}
posted @ 2022-08-17 12:00  高冷的程序员大大  阅读(3893)  评论(0编辑  收藏  举报