首页 > 其他分享 >针对“RuntimeError: each element in list of batch should be of equal size” 问题解决

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

时间:2022-08-17 12:15:54浏览次数:127  
标签:样本 tensor RuntimeError DataLoader list batch 100 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])}

标签:样本,tensor,RuntimeError,DataLoader,list,batch,100,size
From: https://www.cnblogs.com/danieldaren/p/16594630.html

相关文章

  • HTML5中datalist的用法
    <datalist>控件可以为输入框提供一些备选选项,当用户输入的内容与备选选项文字相同时,将会显示智能感应注:此时的option为单标签<inputtype='text'list='province-list'......
  • 集合之list、set及数据结构简述
    List接口和常用方法区别于collection方法,list接口方法只能list及其子接口能调用,collection、set等无法调用List接口是Collection接口的子接口List集合类中元素有序且......
  • redis list
    list列表相当于java中list集合特点元素有序此有序指插入时顺序且可以重复,key还是一个字符串,值是一个list   类似于c中的栈 先入后出  可以lpush和rp......
  • Delphi 让Listview中的item可以显示不同的颜色
    procedureTFormAlissaA.ListViewAAdvancedCustomDrawItem(Sender:TCustomListView;Item:TListItem;State:TCustomDrawState;Stage:TCustomDrawStage;varDefault......
  • ListAndSetAndDataStructure
    数据结构:概念:程序当中组织和存储数据的一种方式算法:解决问题的一种办法,如何快速的查找数据/修改数据/删除数据/添加数据常见的数据结构:8种数组、链......
  • 前端 - browserslist 的 not dead 规则是什么
    一、browserslist什么用于指定浏览器范围。你会发现有package.json文件里的browserslist字段(或一个单独的.browserslistrc文件),指定了项目的目标浏览器的范围。这......
  • 获取域中存储List集合、Map集合的值
    获取域中存储List集合和Map集合的值list集合:${域名称.键名[索引]}jsp代码<%@pageimport="java.util.ArrayList"%><%@pagecontentType="text/html;charset=UTF-8......
  • json格式转为List集合
    一、JSON格式{"code":"200","msg":"success","data":["Yinqing","ArtCreativity"]}二、json格式转为List集合代码@Testpublicvoidtest(){String......
  • Redis常用指令之string、list、set、zset、hash
    Redis之五大类型常用指令redis的一些小知识redis服务器端口默认是6379在编译完成后的bin目录下启动服务端:redis-server客户端连接操作:redis-cli-hlocalhost-p......
  • EL_获取域中存储的值_List集合&Map集合值
    List集合:${域名称.键名[索引]}例如${requestScope.list.get(0)}<%@pageimport="java.util.ArrayList"%><%@pagecontentType="text/html;charset=UTF-8"lang......