Pytorch学习笔记之Dataloader and Dataset

这是在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的使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值