Pytorch中DataLoader的使用方法详解

作者:生信小兔 时间:2023-07-19 04:45:39 

在Pytorch中,torch.utils.data中的Dataset与DataLoader是处理数据集的两个函数,用来处理加载数据集。通常情况下,使用的关键在于构建dataset类。

一:dataset类构建。

在构建数据集类时,除了__init__(self),还要有__len__(self)与__getitem__(self,item)两个方法,这三个是必不可少的,至于其它用于数据处理的函数,可以任意定义。

class dataset:
   def __init__(self,...):
       ...
   def __len__(self,...):
       return n
   def __getitem__(self,item):
       return data[item]

正常情况下,该数据集是要继承Pytorch中Dataset类的,但实际操作中,即使不继承,数据集类构建后仍可以用Dataloader()加载的。

在dataset类中,__len__(self)返回数据集中数据个数,__getitem__(self,item)表示每次返回第item条数据。

二:DataLoader使用

在构建dataset类后,即可使用DataLoader加载。DataLoader中常用参数如下:

1.dataset:需要载入的数据集,如前面构造的dataset类。

2.batch_size:批大小,在神经网络训练时我们很少逐条数据训练,而是几条数据作为一个batch进行训练。

3.shuffle:是否在打乱数据集样本顺序。True为打乱,False反之。

4.drop_last:是否舍去最后一个batch的数据(很多情况下数据总数N与batch size不整除,导致最后一个batch不为batch size)。True为舍去,False反之。

三:举例

兔兔以指标为1,数据个数为100的数据为例。

import torch
from torch.utils.data import DataLoader

class dataset:
   def __init__(self):
       self.x=torch.randint(0,20,size=(100,1),dtype=torch.float32)
       self.y=(torch.sin(self.x)+1)/2
   def __len__(self):
       return 100
   def __getitem__(self, item):
       return self.x[item],self.y[item]
data=DataLoader(dataset(),batch_size=10,shuffle=True)
for batch in data:
   print(batch)

当然,利用这个数据集可以进行简单的神经网络训练。

from torch import nn
data=DataLoader(dataset(),batch_size=10,shuffle=True)
bp=nn.Sequential(nn.Linear(1,5),
                nn.Sigmoid(),
                nn.Linear(5,1),
                nn.Sigmoid())
optim=torch.optim.Adam(params=bp.parameters())
Loss=nn.MSELoss()
for epoch in range(10):
   print('the {} epoch'.format(epoch))
   for batch in data:
       yp=bp(batch[0])
       loss=Loss(yp,batch[1])
       optim.zero_grad()
       loss.backward()
       optim.step()

ps:下面再给大家补充介绍下Pytorch中DataLoader的使用。

前言

最近开始接触pytorch,从跑别人写好的代码开始,今天需要把输入数据根据每个batch的最长输入数据,填充到一样的长度(之前是将所有的数据直接填充到一样的长度再输入)。
刚开始是想偷懒,没有去认真了解输入的机制,结果一直报错…还是要认真学习呀!

加载数据

pytorch中加载数据的顺序是:
①创建一个dataset对象
②创建一个dataloader对象
③循环dataloader对象,将data,label拿到模型中去训练

dataset

你需要自己定义一个class,里面至少包含3个函数:
①__init__:传入数据,或者像下面一样直接在函数里加载数据
②__len__:返回这个数据集一共有多少个item
③__getitem__:返回一条训练数据,并将其转换成tensor

import torch
from torch.utils.data import Dataset
class Mydata(Dataset):
   def __init__(self):
       a = np.load("D:/Python/nlp/NRE/a.npy",allow_pickle=True)
       b = np.load("D:/Python/nlp/NRE/b.npy",allow_pickle=True)
       d = np.load("D:/Python/nlp/NRE/d.npy",allow_pickle=True)
       c = np.load("D:/Python/nlp/NRE/c.npy")
       self.x = list(zip(a,b,d,c))
   def __getitem__(self, idx):

