Epoch、Batch-Size、Iterations
1、所有的训练集进行了一次前向和反向传播,叫做一个Epoch
2、在深度学习训练中,要给整个数据集分成多份,即mini-batch,每个mini-batch所包含的样本的数量叫做Batch-Size
3、因为数据集分成了多个mini-batch,有多少份mini-batch就有多少个Iteration,每进行一次mini-batch的前向和后向传播,就会进行一次权重参数的更新,在一个Epoch中,有多少个Iteration,就更新了多少次权重参数
Dataset、DataLoader
1、DataSet 是抽象类,不能实例化对象,需要自己定义类继承该抽象类并实现其中的方法
2、init()函数里面主要用来加载数据集,分成x_data,y_data
3、__getitem()__主要根据下表来获取数据集
4、len() 主要用来返回数据集的个数
5、DataLoader是Pytorch中用来处理模型输入数据的一个工具类。组合了数据集(dataset) + 采样器(sampler),并在数据集上提供单线程或多线程(num_workers )的可迭代对象。在DataLoader中有多个参数,这些参数中重要的几个参数的含义说明如下:
1. epoch:所有的训练样本输入到模型中称为一个epoch;
2. iteration:一批样本输入到模型中,成为一个Iteration;
3. batchszie:批大小,决定一个epoch有多少个Iteration;
4. 迭代次数(iteration)=样本总数(epoch)/批尺寸(batchszie)
5. dataset (Dataset) – 决定数据从哪读取或者从何读取;
6. batch_size (python:int, optional) – 批尺寸(每次训练样本个数,默认为1)
7. shuffle (bool, optional) –每一个 epoch是否为乱序 (default: False);
8. num_workers (python:int, optional) – 是否多进程读取数据(默认为0);
9. drop_last (bool, optional) – 当样本数不能被batchsize整除时,最后一批数据是否舍弃(default: False)
10. pin_memory(bool, optional) - 如果为True会将数据放置到GPU上去(默认为false)
课上代码
import torch
import numpy as np
from torch.utils.data import Dataset
from torch.utils.data import DataLoader
class DiabetesDataset (Dataset):
def __init__(self):
xy = np.loadtxt('diabetes.csv', delimiter=',', dtype = np.float32)
self.len = xy.shape[0]
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()
train_loader = DataLoader (dataset=dataset, batch_size=32, shuffle=True, num_workers=0)
class Model(torch.nn.Module):
def __init__(self):
super(Model, self).__init__()
self.linear1 = torch.nn.Linear(8, 6) # 输入数据x的特征是8维,x有8个特征
self.linear2 = torch.nn.Linear(6, 4)
self.linear3 = torch.nn.Linear(4, 1)
self.sigmoid = torch.nn.Sigmoid() # 将其看作是网络的一层,而不是简单的函数使用
def forward(self, x):
x = self.sigmoid(self.linear1(x))
x = self.sigmoid(self.linear2(x))
x = self.sigmoid(self.linear3(x)) # y hat
return x
model = Model()
criterion = torch.nn.BCELoss(reduction='mean')
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
for epoch in range (100):
for i, data in enumerate (train_loader, 0):
inputs, labels = data
y_pred = model (inputs)
loss = criterion (y_pred, labels)
print (epoch, i, loss.item())
optimizer.zero_grad()
loss.backward ()
optimizer.step()
torchvision中数据集的加载