Pytorch技巧:DataLoader的collate_fn参数使用详解


Posted in Python onJanuary 08, 2020

DataLoader完整的参数表如下:

class torch.utils.data.DataLoader(
 dataset,
 batch_size=1,
 shuffle=False,
 sampler=None,
 batch_sampler=None,
 num_workers=0,
 collate_fn=<function default_collate>,
 pin_memory=False,
 drop_last=False,
 timeout=0,
 worker_init_fn=None)

DataLoader在数据集上提供单进程或多进程的迭代器

几个关键的参数意思:

- shuffle:设置为True的时候,每个世代都会打乱数据集

- collate_fn:如何取样本的,我们可以定义自己的函数来准确地实现想要的功能

- drop_last:告诉如何处理数据集长度除于batch_size余下的数据。True就抛弃,否则保留

一个测试的例子

import torch
import torch.utils.data as Data
import numpy as np

test = np.array([0,1,2,3,4,5,6,7,8,9,10,11])

inputing = torch.tensor(np.array([test[i:i + 3] for i in range(10)]))
target = torch.tensor(np.array([test[i:i + 1] for i in range(10)]))

torch_dataset = Data.TensorDataset(inputing,target)
batch = 3

loader = Data.DataLoader(
 dataset=torch_dataset,
 batch_size=batch, # 批大小
 # 若dataset中的样本数不能被batch_size整除的话,最后剩余多少就使用多少
 collate_fn=lambda x:(
  torch.cat(
   [x[i][j].unsqueeze(0) for i in range(len(x))], 0
   ).unsqueeze(0) for j in range(len(x[0]))
  )
 )

for (i,j) in loader:
 print(i)
 print(j)

输出结果:

tensor([[[ 0, 1, 2],
   [ 1, 2, 3],
   [ 2, 3, 4]]], dtype=torch.int32)
tensor([[[ 0],
   [ 1],
   [ 2]]], dtype=torch.int32)
tensor([[[ 3, 4, 5],
   [ 4, 5, 6],
   [ 5, 6, 7]]], dtype=torch.int32)
tensor([[[ 3],
   [ 4],
   [ 5]]], dtype=torch.int32)
tensor([[[ 6, 7, 8],
   [ 7, 8, 9],
   [ 8, 9, 10]]], dtype=torch.int32)
tensor([[[ 6],
   [ 7],
   [ 8]]], dtype=torch.int32)
tensor([[[ 9, 10, 11]]], dtype=torch.int32)
tensor([[[ 9]]], dtype=torch.int32)

如果不要collate_fn的值,输出变成

tensor([[ 0, 1, 2],
  [ 1, 2, 3],
  [ 2, 3, 4]], dtype=torch.int32)
tensor([[ 0],
  [ 1],
  [ 2]], dtype=torch.int32)
tensor([[ 3, 4, 5],
  [ 4, 5, 6],
  [ 5, 6, 7]], dtype=torch.int32)
tensor([[ 3],
  [ 4],
  [ 5]], dtype=torch.int32)
tensor([[ 6, 7, 8],
  [ 7, 8, 9],
  [ 8, 9, 10]], dtype=torch.int32)
tensor([[ 6],
  [ 7],
  [ 8]], dtype=torch.int32)
tensor([[ 9, 10, 11]], dtype=torch.int32)
tensor([[ 9]], dtype=torch.int32)

所以collate_fn就是使结果多一维。

看看collate_fn的值是什么意思。我们把它改为如下

collate_fn=lambda x:x

并输出

for i in loader:
 print(i)

得到结果

[(tensor([ 0, 1, 2], dtype=torch.int32), tensor([ 0], dtype=torch.int32)), (tensor([ 1, 2, 3], dtype=torch.int32), tensor([ 1], dtype=torch.int32)), (tensor([ 2, 3, 4], dtype=torch.int32), tensor([ 2], dtype=torch.int32))]
[(tensor([ 3, 4, 5], dtype=torch.int32), tensor([ 3], dtype=torch.int32)), (tensor([ 4, 5, 6], dtype=torch.int32), tensor([ 4], dtype=torch.int32)), (tensor([ 5, 6, 7], dtype=torch.int32), tensor([ 5], dtype=torch.int32))]
[(tensor([ 6, 7, 8], dtype=torch.int32), tensor([ 6], dtype=torch.int32)), (tensor([ 7, 8, 9], dtype=torch.int32), tensor([ 7], dtype=torch.int32)), (tensor([ 8, 9, 10], dtype=torch.int32), tensor([ 8], dtype=torch.int32))]
[(tensor([ 9, 10, 11], dtype=torch.int32), tensor([ 9], dtype=torch.int32))]

