【 数据集加载 Dataset&DataLoader 模块实现与源码详解 深度学习 Pytorch笔记 B站刘二大人 (7/10)】

14 篇文章 0 订阅
11 篇文章 1 订阅
本文介绍了PyTorch中Dataset和DataLoader模块的使用,以及Mini-batch的概念。通过自定义DiabetesDataset类加载数据,并利用DataLoader进行批量训练。代码展示了训练过程中数据预处理、前向传播、反向传播和优化器更新的步骤。
摘要由CSDN通过智能技术生成

数据集加载 Dataset&DataLoader 模块实现与源码详解 深度学习 Pytorch笔记 B站刘二大人 (7/10)

模块介绍

在本节中没有关于数学原理的相关介绍,使用的数据集和类型仍然是(6、10)的相关内容。

在这里主要是介绍dataset ,dataloader两个类以及mini-batch方法

梯度下降方法:
1.全部数据都使用,batch,最大化使用向量计算优势,提升计算速度
2.随机梯度下降,只用一个样本,会得到较好的随机性,克服鞍点的问题。

Mini-batch :将1,2进行结合,进行两层循环嵌套,在每个epoch中执行一次mini-batch。
每个epoch中进行一次完整的forward和backward,iteration = Batch / miniBatch
在这里插入图片描述

Shuffle主要用于将数据集随机打乱,loader将打乱数据集根据size相组合

在这里插入图片描述

代码解读与模块实现

注意点:dataset为抽象类,不能实例化,但是dataloader可以进行实例化操作

魔法方法,python文件的内置方法,重写后的num workers参数决定进行多线程读入的线程个数

在这里插入图片描述

有时会出现代码报错的情况,且仅在Windows下会报错

原因是数据类型在Windows系统下应该用spwan代替fork

解决办法:
在这里插入图片描述

重写dataloader类:

在这里插入图片描述

训练过程

在这里插入图片描述

整体代码

''' coding:utf-8 '''

"""
作者:shiyi
日期:年 09月 03日
pytorch加载数据集,重写Dataset函数导入数据
"""

import numpy as np
import torch
from torch.utils.data import Dataset    # 引入抽象类dataset
from torch.utils.data import DataLoader    # 帮助将数据导入pytorch完成数据类型的转换


class DiabetesDataset(Dataset):         # 重写dataset类
    def __init__(self, filepath):       # 构造函数中加入路径参数
        xy = np.loadtxt(filepath, delimiter=',', dtype=np.float32)      # 设置读取数据类型为float32以满足GPU迁移的需求
        self.len = xy.shape[0]          # 设置内参length
        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):                  # 设置接口可以输出数据length
        return self.len


dataset = DiabetesDataset('D:\\pytorch_prac\\dataset\\diabetes.csv.gz')     # 读取数据
train_loader = DataLoader(dataset=dataset,              # 训练数据
                          batch_size=32,                # 设置batch 一次训练数据次数
                          shuffle=True,                 # 是否打乱顺序 是
                          num_workers=2)                # 双线程进行


class Model(torch.nn.Module):                   # 构建深度学习模型
    def __init__(self):                         # 注释已经在(6/10)中详细写过,不在赘述
        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()       #self.activate = torch.nn.ReLU()

    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()     # 实例化

criterion = torch.nn.BCELoss(size_average=True)
optimizer = torch.optim.ASGD(model.parameters(), lr=0.1)

if __name__ == '__main__':
    for epoch in range(100):            # 注释已经在(6/10)中详细写过,不在赘述
        for i, data in enumerate(train_loader, 0):
            # 1.prepare data
            inputs, labels = data
            # 2.Forward
            y_pred = model(inputs)
            loss = criterion(y_pred, labels)
            print(epoch, i, loss.item())
            # Backward
            optimizer.zero_grad()
            loss.backward()
            # Update
            optimizer.step()

运行结果

99 19 0.5463573336601257
99 20 0.552997887134552
99 21 0.5635378360748291
99 22 0.6222219467163086
99 23 0.5633459687232971

Process finished with exit code 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狗头狗不狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值