目录
一:背景
二:准备数据集
1:初始化Dataset
2:定义getitem函数
3:Dataloader的配置
三:构造模型
四:循环搭建
五:整体代码
为什么不用上一篇笔记中所用到的np.txtload()直接加载,是因为1、简化计算量,DataLoader中可以将整个batch分解为mini-bach(因为minibatch)的出现,引出了iteration来并行计算(利用CPU、GPU);2、DataSet可以将数据集中的元素按照索引取出。
整体思路:①准备数据集②构造模型③损失函数与优化器的选择④训练周期的设定
还是利用上一篇的糖尿病数据集。这个阶段我们需要定义Dataset和Dataloader
def __init__(self,filepath):
z = np.loadtxt(filepath,dtype=np.float32,delimiter=',')
self.x_data = torch.from_numpy(z[:,:-1])
self.y_data = torch.from_numpy(z[:,[-1]])
self.len = z.shape[0]
self.len的目的是为了可以知道数据集的个数(759条数据)
目的:可以将数据集其中的一条信息按照索引取出
def __getitem__(self, item):
return self.x_data[item],self.y_data[item]
dataset1 = dataset('diabetes.csv')
dataloader = DataLoader(dataset=dataset1,batch_size=32,shuffle=True,num_workers=2)
DataLoader的参数:
dataset = :使用哪个数据集
batch_size=:将数据集拆成一组多少个进行训练
shuffle=:是否需要打乱数据
num_workers=:几个mini_batch并行计算,一般<=你的电脑cpu数目
与上一篇一样
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.activate = torch.nn.Sigmoid()
def forward(self,x):
x = self.activate(self.linear1(x))
x = self.activate(self.linear2(x))
x = self.activate(self.linear3(x))
return x
model = Model()
loss = torch.nn.BCELoss(reduction='mean')
optim = torch.optim.SGD(model.parameters(),lr=0.01)
因为引入了mini-batch所以在epoch循环的架构里还要嵌套每一个mini-batch的训练
if __name__ == '__main__':
for epoch in range(1000):
for i,data in enumerate(dataloader,0):
input,result = data
print(epoch,i,data)
①:第一行代码是因为windows和linux环境的接口不一样
②:引入iteration,data来在循环中记录小循环次数(多少次能跑完一个epoch)和datal用来存储每个mini-batch
对于enumerate(a,b)函数,a表示遍历谁,b表示起始位置,enumerate函数可以遍历多个目标
import numpy as np
import torch
import matplotlib.pyplot as plt
from torch.utils.data import Dataset
from torch.utils.data import DataLoader
class dataset(Dataset):
def __init__(self,filepath):
z = np.loadtxt(filepath,dtype=np.float32,delimiter=',')
self.x_data = torch.from_numpy(z[:,:-1])
self.y_data = torch.from_numpy(z[:,[-1]])
self.len = z.shape[0]
def __len__(self):
return self.len
def __getitem__(self, item):
return self.x_data[item],self.y_data[item]
dataset1 = dataset('diabetes.csv')
dataloader = DataLoader(dataset=dataset1,batch_size=32,shuffle=True,num_workers=3)
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.activate = torch.nn.Sigmoid()
def forward(self,x):
x = self.activate(self.linear1(x))
x = self.activate(self.linear2(x))
x = self.activate(self.linear3(x))
return x
model = Model()
loss = torch.nn.BCELoss(reduction='mean')
optim = torch.optim.SGD(model.parameters(),lr=0.01)
x_list = []
y_list = []
if __name__ == '__main__':
for epoch in range(1000):
for i,data in enumerate(dataloader,0):
input,result = data
y_pred = model(input)
loss1 = loss(y_pred,result)
print(epoch,i,loss1.item())
optim.zero_grad()
loss1.backward()
optim.step()
如何加入测试数据,和将整体过程可视化