Pytorch框架应用系列 之 BPNet 5-3:训练准备!数据集建立与载入!

专题介绍及文章命名

专题介绍在此!希望各位读者对这个专题的各篇博客定位有全局性质的把握~~

再次提醒:该系列专题不涉及网络细节讲解,仅限于 工程实现框架学习。想更多了解该专题内容请点击上文专题介绍链接。

该专题中,文章命名方式为:

Pytorch框架应用系列 之 《项目名称》 《总章节-当前章节》:《当前章节项目名称》

BP网络专题综述在此!想了解BP网络章节的文章构成?点击此处!

目录

一. Excel 格式数据集的建立
1.1 数据建立操作 之 Excel数据创建《子任务章节》
  1.1.1 第一步:Excel 操作函数:openpyxl.load_workbook;
  1.1.2 第二步:Excel 类属性:.sheetnames;
  1.1.3 第三步:Excel 赋值与数据写入;
  1.1.4 第四步:Excel 数据的保存:.save;
  1.1.5 数据创建完整代码;

二. Excel 格式数据集的读取
2.1 数据读取操作 之 Excel数据读取与格式转化;
  2.1.1 第一步:打开Excel并载入指定Sheet;
  2.1.2 第二步:将数据存入ndarray数组;
  2.1.3 第三步:数据归一化并转为Tensor格式;
  2.1.4 第四步:将数据进行封装,变为可迭代数据集;
  2.1.5 数据集载入与格式转换完整代码;

三. 专题及章节位置信息查询

一. Excel 格式数据集的建立

1.1 数据建立操作 之 Excel数据创建《子任务章节》

本章节的子任务为 给我一个二次函数!还你一个数据集!

Excel表格大家应该都不陌生,由于该表格被大多数文案工作者所接受,所以本篇文章第一部分就带领大家创建一个简单的Excel数据集。目的是方便大家从一些文案工作者手中获取预测数据做一些预测工作。

注意:

  1. 进行操作前需要 import openpyxl 模块;
  2. 进行操作前需要 import random 模块;

从整体上看,创建数据集的步骤分为以下 四步

1.1.1 第一步:Excel 操作函数:openpyxl.load_workbook;

该函数比较简单好理解,直接打开一个任意路径下的 .xlsx 格式的 Excel 文件,打开后的文件会被处理成一个 类对象,即下面代码中的 TrainDataTestData 为两个类对象。

第一步,我们需要在 自己希望 的路径下创建两个空白的 .xlsx 格式的表格,一个作为训练数据,一个作为测试数据。打开两个 空白 的Excel表格例子如下:

#读取excel
TrainData = openpyxl.load_workbook("F:\\Python\\Pytorch\\Coordinate\\二次函数训练集.xlsx")
TestData  = openpyxl.load_workbook("F:\\Python\\Pytorch\\Coordinate\\二次函数测试集.xlsx")

1.1.2 第二步:Excel 类属性:.sheetnames;

第二步,代码由2部分组成。第一部分是获取表格的所有的 sheetname;第二部分是获取具体某一个我们需要写入数据的 sheetname。如果你问我sheetname是啥,截图如下:

每一个Excel表格文件中可以有很多 “页”,如果是个空白Excel表格,一般只有一个Sheet1。对表格操作的时候我们需要指定究竟在哪一个 Sheet 页面进行数据写入,获取表格 所有 “页” 的定义方式如下:

#获取excel所有的sheet(第一部分)
Trainsheets = TrainData.sheetnames
Testsheets  = TestData.sheetnames

获取到的 Sheetname 均以 List列表 形式进行存储,即上述代码中:TrainsheetsTestsheets 均为列表。在这之后我们需要指定 具体某一个 “页” 进行数据的写入,我们以Sheet1为例子:

#获取Sheetnames中的第一个(第二部分)
Trainsheet = TrainData[Trainsheets[0]]
Testsheet  = TestData[Testsheets[0]]

1.1.3 第三步:Excel 赋值与数据写入;