每个i都是一个列表,每个列表包含batch_size个元组,每个元组包含TensorDataset的单独数据。所以要将重新组合成每个batch包含1*3*3的input和1*3*1的target,就要重新解包并打包。 看看我们的collate_fn:

collate_fn=lambda x:(
 torch.cat(
  [x[i][j].unsqueeze(0) for i in range(len(x))], 0
  ).unsqueeze(0) for j in range(len(x[0]))
 )

j取的是两个变量:input和target。i取的是batch_size。然后通过unsqueeze(0)方法在前面加一维。torch.cat(,0)将其打包起来。然后再通过unsqueeze(0)方法在前面加一维。 完成。

以上这篇Pytorch技巧:DataLoader的collate_fn参数使用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
C#返回当前系统所有可用驱动器符号的方法
Apr 18 Python
在Python的Flask框架中使用日期和时间的教程
Apr 21 Python
Python2.x版本中maketrans()方法的使用介绍
May 19 Python
Python多线程结合队列下载百度音乐的方法
Jul 27 Python
python实现QQ空间自动点赞功能
Apr 09 Python
python+selenium实现自动化百度搜索关键词
Jun 03 Python
Python+OpenCV检测灯光亮点的实现方法
Nov 02 Python
详解BeautifulSoup获取特定标签下内容的方法
Dec 07 Python
Pandas对每个分组应用apply函数的实现
Dec 13 Python
python实现黄金分割法的示例代码
Apr 28 Python
Python使用random模块实现掷骰子游戏的示例代码
Apr 29 Python
使用Python开发贪吃蛇游戏 SnakeGame
Apr 30 Python
Pytorch DataLoader 变长数据处理方式
Jan 08 #Python
pytorch实现用CNN和LSTM对文本进行分类方式
Jan 08 #Python
使用pytorch和torchtext进行文本分类的实例
Jan 08 #Python
python爬虫爬取监控教务系统的思路详解
Jan 08 #Python
Pytorch实现基于CharRNN的文本分类与生成示例
Jan 08 #Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
Jan 08 #Python
Pytorch实现神经网络的分类方式
Jan 08 #Python
You might like
聊天室php&amp;mysql(六)
2006/10/09 PHP
在PHP里得到前天和昨天的日期的代码
2007/08/16 PHP
php 根据url自动生成缩略图并处理高并发问题
2014/01/23 PHP
PHP实现通过URL提取根域名
2016/03/31 PHP
Prototype Date对象 学习
2009/07/12 Javascript
jQuery中insertBefore()方法用法实例
2015/01/08 Javascript
javascript实现捕捉键盘上按下的键
2015/05/05 Javascript
JavaScript中 ES6 generator数据类型详解
2016/08/11 Javascript
微信小程序 视图容器组件的详解及实例代码
2017/01/19 Javascript
webstorm+vue初始化项目的方法
2018/10/18 Javascript
JS实现头条新闻的经典轮播图效果示例
2019/01/30 Javascript
vue项目打包后怎样优雅的解决跨域
2019/05/26 Javascript
利用不到200行代码写一款属于你自己的js类库
2019/07/08 Javascript
Node.js操作MongoDB数据库实例分析
2020/01/19 Javascript
Vue export import 导入导出的多种方式与区别介绍
2020/02/12 Javascript
解决vue的touchStart事件及click事件冲突问题
2020/07/21 Javascript
vue表单验证之禁止input输入框输入空格
2020/12/03 Vue.js
Python中使用item()方法遍历字典的例子
2014/08/26 Python
在Python的Flask框架下使用sqlalchemy库的简单教程
2015/04/09 Python
Python中的列表生成式与生成器学习教程
2016/03/13 Python
Python排序搜索基本算法之堆排序实例详解
2017/12/08 Python
python实现二叉树的遍历
2017/12/11 Python
Python使用MD5加密算法对字符串进行加密操作示例
2018/03/30 Python
python对批量WAV音频进行等长分割的方法实现
2020/09/25 Python
python中remove函数的踩坑记录
2021/01/04 Python
html5+css3之CSS中的布局与Header的实现
2014/11/21 HTML / CSS
英国玛莎百货美国官网:Marks & Spencer美国
2018/11/06 全球购物
欧克利英国官网:Oakley英国
2019/08/24 全球购物
美国最好的葡萄酒网上商店:Wine Library
2019/11/02 全球购物
Python如何实现单例模式
2016/06/03 面试题
岗位说明书怎么写
2014/07/30 职场文书
应届生求职自荐信范文
2015/03/04 职场文书
高三教师工作总结2015
2015/07/21 职场文书
2016年秋季新学期致辞
2015/07/30 职场文书
七年级作文之环保作文
2019/10/17 职场文书
docker compose 部署 golang 的 Athens 私有代理问题
2022/04/28 Servers