dl学习笔记(9):pytorch数据处理的完整流程

embedded/2025/2/8 16:40:13/

1)自动导入常用库的设置方式

在开始之前,这里介绍一下自动导入常用的你需要加载的库的操作方式。

首先在我们的目录下找到ipython文件,如下图:

然后找到里面的startup文件:

然后新建一个文本文档,输入你每次要导入的库的代码,例子如下:

注意这里要符合python的缩进格式。然后改名字为start.py

然后我们重启一下kernel或者随便新建一个python文件来验证是否成功导入

如果结果如上图所示没有导入任何库直接能调用说明已经自动导入成功。

2)手动实现简单数据生成函数

为了后续做实验的方便,我们需要手动实现一个自己的数据生成函数。当我们可以自定义数据生成的规律,我们将数据喂给模型就可以判断模型是否掌握了我们定义的规律,从而判断模型的性能,这也是从炼丹师进步到化学家的必经之路。

下面我们以最简单的回归类数据集来举例:

def TensorGenRe(num_examples=1000,w=[2,1,1],bias=True,delta=0.01,deg=1):'''回归类数据集创建函数1 num_examples:创建数据集的数据量2 w:包括截距的(如果存在)特征系数向量3 bias:是否需要截距4 delta:扰动项取值5 deg 方程的最高次数'''if bias == True:#如果有偏差项,最后一位是b应该从特征张量中舍去num_inputs = len(w)-1 #这里一律用标注正太分布举例features_true = torch.randn(num_examples,num_inputs)#这里由于最后一列是偏差所以去掉,然后转化为列向量,最后由于后面要进行矩阵乘法所以转化为浮点数w_true = torch.tensor(w[:-1]).reshape(-1,1).float()b_true = torch.tensor(w[-1]).float()#这里需要判断是否只有一列,决定了是用矩阵乘法还是简单的powif num_inputs == 1:labels_true=torch.pow(features_true, deg)* w_true + b_trueelse:labels_true = torch.mm(torch.pow(features_true, deg),w_true)+ b_true#这里需要加上一列1,为了方便后续的矩阵乘法,相当于w*x+1*bfeatures = torch.cat((features_true, torch.ones(len(features_true), 1)),1)#最后乘以扰动项的系数deltalabels= labels_true + torch.randn(size = labels_true.shape)* deltaelse:#下面的逻辑和上面一样num_inputs=len(w)features =torch.randn(num_examples,num_inputs)w_true =torch.tensor(w).reshape(-1,1).float()if num_inputs == 1:labels_true =torch.pow(features,deg)*w_trueelse:labels_true =torch.mm(torch.pow(features, deg),w_true)labels = labels_true + torch.randn(size= labels_true.shape)* deltareturn features, labels

关于上面代码的解释写在注释里面,另外需要注意的是上面这个函数不能实现含有交叉项的方程,下面我们可以尝试调用实验一下:

我们可以通过画图来验证结果:

#绘制图像查看结果
plt.subplot(223)
plt.scatter(features[:,0],labels)#第一个特征和标签的关系
plt. subplot(224)
plt.scatter(features[:, 1],labels)#第二个特征和标签的关系

3)手动实现训练集和测试集的切分

def data_split(features,labels,rate=0.7):#rate是训练集占所有数据的比例num_examples = len(features)#这里是创建一个数据集的行索引列表indices = list(range(num_examples))#通过打乱索引,然后再映射到原数据集实现随机random.shuffle(indices)num_train = int(num_examples*rate)#由于这里已经打乱过了所以直接选前num_train个就行indices_train = torch.tensor(indices[:num_train])indices_test = torch.tensor(indices[num_train:])x_train = features[indices_train]y_train = labels[indices_train]x_test = features[indices_test]y_test = labels[indices_test]return x_train,y_train,x_test,y_test

我们可以做一个简单的调用来验证一下:

4)再谈Dataset和Dataloader

random_split函数:

我们发现pytorch内置的split函数返回的不是数据的实体张量,而是两个迭代器,这其实和pytorch设计哲学有关。当我们处理海量数据的时候,如果我们直接分别存储训练集和测试集的两部分实体数据会非常占用内存和计算资源。在很多教程中数据集划分过程会推荐使用scikit-learn中的train_test_split函数,该函数就是直接存储数据实体,对于初学者更加友好一点。所以这里pytorch并没有真正的实际存储,而是和上面我们手动实现的一样,是进行映射处理成迭代器,我们可以通过和之前一样的循环操作来遍历打印出来。

下面我们回顾一下之前的流程:

