Dataset 是为了构造数据集
DataLoader 拿出一个mini-batch
用mini-batch平衡训练速度和训练结果的一个需求
#training cycle # for epoch in range(training_epochs): # # 取出一个mini-batch # for i in range(total_batch): # 概念:iteration 内层的迭代一共进行了多少次 # DataLoader 需要支持索引,并且知道Dataset的长度 # shuffle 打乱顺序
import torch import numpy as np from torch.utils.data import Dataset # 抽象类 from torch.utils.data import DataLoader class DiabetesDataset(Dataset): # 糖尿病数据集 def __init__(self,filepath): # filepath文件路径 xy = np.loadtxt(filepath, delimiter=',', dtype=np.float32) self.len = xy.shape[0] # shape(多少行,多少列) 在该例子下,拿到的是一个(n,9)的元组 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): # 支持len() return self.len # 在刚刚的__init__中实现的 dataset = DiabetesDataset(r'C:\Users\86196\Desktop\diabetes.csv.gz') train_loader = DataLoader(dataset = 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) 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) # 这行代码是一个常见的Python主程序入口。当当前脚本被直接运行时,'name'变量的值为'main'。 # 这行代码确保以下代码块只在当前脚本被直接执行时运行,而不是在作为模块被其他脚本导入时运行。 if __name__ == '__main__': # 没有的话可能会报错 for epoch in range(100): # 这行代码在每次训练循环中,获取train_loader(一个常用的在PyTorch中加载和准备数据的方法)中的一个数据块 # 并通过enumerate函数获取该数据块的索引(i)和内容(data)。索引i从0开始。 for i, data in enumerate(train_loader, 0): # train_loader 是先shuffle后mini_batch # 1.Prepare data inputs, labels = data # inputs就是x,labels就是y # 2.Forward y_pred = model(inputs) loss = criterion(y_pred, labels) print(epoch, i, loss.item()) # 这行代码打印了当前的训练轮数(epoch),当前轮次中的数据块索引(i),以及该数据块的损失值 # 3.Backward optimizer.zero_grad() loss.backward() # 4.Update optimizer.step()