第三步,代码由2部分组成。第一部分是定义我们所要模拟的函数 x 2 x^2 x2第二部分是通过调用第一部分中定义的函数,创建随机的坐标点用作训练集,再创建随机的坐标点用作测试集。我们假设训练集有10000个坐标点,测试集有500个坐标点,函数 x 2 x^2 x2 定义方式如下:

#创建待模拟函数(第一部分)
def data_generator(x):
    return (pow(x,2))

其次是在打开的Sheet1中对应位置写入数据,训练集和测试集的例子分别如下:

#生成训练集数据(第二部分)
for i in range(10000):
    X = random.uniform(-10,10)
    Y = data_generator(X)
    #A列存入自变量
    Trainsheet['A' + str(i + 1)] = X
    #B列存入因变量
    Trainsheet['B' + str(i + 1)] = Y
#生成测试集数据(第二部分)
for i in range(500):
    X = random.uniform(-10,10)
    Y = data_generator(X)
    #A列存入自变量
    Testsheet['A' + str(i + 1)] = X
    #B列存入因变量
    Testsheet['B' + str(i + 1)] = Y

首先,解释一下上述代码中的 random.uniform(-10,10)。该代码的意思是在 [-10,10] 的单位内随机生成一个实数。由于 y = x 2 y = {x^2} y=x2 函数自变量 x x x 的取值范围为 ( − ∞ , + ∞ ) ( - \infty , + \infty ) (,+) ,理论上有无穷多个坐标点,但在实际应用过程中,我们不可能取到所有坐标点作为训练集,所以需要截断一个范围来制定数据样本,在本例子中函数的截取范围就是 [-10,10]。相应的,测试样本也要在 [-10,10] 这个范围中进行选择才有意义。

其次,解释一下代码中的 Trainsheet[‘A’ + str(i + 1)] = X,该格式的赋值方式在上述代码中一共有四项,实现的功能就是在Excel表格中指定的位置存入相应的数据。Excel表格的格式如下:

红色框的位置为A1,蓝色框的位置为B3,所以 Trainsheet[‘A’ + str(i + 1)] = X 中的 [‘A’ + str(i + 1)] 即指定了具体某一个位置,当循环中的 i=1 时,[‘A’ + str(i + 1)] 所表示的位置就是 [‘A1’]

1.1.4 第四步:Excel 数据的保存:.save;

数据保存内容只有一行,也不过多解释,指定路径和文件名即可,示例如下:

#保存文件
TrainData.save(filename = "F:\\Python\\Pytorch\\Coordinate\\二次函数训练集.xlsx")
TestData.save(filename = "F:\\Python\\Pytorch\\Coordinate\\二次函数测试集.xlsx")

1.1.5 数据创建完整代码;

import openpyxl
import random


#读取excel
TrainData = openpyxl.load_workbook("F:\\Python\\Pytorch\\Coordinate\\二次函数训练集.xlsx")
TestData  = openpyxl.load_workbook("F:\\Python\\Pytorch\\Coordinate\\二次函数测试集.xlsx")

#获取excel所有的sheet
Trainsheets = TrainData.sheetnames
Testsheets  = TestData.sheetnames

#获取表格对象中的第一个
Trainsheet = TrainData[Trainsheets[0]]
Testsheet  = TestData[Testsheets[0]]
print(type(Testsheet))

#定义数据产生器函数
def data_generator(x):
    return (pow(x,2))

#生成数据
for i in range(10000):
    X = random.uniform(-10,10)
    Y = data_generator(X)
    #A列存入自变量
    Trainsheet['A' + str(i + 1)] = X
    #B列存入因变量
    Trainsheet['B' + str(i + 1)] = Y

TrainData.save(filename = "F:\\Python\\Pytorch\\Coordinate\\二次函数训练集.xlsx")

for i in range(500):
    X = random.uniform(-10,10)
    Y = data_generator(X)
    #A列存入自变量
    Testsheet['A' + str(i + 1)] = X
    #B列存入因变量
    Testsheet['B' + str(i + 1)] = Y

TestData.save(filename = "F:\\Python\\Pytorch\\Coordinate\\二次函数测试集.xlsx")

至此,数据集创造部分结束,有兴趣的同学可以打开相应Excel文件将产生数据画个散点图看看结论。

