1. 机器学习训练的一般步骤
2. 数据加载的一般步骤
-
数据收集
这一步通常是将需要用到的原始数据放到程序内的专门存放数据的文件夹下有时原始数据格式很难或无法代码读取,需要将其处理成适当的格式存储
-
数据划分
将原始数据划分为训练集、验证集和测试集,无论想用什么方式加载到网络,这一步最好有,例如你的数据是图片,那么可以遍历所有元数据的地址,将地址分成三部分存储,否则放一起利用DataLoader加载数据会出现问题,他无法内部划分数据集,所以最好在实验之前,先用代码划分好数据集 -
数据读取
PyTorch中数据读取的过程类的调用可用下图表示
![](https://i-blog.csdnimg.cn/blog_migrate/37e9a573ca013e18b0bd3dadd8befe63.png)
- 数据预处理
将元数据进行转成Tensor等处理手段,使其适应网络的输入
3. 数据读取的核心
3.1 torch.utils.data.Dataset
Dataset是一个抽象类,我们使用时需要义我们自己的数据类,继承Dataset并至少override以下三个方法:
-
__init__()
初始化自己定义的数据集,将需要传入的内容作为初始化函数的参数 -
__getitem__()
不管用不用mini-batch方式取数据,本质都是利用该方法逐个取,只是mini-batch将batch_size的数据拼接了而已,该方法返回输入数据和标签的元组这里要注意,不管你加载什么形式的内容,所有原始数据,或所有数据的地址,你总得要有一样全部加载进内存,因为这是根据索引读取数据,后面的DataLoader的shuffle参数实现乱序抽取,也是由于有一个与全部样本相关的列表,随机读取数据只用生成乱序排列的索引即可。
-
__len__()
返回数据集的大小,是要加载数据集的所有的样本数,原因之一是后面的DataLoader的drop_last参数要用得到 -
示例
import torch from torch.utils.data import Dataset import pandas as pd # 定义自己的类 class MyDataset(Dataset): # 初始化 def __init__(self, file_name): pass # 返回数据集长度 def __len__(self): pass # 获取数据集中对应索引的数据 def __getitem__(self, idx): pass # 通过实例化对象来访问该类 ds = MyDataset(data_dir=None, transform==None)
注意,Dataset的使用方式为
object = MyDataset(data_dir=None, transform==None)
- data_dir:数据集的加载目录
- transform: 预处理的函数
3.2 torch.utils.data.DataLoader
-
函数(简化参数)
DataLoader(dataset, batch_size=1, shuffle=False, num_workers=0, drop_last=False)
-
功能
构建可迭代的数据装载器 -
常用参数
- dataset: Dataset类,决定数据从哪读取以及如何读取
- batch_size: 每个batch有多少个样本
- shuffle: 在每个epoch开始的时候,对数据进行重新排序
- num_workers: 这个参数决定有几个进程来处理data loading,默认所有的数据都会被load进主进程
- drop_last: 当样本数不能被batch_size整除时,是否舍弃最后一批数据,保留则最后一批张量会小点
-
示例
# 仅仅列举了常用的几个参数 train_loader = DataLoader(dataset, batch_size=1, shuffle=False, num_workers=0)
注意,DataLoader返回的是迭代器,要通过for循环调用