代码:
import matplotlib.pyplot as plt import torch import numpy as np from torch.utils.data import Dataset # 抽象类,不可实例化 from torch.utils.data import DataLoader # help us loading data in PyTorch import os os.environ["KMP_DUPLICATE_LIB_OK"]="True" class DiabetesDataset(Dataset): # 继承DataSet的类需要重写init,getitem,len魔法函数。 # 分别是为了加载数据集,获取数据索引,获取数据总量 def __init__(self, filepath): xy = np.loadtxt(filepath, delimiter=" ", dtype=np.float32) # shape本身是一个二元组(x,y)对应数据集的行数和列数,这里[0]我们取行数,即样本数 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("diabetes_data.csv.gz") # 我们用DataLoader为数据进行分组,batch_size是一个组中有多少个样本,shuffle表示要不要对样本进行随机排列 # 一般来说,训练集我们随机排列,测试集不。num_workers表示我们可以用多少进程并行的运算 train_loader = DataLoader(dataset=dataset, batch_size= 32, shuffle= True, num_workers=2) class Model(torch.nn.Module): def __init__(self): # 构造函数 super(Model, self).__init__() # 创建了一个线性层,输入特征数为9,输出特征数为6。线性层在神经网络中通常用于实现权重矩阵乘法和偏置的加法 self.linear1 = torch.nn.Linear(9, 6) self.linear2 = torch.nn.Linear(6, 4) self.linear3 = torch.nn.Linear(4, 1) # Sigmoid函数通常用于二分类问题中,将线性层的输出转换为概率值。 self.sigmoid = torch.nn.Sigmoid() self.relu = torch.nn.ReLU() def forward(self, x): x = self.relu(self.linear1(x)) x = self.relu(self.linear2(x)) x = self.sigmoid(self.linear3(x)) # 对线性层加激活函数 sigmoid return x model = Model() # 实例化模型 epoch_list = [] loss_list = [] # criterion = torch.nn.BCELoss(size_average=True) criterion = torch.nn.BCELoss(reduction="mean") optimizer = torch.optim.SGD(model.parameters(), lr = 0.01) if __name__ == '__main__': # if这条语句在windows系统下一定要加,否则会报错 for epoch in range(100): # 外层循环是训练周期 for i, data in enumerate(train_loader, 0): # 内层循环是mini-batch # 1. Prepare data inputs, labels = data # #将输入的数据赋给inputs,标签赋给labels # 2. Forward y_pred = model(inputs) loss = criterion(y_pred, labels) print(epoch, i, loss.item()) # 添加到列表中 loss_list.append(loss.item()) epoch_list.append(epoch) # 3. Backward optimizer.zero_grad() loss.backward() # 4.Upgrade optimizer.step() # 绘图准备 plt.plot(epoch_list, loss_list) plt.xlabel('Epoch') plt.ylabel('Loss') plt.title('') plt.show()