Pytorch中DataLoader的使用[通俗易懂]

Pytorch中DataLoader的使用[通俗易懂]前言最近开始接触pytorch,从跑别人写好的代码开始,今天需要把输入数据根据每个batch的最长输入数据,填充到一样的长度(之前是将所有的数据直接填充到一样的长度再输入)。刚开始是想偷懒,没有去认真了解输入的机制,结果一直报错…还是要认真学习呀!加载数据pytorch中加载数据的顺序是:①创建一个dataset对象②创建一个dataloader对象③循环dataloader对象,将data,label拿到模型中去训练dataset你需要自己定义一个class,里面至少包含3个函数:①_

大家好,又见面了,我是你们的朋友全栈君。

前言

最近开始接触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

结果:
在这里插入图片描述

最后循环该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://javaforall.net/133122.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 反应java程序并行机制的特点_【单选题】Java语言具有许多优点和特点,反映了Java程序并行机制的特点的是( )…

    反应java程序并行机制的特点_【单选题】Java语言具有许多优点和特点,反映了Java程序并行机制的特点的是( )…【单选题】Java语言具有许多优点和特点,反映了Java程序并行机制的特点的是()更多相关问题妊娠小便不通,或频数量少,小腹胀急疼痛,坐卧不宁,面色晄白,头重眩晕,短气懒言,大便不爽,舌淡在WDM传输中,色散的有利和有害的影响有哪些?一般可采用什么方法抑制色散的负面影响?下述哪项与妊娠小便不通的特点不符()A.妊娠期间,小便频数量少B.小便不通C.小腹胀急而痛D.烦以下各项中,属于市场调查过程中…

    2022年7月7日
    29
  • windows下的pycharm配置 linux环境

    windows下的pycharm配置 linux环境由于最近学习python的需要,为了方便程序的调试,尝试在Windows下的Pycharm远程连接到虚拟机中Centos下的python环境。(这里我采用的是ssh的远程连接)1、准备工作:固定ce

    2022年7月6日
    24
  • 如何将ts格式文件转成MP4格式文件

    如何将ts格式文件转成MP4格式文件这里写自定义目录标题欢迎使用 Markdown 编辑器新的改变功能快捷键合理的创建标题 有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中 居左 居右 SmartyPants 创建一个自定义列表如何创建一个注脚注释也是必不可少的 KaTeX 数学公式新的甘特图功能 丰富你的文章 UML 图表 FLowchart 流程图导出与导入导出导入欢迎使用 Ma

    2025年11月14日
    2
  • 001 – 配置Pycharm的字体大小[通俗易懂]

    001 – 配置Pycharm的字体大小[通俗易懂]本文记录的是Pycharm2017年1月版本1配置代码区的字体大小位置在 File->setting-> Editor->Color&Fo

    2022年7月5日
    28
  • java怎么输入字符_java怎么输入一个字符

    java怎么输入字符_java怎么输入一个字符思路:先创建一个Scanner对象,调用Scanner对象的next()方法获取控制台输入的字符串,返回的是一个String类型,因为没有nextChar()方法,所以调用String的charAt(0)方法获取第一个字符,这样一来,我们就输入了一个字符串。输入一个字符的方法:importjava.util.Scanner;Scannerscanner=newScanner(System…

    2022年7月8日
    30
  • C语言scanf函数详解

    C语言scanf函数详解

    2021年12月9日
    39

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号