我们之前就说dataset是用来进行打包封装操作的,可以发现下面返回的也是一个dataset的一个子类TensorDataset,同样也是一个生成器。这是一个可以用来在上下文环境中互相传的子类,例如可以接着给dataloader,所以在整个pytorch的流程中都是以类迭代器的方式流动的,而并不是以数据实体进行流动。但是这个函数只能用来封装tensor,并不能用来封装更一般的数据类型。

下面用一个库里面有的乳腺癌数据集的例子来说明如何处理一般情况的数据集:

我们还是一样地可以通过data和target来查看特征和标签

下面我们通过创建一个新的dataset子类,并且重写其中的几个方法来实现一般数据的封装

class LBCDataset(Dataset):def __init__(self, data):self.features = data.dataself.labels = data.targetself.lens = len(data.data)# 输入index数值,方法最终返回index对应的特征和下标def __getitem__ (self,index):return self.features[index,:], self.labels[index]def __len__(self):return self.lens

下面我们用random_split来进行切分:

当我们查看LBC_train会发现它只有dataset和indices两个属性,同样的,是一个映射式的对象,其中dataset属性用于查看原数据集对象,indices属性用于查看切分后数据集的每一条数据的index

我们可以分别调用查看:

下面我们来看dataloader:

我们会发现一个有意思的地方,这里的dataset属性返回的其实是LBC_train,也就是说这里的dataset属性存在一种类似于回溯的还原机制。

最后我们用一张图来总结上面的流程:


http://www.ppmy.cn/embedded/160574.html

相关文章

如何挑选最适合您需求的智能氮气柜:七大关键因素沐渥科技详解

挑选智能氮气柜时,您需要考虑以下几个关键因素,以确保选择最适合您需求的设备: 1.湿度控制范围 根据您需要存储的物品对湿度敏感度的要求来确定所需的湿度控制范围。一些高端产品可以将内部湿度降至极低水平(如1%RH或更低&#xf…

【文件上传、秒传、分片上传、断点续传、重传】

文章目录 获取文件对象文件上传&#xff08;秒传、分片上传、断点续传、重传&#xff09;优化 获取文件对象 input标签的onchange方法接收到的参数就是用户上传的所有文件 <html lang"en"><head><title>文件上传</title><style>#inp…

OpenCV:图像修复

目录 简述 1. 原理说明 1.1 Navier-Stokes方法&#xff08;INPAINT_NS&#xff09; 1.2 快速行进方法&#xff08;INPAINT_TELEA&#xff09; 2. 实现步骤 2.1 输入图像和掩膜&#xff08;Mask&#xff09; 2.2 调用cv2.inpaint()函数 2.3 完整代码示例 2.4 运行结果 …

三格电子-单串口服务器说明

一、产品介绍 1.1 功能简介 SG-TCP232-110 是一款用来进行串口数据和网口数据转换的设备。解决普通 串口设备在 Internet 上的联网问题。 设备的串口部分提供一个 232 接口和一个 485 接口&#xff0c;两个接口内部连接&#xff0c;同 时只能使用一个口工作。 设 备 的网 口…

Unity 简易的UI框架

核心内容 UIType.cs namespace MYTOOL.UI {/// <summary>/// UI层级/// </summary>public enum UILayer{/// <summary>/// 主界面层/// </summary>MainUI 0,/// <summary>/// 普通界面层/// </summary>NormalUI 1,/// <summary>/…

C语言:函数栈帧的创建和销毁

目录 1.什么是函数栈帧2.理解函数栈帧能解决什么问题3.函数栈帧的创建和销毁的过程解析3.1 什么是栈3.2 认识相关寄存器和汇编指令3.3 解析函数栈帧的创建和销毁过程3.3.1 准备环境3.3.2 函数的调用堆栈3.3.3 转到反汇编3.3.4 函数栈帧的创建和销毁 1.什么是函数栈帧 在写C语言…

Hypium+python鸿蒙原生自动化安装配置

Hypiumpython自动化搭建 文章目录 Python安装pip源配置HDC安装Hypium安装DevEco Testing Hypium插件安装及使用方法​​​​​插件安装工程创建区域 Python安装 推荐从官网获取3.10版本&#xff0c;其他版本可能出现兼容性问题 Python下载地址 下载64/32bitwindows安装文件&am…

osclass增加支持webp格式

1、basic_data.sql 数据表&#xff1a;t_preference中的(osclass, allowedExt, png,gif,jpg,jpeg, STRING)&#xff0c;添加&#xff1a;png,gif,jpg,jpeg,webp 2、includes/osclass/mimes.php webp > image/webp, 3、includes/osclass/classes/ImageProcessing.php 修…