dataset 数据集,有索引能够快速使用
dataloader 使用Mini-batch
我们之前学过在进行梯度下降时,我们可以有两种方式:1全部样本、2只用一个样本随机梯度下降
其中1.全部样本可以利用向量计算的优势,来提升计算速度
2.只用一个样本的随机梯度下降会有比较好的随机性,会帮助我们跨越鞍点,提高性能。
因此在deep learning中常采用Mini-batch的方法来综合性能和速度的优缺点。
使用Mini-batch时需要掌握的几个知识点:Epoch,Batch-size,lterations
训练阶段要写成嵌套循环,外层是循环的次数,循环一次是一个epoch;每一次epoch中执行一次内层;内层每循环一次,执行一次Mini-batch
epoch:所有的训练样本都进行了一次前向传播和反向传播的过程。
batch-size:每一个Mini_batch训练时所用的样本数量。
lteration:内层的迭代一共执行了多少次,即:total_batch中执行了多少次Mini_batch
dataloader使用,两个重要参数:batch_size = 2, shuffle = True
首先需要dataset提供两个信息:1、支持索引[i] 2、长度
shuffle:为了提高训练样本的随机性,设置为True可以随机打乱dataset
import torch
import numpy as np
from torch.utils.data import Dataset
from torch.utils.data import DataLoader
# prepare dataset
class DiabetesDataset(Dataset):
def __init__(self, filepath):
xy = np.loadtxt(filepath, delimiter=',', dtype=np.float32)
self.len = xy.shape[0] # xy是一个n*(8+1)的矩阵,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]
'this magic function returns length of dataset'
def __len__(self):
return self.len
'实例化'
dataset = DiabetesDataset('diabetes.csv')
train_loader = DataLoader(dataset=dataset,
batch_size=32,
shuffle=True,
num_workers=2) #num_workers = 2是多线程读取
# design model using class
class Model(torch.nn.Module):
def __init__(self):
super(Model, self).__init__()
self.linear1 = torch.nn.Linear(8, 6)
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))
return x
model = Model()
# construct loss and optimizer
criterion = torch.nn.BCELoss(reduction='mean')
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
# training cycle
if __name__ == '__main__': #这条语句在windows系统下一定要加,否则会报错
for epoch in range(100):
for i, data in enumerate(train_loader, 0): #取一个mini_batch训练,0表示下标从0开始
'prepare data'
inputs, labels = data
'forward'
y_pred = model(inputs)
loss = criterion(y_pred, labels)
print(epoch, i, loss.item())
'backward'
optimizer.zero_grad()
loss.backward()
'updata'
optimizer.step()