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

作者:jmjackyrj 时间:2023-12-11 00:20:48 

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)方法在前面加一维。 完成。

来源:https://blog.csdn.net/weixin_42028364/article/details/81675021

标签:Pytorch,DataLoader,collate,fn
0
投稿

猜你喜欢

  • python算法与数据结构之单链表的实现代码

    2022-09-30 14:35:39
  • PHP删除数组中指定值的元素常用方法实例分析【4种方法】

    2024-06-05 09:51:58
  • 基于Python实现股票收益率分析

    2022-03-15 20:24:08
  • Go实现一个配置包详解

    2024-05-22 10:29:57
  • Python如何基于smtplib发不同格式的邮件

    2023-10-03 10:28:35
  • 记一次Oracle数据恢复过程

    2024-01-14 03:38:57
  • 讲解SQL Server海量数据导入的最快方法

    2008-12-05 16:21:00
  • Golang控制通道实现协程等待详解

    2023-07-21 16:23:39
  • Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例

    2021-12-14 16:37:30
  • ES6的循环与可迭代对象示例详解

    2024-05-02 17:25:22
  • python装饰器底层原理详解

    2021-12-31 08:48:32
  • python读取和保存图片5种方法对比

    2022-05-27 23:54:32
  • python操作excel的包(openpyxl、xlsxwriter)

    2023-05-22 09:12:07
  • python实现对象列表根据某个属性排序的方法详解

    2022-12-24 23:47:43
  • Django实现在线无水印抖音视频下载(附源码及地址)

    2021-07-09 11:24:43
  • 如何在MySQL查询结果集中得到记录行号

    2008-12-17 15:00:00
  • MySQL获取所有分类的前N条记录

    2024-01-21 09:39:27
  • 用户"sa"登陆失败 SQLServer 错误18456的解决方法

    2024-01-18 18:04:37
  • Python自动化测试基础必备知识点总结

    2021-11-11 22:07:07
  • Seaborn数据分析NBA球员信息数据集

    2021-06-27 03:36:04
  • asp之家 网络编程 m.aspxhome.com