参考:自用,在意请联系删除
Pytorch深度学习——加载数据集(b站刘二大人)P8讲 加载数据集_努力学习的朱朱的博客-CSDN博客
1.
①全部的数据都用(Batch)
②随机梯度下降:只用一个样本
只用一个样本可以得到比较好的随机性,可以帮助我们跨越在优化中所遇到的鞍点,而用Batch(所有数据)的优点是可以最大化地利用向量计算的优势提升计算速度。
都用一个样本的随机梯度下降训练出的模型效果可能会比其他模型都更好,但是会导致优化用的时间更长,因为每次一个样本没法使用cpu或gpu的并行能力,训练的时间会很长,而使用Batch计算速度快,但是在求得性能上会遇到一些问题,所以在深度学习中我们使用Mini-Batch来平衡训练时间和训练速度上的要求
使用Mini-Batch之后训练循环要写成嵌套循环
外层是循环的次数,循环一次是一个epoch;每一次epoch中执行一次内层;内层每循环一次,执行一次Mini-batch。
2.
Epoch:所有的训练样本都进行了一次前向传播和反向传播的过程。
Batch-Size:每一个Mini_batch训练时所用的样本数量。
iterations:内层的迭代一共执行了多少次,即:total_batch中执行了多少次Mini_batch。
3.
DataLoader的使用
shuffle:为了提高训练样本的随机性,设置为True可以随机打乱dataset,这样每一次生成的MiNi-batch数据集数据样本都是随机的。
dataset 需要支持索引,需要知道Dataset长度,这样DataLoader就可以对Dataset进行自动的小批量的数据集的生成。
4.
构造数据集:
有两种方法构造数据集,第一种在init中把所有的数据都读到内存中,然后每次使用getitem时就把其中第i个样本传出去,适用于样本不大的情况。第二种,如果读取的是较大(10g)图像数据集,在init中把数据都读进来不可能,我们就在init中定义一个列表,每一条数据的文件名放在列表中,标签读到内存中(输出是简单的分类回归数值)或文件名放在列表里,然后getitem读取第i个文件,那x,y的第i个元素去读出来,然后返回,来保证内存的高效使用。(读取文件名,根据文件名加载文件)
import torch
from torch.utils.data import Dataset#抽象类,只能继承,不能实例化
from torch.utils.data import DataLoader#可以实例
class XXXDataset(Dataset): # XXXDataset继承自Dataset
def __init__(self):
pass
#将来实例化这个类之后,这个对象能够支持下标操作,可以通过一个索引,
#把里面的dataset[index]的第index条数据给拿出来
def __getitem__(self,index):#dataset[index]调用索引拿数据
pass
# magic function ,把整个数据的数量取出来
def __len__(self):#可以返回数据条数
pass
#用自定义的类把它实例化一个数据对象dataset,
#这个dataset最重要的功能是getitem()和len()
dataset = XXXDataset()
train_loader = DataLoader(dataset=dataset,batch_size=32,shuffle=True,num_workers=2)#两个进程数读取数据,Cpu核心数较多的话,可以加高
# num_workers:要几个多线程并行读取数据
应用实例:
class DiabetesDataset(Dataset):
def __init__(self,filepath):
xy = np.loadtxt(filepath,delimiter=',',dtype=np.float32)
self.len = xy.shape[0]##shape(N,9),shape[0]取N
self.x_data = torch.from_numpy(xy[:,:-1])
self.y_data = torch.from_numpy(xy[:,[-1]])
def __getitem__(self,index):
return self.x_data[index],self.y_data[index]
def __len__(self):
return self.len
dataset = DiabetesDataset('diabetes.csv.gz')
train_loader = DataLoader(dataset=dataset,batch_size=32,shuffle=True,num_workers=2)
# num_workers=2表示使用2个并行进程来读取数据,Cpu核心数较多的话,可以加高
#(并行化可以提高读取效率)
表示 x,y N行9列,N是数据样本的数量,shape是(N,9)元组,通过取第0个元素,把N的值给取出来,这样就知道数据集有多少个了
5.
加载已有的数据集
以MNIST为例:
import torch
from torch.utils.data import DataLoader
from torchvision import transforms
from torchvision import datasets
train_dataset = datasets.MNIST(root='../dataset/mnist',train=True,transform=transforms.ToTensor(),download=True)
test_dataset = datasets.MNIST(root='../dataset/mnist',train=False,transform=transforms.ToTensor(),download=True)
train_loader = DataLoader(dataset=train_dataset,batch_size=32,shuffle=True)
test_loader = DataLoader(dataset=test_dataset,batch_size=32,shuffle=False)
for batch_index,(inputs,target) in enumerate(train_loader):
...
DataLoader是pytorch提供的加载器,初始化要设置:dataset=,bbatch-size=,shufflle=,
num—_workers=(超线程,win直接使用会报错,用if main语句包起来即可)
多进程的库不一样,在Windows使用spawn代替fork
参考:
PyTorch深度学习实践概论笔记8练习-kaggle的Titanic数据集预测(一)数据分析_双木的木的博客-CSDN博客
训练集应该被用来建立你的机器学习模型。对于训练集,我们为每个乘客提供结果(也称为“ground truth”)。你的模型将基于乘客的性别和阶级等“特征”。您还可以使用特征工程来创建新的特征。
测试集应该用来查看您的模型在不可见数据上的性能。对于测试集,我们不为每个乘客提供基本真相。你的工作就是预测这些结果。对于测试中的每一位乘客,使用你训练的模型来预测他们是否在泰坦尼克号沉没时幸存下来。
还包括gender_submit .csv,这是一组假设所有且只有女性乘客能够存活的预测,作为提交文件的示例。
拿到这笔数据,我们先大概分析一下数据,目的是初步了解数据之间的相关性,为之后的特征选择和建模预测做准备。参考知乎的一篇文章:pytorch练习:泰坦尼克号生存预测 - 知乎
机器学习特征处理——独热编码(One-Hot Encoding) - 简书
Pytorch深度学习——Kaggle网站中泰坦尼克号作业(B站刘二大人P8作业)_学习CV的研一小白的博客-CSDN博客_泰坦尼克号 深度学习