二. Excel 格式数据集的读取

2.1 数据读取操作 之 Excel数据读取与格式转化;

数据读取操作与数据创造操作不同之处在于读取数据之后的 数据格式转换。由于Pytorch框架搭建完毕后参与计算的数据格式为 Tensor类型,所以在读取Excel表格数据之后必须经过一系列的 包装格式对齐 才能被模型所接受。从整体上看,数据读取可分为以下步骤:

注意:

  1. 进行操作前需要 import openpyxl 模块;
  2. 进行操作前需要 numpy 模块;

2.1.1 第一步:打开Excel并载入指定Sheet;

由于该部分和数据创建类似,不再做重复讲解,细节请看1.1.1章节和1.1.2章节。直接给出代码:

TrainData = openpyxl.load_workbook("F:\\Python\\Pytorch\\Coordinate\\二次函数训练集.xlsx")
TestData  = openpyxl.load_workbook("F:\\Python\\Pytorch\\Coordinate\\二次函数测试集.xlsx")
#获取excel所有的sheet
Trainsheets = TrainData.sheetnames
Testsheets  = TestData.sheetnames
#获取表格对象中的第一个
Trainsheet = TrainData[Trainsheets[0]]
Testsheet  = TestData[Testsheets[0]]

2.1.2 第二步:将数据存入ndarray数组;

该步骤由3个部分组成,需要介绍3个主要的操作方法。第一部分,在创建ndarray的时候,需要指定数组长度。为了确定数组长度,需要获得数据集中存储数据的数量,这时需要用到两个 openpyxl 模块中的基本方法:class.max_rowclass.max_column。这两个方法用来获得Excel表格中存储数据的表格部分的最大行数和列数,返回 int 类型的数据,调用方式如下:

#获取表格数据的最大行
TrainNumb = Trainsheet.max_row
TestNumb  = Testsheet.max_row

第二部分,建立指定大小的ndarray数组,并指定数据类型。需要用到numpy库中的数组创建函数 numpy.zeros(size,dtype)。该方法创建的数组会直接将所有数据初始化为 0,同样类似的方法还有 numpy.ones(size,dtype),会将创建完毕的数组初始化为 1。该方法的主要参数有两个,一个是数组尺寸 ,一个是数据类型。我们共创建4个数组用来存储测试和训练的数据,分别是训练集的自变量X,训练集的因变量Y,测试集的自变量X,测试集的因变量Y,方法细节如下:

#创建数组容器,准备存储表格数据,尺寸为 1 行,TrainNumb/TestNumb列;
TrainDataArrayX = np.zeros([1,TrainNumb],dtype=float)
TrainDataArrayY = np.zeros([1,TrainNumb],dtype=float)
TestDataArrayX  = np.zeros([1,TestNumb],dtype=float)
TestDataArrayY  = np.zeros([1,TestNumb],dtype=float)

第三部分,读取Excel表格数据。读取 Excel 表格某一个具体小方格数据的函数为 class.cell(row,col).value,其中 rowcol 分别表示表格中的 某一行某一列,调用细节如下:

#Excel读取数据存入ndarray
for i in range(TrainNumb):
    TrainDataArrayX[0][i] =  Trainsheet.cell(row = (i + 1),column=1).value 
    TrainDataArrayY[0][i] =  Trainsheet.cell(row = (i + 1),column=2).value

#Excel读取数据存入ndarray
for j in range(TestNumb):
    TestDataArrayX[0][j] =  Testsheet.cell(row = (j + 1),column=1).value 
    TestDataArrayY[0][j] =  Testsheet.cell(row = (j + 1),column=2).value

通过上面的步骤我们就完成了将Excel表格中的所有数据存储到了程序中的四个numpy数组中的操作。

2.1.3 第三步:数据归一化并转为Tensor格式;

该步骤主要由2个部分组成,第一部分,先指定数据的归一化格式。我们将已经创造好的数据集映射到[0,1]的区间内,采用的归一化函数为:

其中,minmax 代表 data 数据所在的数据集中的最小值和最大值。在ndarray中,取得一个数组中最大值和最小值的方法为 numpy.amin(ndarray)numpy.amax(ndarray),归一化函数及归一化后的数据集代码实现如下:

