这是在b站刘二大人up主那里的学习笔记,自己整理的些代码:
用sklearn里的糖尿病数据集做的一个逻辑回归预测,跟刘老师教程里的有所不同,我这个的label是几十到四百多的数字,不是离散化的0-1,所以我自己定了个边界值200,小于就设为0,大于就设为1,方便做预测;小白一枚,大佬帮忙指导指导
# diabetes的逻辑回归,用Dataloader和Datasets,并使用mini-batch
import torch
from torch.utils.data import Dataset # Datasets是抽象类,不能实例化只能被子类继承
from torch.utils.data import DataLoader
from sklearn.datasets import load_diabetes
# 准备数据
class DiabetesDatasets(Dataset):
def __init__(self): # 加载数据两种选择:数据量不大时全部加载进内存:如下;数据量大时,定义数据文件名列表(以及标签列表),通过读取列表来读取文件
sets = load_diabetes()
self.x_data = torch.Tensor(sets['data'])
self.y_data = torch.Tensor(sets['target']).view(442, 1)
for i in range(len(self.y_data)):
if self.y_data[i] <= 200:
self.y_data[i] = 0
pass
else:
self.y_data[i] = 1
pass
pass
# print(self.x_data.size())
# print(self.y_data.size())
pass
def __getitem__(self, index): # 使对象支持下标操作
return self.x_data[index], self.y_data[index]
pass
def __len__(self): # 获取数据集的长度
return len(self.x_data)
pass
# 定义模型
class Model(torch.nn.Module):
def __init__(self):
super(Model, self).__init__()
self.linear1 = torch.nn.Linear(10, 8)
self.linear2 = torch.nn.Linear(8, 4)
self.linear3 = torch.nn.Linear(4, 1)
def forward(self, x):
x = torch.sigmoid(self.linear1(x))
x = torch.sigmoid(self.linear2(x))
x = torch.sigmoid(self.linear3(x))
return x
model = Model()
datasets = DiabetesDatasets()
train_loader = DataLoader(dataset=datasets, batch_size=32, shuffle=True, num_workers=2)
# batch_size指每一次前馈和反馈更新所用到的样本数量,即每个batch的大小
# shuffle 表示将数据集打乱顺序使其具有随机性
# Dataloader需要数据集支持索引操作,并且要知道数据集的长度,此条件在datasets的制作里面实现
# num_workers表示读取数据时使用几个线程并行化读取
# 定义loss和优化器
criterion = torch.nn.BCELoss(reduction='mean')
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
if __name__ == '__main__':
for epoch in range(100): # 所有样本都参与了一次训练就叫一个epoch
for i, data in enumerate(train_loader, 0): # i拿到的是第i个batch,i表示Iteration表示batch的个数
inputs, lables = data
y_pred = model(inputs)
loss = criterion(y_pred, lables)
print('epoch:{} i:{} loss:{}'.format(epoch, i, loss.item()))
# 梯度清零,backwords,梯度更新
optimizer.zero_grad()
loss.backward()
optimizer.step()
最后loss收敛到0.5左右就降不下去了,不过从前几轮的训练结果来看还是收敛的,由于对数据的不熟悉,自己瞎定的200值,可能不一定线性可分,所以结果不太理想,不过此笔记旨在学习Dataloader的使用。