assert idx < len(self.x)
       return self.x[idx]
   def __len__(self):

return len(self.x)

dataloader

参数:
dataset:传入的数据
shuffle = True:是否打乱数据
collate_fn:使用这个参数可以自己操作每个batch的数据

dataset = Mydata()
dataloader = DataLoader(dataset, batch_size = 2, shuffle=True,collate_fn = mycollate)

下面是将每个batch的数据填充到该batch的最大长度

def mycollate(data):
       a = []
       b = []
       c = []
       d = []
       max_len = len(data[0][0])
       for i in data:
           if len(i[0])>max_len:
               max_len = len(i[0])
           if len(i[1])>max_len:
               max_len = len(i[1])
           if len(i[2])>max_len:
               max_len = len(i[2])
       print(max_len)
       # 填充
       for i in data:
           if len(i[0])<max_len:
               i[0].extend([27] * (max_len-len(i[0])))
           if len(i[1])<max_len:
               i[1].extend([27] * (max_len-len(i[1])))
           if len(i[2])<max_len:
               i[2].extend([27] * (max_len-len(i[2])))  
           a.append(i[0])
           b.append(i[1])
           d.append(i[2])
           c.extend(i[3])
       # 这里要自己转成tensor
       a = torch.Tensor(a)
       b = torch.Tensor(b)
       c = torch.Tensor(c)
       d = torch.Tensor(d)
       data1 = [a,b,d,c]
       print("data1",data1)
       return data1

结果:

Pytorch中DataLoader的使用方法详解

最后循环该dataloader ,拿到数据放入模型进行训练:

for ii, data in enumerate(test_data_loader):

if opt.use_gpu:
           data = list(map(lambda x: torch.LongTensor(x.long()).cuda(), data))
       else:
           data = list(map(lambda x: torch.LongTensor(x.long()), data))

out = model(data[:-1]) #数据data[:-1]
       loss = F.cross_entropy(out, data[-1])# 最后一列是标签

写在最后:建议像我一样刚开始不太熟练的小伙伴,在处理数据输入的时候可以打印出来仔细查看。

来源:https://blog.csdn.net/weixin_60737527/article/details/126754254

标签:Pytorch,DataLoader
0
投稿

猜你喜欢

  • python3使用pandas获取股票数据的方法

    2023-01-04 15:01:15
  • python使用pymongo操作mongo的完整步骤

    2023-07-12 20:31:21
  • PHP实现简易计算器功能

    2024-05-11 09:25:27
  • Firefox Bug: inline/inline-block的间隙

    2009-11-03 13:20:00
  • 在Python 的线程中运行协程的方法

    2021-03-10 18:06:38
  • python中argparse模块基础及使用步骤

    2023-01-26 19:21:59
  • 存储过程优缺点分析

    2012-04-13 11:39:56
  • Go语言实现二进制与十进制互转的示例代码

    2024-02-08 09:31:15
  • 如何利用JS将手机号中间四位变成*号

    2024-02-23 20:07:51
  • MySQL设置global变量和session变量的两种方法详解

    2024-01-20 23:34:16
  • 200行代码实现blockchain 区块链实例详解

    2024-05-02 16:28:46
  • 25个值得收藏的Python文本处理案例

    2022-06-19 15:38:29
  • Python使用微信itchat接口实现查看自己微信的信息功能详解

    2021-07-29 16:07:20
  • python tkinter canvas使用实例

    2021-07-11 23:49:50
  • 注册表单的细节问题

    2008-05-24 08:43:00
  • Python图像处理之颜色的定义与使用分析

    2023-03-01 21:07:05
  • SQL CASE 表达式的具体使用

    2024-01-28 09:57:29
  • Python基于time模块求程序运行时间的方法

    2023-07-27 15:59:03
  • MySQL高效导入多个.sql文件方法详解

    2024-01-20 19:10:44
  • 基于Python实现自制拼图小游戏

    2021-12-01 03:25:01
  • asp之家 网络编程 m.aspxhome.com