#归一化函数代码
def minmaxscaler(data):
    min = np.amin(data)
    max = np.amax(data)    
    return (data - min)/(max-min)

#数据集归一化
Norm_TrainDataArrayX = minmaxscaler(TrainDataArrayX[0])
Norm_TrainDataArrayY = minmaxscaler(TrainDataArrayY[0])
Norm_TestDataArrayX  = minmaxscaler(TestDataArrayX[0])
Norm_TestDataArrayY  = minmaxscaler(TestDataArrayY[0])

由于TrainDataArrayX,TrainDataArrayY,TestDataArrayX,TestDataArrayY 四个数组均为 1 行,所以索引时仅有一个元素,方括号内索引为 0 。

第二部分,将ndarray数组转化为Tensor格式。在开始这部分之前,先跟大家聊聊数据的转换方式。

不知道有没有小伙伴有这样的疑问:为什么Excel表格的数据读取出来不存入List,然后用List转Tensor?List类型不能转Tensor吗? 为啥非得需要经过一个ndarray?你为啥用ndarray接数据?

这里跟大家说说 博主个人 的见解(个人见解,高手若有专业回答希望留言指正~万分感谢!)。因为List类型是Python语言的官方类型,所以相信刚学Python语言的小伙伴都对这个List相当的熟悉,从内心是有些抵触ndarray这个东西的。但是大家要清楚,列表终归是列表,和数组是有本质区别的。numpy库中所支持的东西不仅仅是一个ndarray格式的问题,他里面包含很多数组的运算函数,比如矩阵相乘,矩阵转置等数学操作。而列表要完成相应的功能是需要进行 for 循环来指定运算规则的。比如当你读入的数据需要经过一系列数学操作来完成数据处理,那么numpy库会帮你节省大量的时间,所以我们才选择ndarray作为操作中介。但若是想 单纯的理清转换关系的话,其实是三者都可以互相转化的:

说完插曲,我们继续话题。根据上面的图标,从 ndarray 转为 tensor 需要调用方法为 torch.from_numpy()。直接给出调用方法如下:

#将数据从ndarray转化为tensor
Tensor_TraindataX = torch.from_numpy(Norm_TrainDataArrayX)
Tensor_TraindataY = torch.from_numpy(Norm_TrainDataArrayY)
Tensor_TestdataX  = torch.from_numpy(Norm_TestDataArrayX)
Tensor_TestdataY  = torch.from_numpy(Norm_TestDataArrayY)

需要注意的是,此时从numpy中转换出来的Tensor格式为float64。而Tensor模型计算能接受的默认参数为float32格式,所以我们还需要做一个float类型的位宽转换,方法如下:

#转换为float32格式
Tensor_TraindataX = Tensor_TraindataX.to(torch.float32)
Tensor_TraindataY = Tensor_TraindataY.to(torch.float32)
Tensor_TestdataX  = Tensor_TestdataX.to(torch.float32)
Tensor_TestdataY  = Tensor_TestdataY.to(torch.float32)

2.1.4 第四步:将数据进行封装,变为可迭代数据集;

这一部分操作不难,只有一个基本函数,在介绍函数之前先来说说为啥要对数据集进行封装。 我们都知道在网络的训练过程中,需要指定一些训练的基本参数,比如 batchsize(批处理数据量),shuffle(训练集洗牌操作)等等,这些操作在Pytorch中是通过一个叫 torch.utils.data.DataLoader 的数据载入器完成设置的,这个载入器在 指定训练或者测试数据集的时候 要求数据集必须经过 特定格式封装,这个特定格式的封装就是我们这一步的操作。

执行操作的函数方法为 torch.utils.data.TensorDataset,这个方法会将两个尺寸相同的Tensor数据进行数据封装,封装后会产生针对于 索引位置 的一对一的匹配数据集,比如输入的两个Tensor为[[1,1],[2,2],[3,3]],[4,5,6],经过封装后,[1,1]-[4],[2,2]-[5],[3,3]-[6] 即为三组数据集。匹配过程与 单个数据的数量无关,仅仅对应索引位置。代码如下:

#打包测试数据成数据集
TensorTrainData = Data.TensorDataset(Tensor_TraindataX,Tensor_TraindataY)
TensorTestData = Data.TensorDataset(Tensor_TestdataX,Tensor_TestdataY)

2.1.5 数据集载入与格式转换完整代码;

import torch
import torchvision.transforms as transforms
import torch.utils.data as Data
import torch.optim as optim
import openpyxl
import numpy as np

def minmaxscaler(data):
    min = np.amin(data)
    max = np.amax(data)    
    return (data - min)/(max-min)

#打开文件数据集
TrainData = openpyxl.load_workbook("F:\\Python\\Pytorch\\Coordinate\\二次函数训练集.xlsx")
TestData  = openpyxl.load_workbook("F:\\Python\\Pytorch\\Coordinate\\二次函数测试集.xlsx")

#获取excel所有的sheet
Trainsheets = TrainData.sheetnames
Testsheets  = TestData.sheetnames

#获取表格对象中的第一个
Trainsheet = TrainData[Trainsheets[0]]
Testsheet  = TestData[Testsheets[0]]

#获取表格的行
TrainNumb = Trainsheet.max_row
TestNumb  = Testsheet.max_row

#创建numpy数组
TrainDataArrayX = np.zeros([1,TrainNumb],dtype=float)
TrainDataArrayY = np.zeros([1,TrainNumb],dtype=float)
TestDataArrayX  = np.zeros([1,TestNumb],dtype=float)
TestDataArrayY  = np.zeros([1,TestNumb],dtype=float)

#Excel读取数据存入ndarray
for i in range(TrainNumb):
    TrainDataArrayX[0][i] =  Trainsheet.cell(row = (i + 1),column=1).value 
    TrainDataArrayY[0][i] =  Trainsheet.cell(row = (i + 1),column=2).value

#Excel读取数据存入ndarray
for j in range(TestNumb):
    TestDataArrayX[0][j] =  Testsheet.cell(row = (j + 1),column=1).value 
    TestDataArrayY[0][j] =  Testsheet.cell(row = (j + 1),column=2).value

#数据归一化
Norm_TrainDataArrayX = minmaxscaler(TrainDataArrayX[0])
Norm_TrainDataArrayY = minmaxscaler(TrainDataArrayY[0])
Norm_TestDataArrayX  = minmaxscaler(TestDataArrayX[0])
Norm_TestDataArrayY  = minmaxscaler(TestDataArrayY[0])

#将数据从ndarray转化为tensor
Tensor_TraindataX = torch.from_numpy(Norm_TrainDataArrayX)
Tensor_TraindataY = torch.from_numpy(Norm_TrainDataArrayY)
Tensor_TestdataX  = torch.from_numpy(Norm_TestDataArrayX)
Tensor_TestdataY  = torch.from_numpy(Norm_TestDataArrayY)

#numpy转化默认为float64,需要转化成float32
Tensor_TraindataX = Tensor_TraindataX.to(torch.float32)
Tensor_TraindataY = Tensor_TraindataY.to(torch.float32)
Tensor_TestdataX  = Tensor_TestdataX.to(torch.float32)
Tensor_TestdataY  = Tensor_TestdataY.to(torch.float32)

#打包测试数据成数据集(注意放进来的数据维数,要变成1维):
TensorTrainData = Data.TensorDataset(Tensor_TraindataX,Tensor_TraindataY)
TensorTestData = Data.TensorDataset(Tensor_TestdataX,Tensor_TestdataY)

至此,数据集载入与格式转化 的基本内容已经全部完成,下一篇文章我们将开始了解函数训练的相关操作。

三、写在最后

目前章节位置信息:

BPNet 5-1:从零开始!你的第一个神经网络!(综述)
BPNet 5-2:全连接层到矩阵计算!FC近在眼前!
BPNet 5-3:训练准备!数据集建立与载入!
BPNet 5-4:反向传播?训练函数与优化器!(待更新)
BPNet 5-5:终于等到你!BP网络的系统工程!(待更新)

(来自一名励志用“普通话”讲技术的菜狗子~)

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值