Pytorch深度学习实践(7)加载数据集

使用的Pytorch

from torch.utils.data import Dataset
from torch.utils.data import DataLoader
  • Dataset构造数据集
  • DataLoader拿出数据集中的Mini-Batch

基本概念

使用Mini-Batch时,训练步骤要写成一个嵌套的循环

for epoch in range(training_epochs):
    for i in range(total_batch):

每一次迭代为一个epoch,在每一个epoch中,要跑一层Mini-Batch

  • epoch:当所有的训练样本,都进行了一次 前向传播和反向传播,即所有的样本都进行了一次训练,这个过程叫做一个epoch

  • Batch-Size:每次训练时,所用的样本数量,即一次前馈、反馈、更新时所用的样本数量大小

  • Iteration:指Batch分成了多少个,即上述代码块内层循环了多少次

    例如一共10000个样本,每个Batch大小为1000,则Iteration大小为10

具体使用

Dataset提供数据集,DataLoader在知道索引和长度时,可以随机(指定参数shuffle=True)在整个数据集中拿出来一个Mini-Batch

例如,当batch_size = 2, shuffle=True时,

  • 会先把数据集打乱,即shuffle操作
  • 然后进行batch划分,生成一个可迭代的batch,即loader操作

在这里插入图片描述

每一次迭代过程中,给出的是一个batch

import torch
import torch.utils.data import Dataset 
import torch.utils.data import DataLoader

## Dataset是一个抽象类 不能实例化  因此需要先继承Dataset 写一个他的子类
class DiabetesDataset(Dataset):
    def __init__(self):
        pass
    def __getitem(self, index):  # 魔法方法 能够支持下标操作
        pass
    def __len__(self):  # 魔法方法 返回数据条数
        pass

dataset = DiabetsDataset()
train_loader = DataLoader(dataset=dataset, batch_size=32, shuffle=True,num_workers=2)

dataset类里,一般有两种初始化方法

  • __init__()里把数据集全部读入到内存里,适用于数据集本身容量不大的情况
  • 当读取的数据集比较大时,例如图像的数据,会先将数据打包成文件,然后__init__()中初始化一个列表list,将数据文件的信息(索引或者文件名)放在列表里。每次需要使用时,通过列表内存取的信息再去读取

dataloader参数说明:

  • dataset:给出数据集
  • batch_size:指定批量大小
  • shuffle:是否打乱数据集
  • num_workers:读取数据时是否需要多线程并行化

代码实现

以糖尿病分类的数据集为样例

import numpy as np
import matplotlib.pyplot as plt
import torch
from torch.utils.data import Dataset
from torch.utils.data import DataLoader

########## 数据集的构建 ##########
class DiabetesDataset(Dataset):
    def __init__(self, filepath):
        xy = np.loadtxt(filepath, delimiter=',',dtype=np.float32)
        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('./dataset/diabetes.csv')
train_loader = DataLoader(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()
        self.activate = torch.nn.ReLU()
    def forward(self, x):
        x = self.activate(self.linear1(x))
        x = self.activate(self.linear2(x))
        x = self.sigmoid(self.linear3(x))
        return x

model = Model()

########## 设置损失函数和优化器 ###########
criterion = torch.nn.BCELoss(reduction='mean')
optimizer = torch.optim.SGD(model.parameters(), lr = 0.01)

########## 模型训练 ##########
if __name__ == '__main__':
    loss_history = []
    epoch_history = []
    for epoch in range(1000):
        loss_iterations_history = []
        for index, data in enumerate(train_loader, 0):  # 使用enumerate 返回下标和值 追踪
            inputs, labels = data  # data是一个元组 (x, y)
            ## 前馈计算
            y_pred = model(inputs)
            loss = criterion(y_pred, labels)
            print(epoch, index, loss.item())
            loss_iterations_history.append(loss.item())
            ## 反向传播
            optimizer.zero_grad()
            loss.backward()

            ## 更新参数
            optimizer.step()
        epoch_history.append(epoch)
        loss_history.append(np.mean(loss_iterations_history))

    plt.plot(epoch_history, loss_history)
    plt.xlabel('epoch')
    plt.ylabel("loss")
    plt.grid()
    plt.show()

在这里插入图片描述

num_workers设置为0时运行速度较快

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pytorch中进行深度学习实践的步骤如下: 1. 准备数据集:使用Pytorch提供的工具包torchvision,可以方便地下载和加载一些常见的数据集,如MNIST和CIFAR-10。你可以使用train_set和test_set来分别加载训练集和测试集。 2. 构建模型:在Pytorch中,你可以使用类(Class)来设计和构建深度学习模型。你需要定义一个继承自nn.Module的类,并实现其中的forward方法,该方法描述了如何从输入数据中计算出模型的输出。在这个过程中,你可以根据输入数据的维度来确定权重矩阵w和偏置项b的大小。 3. 定义损失函数和优化器:在深度学习中,我们需要定义一个损失函数来衡量模型的预测结果与真实标签之间的差异。常见的损失函数有交叉熵损失函数(CrossEntropyLoss)和均方误差损失函数(MSELoss)。然后,你可以选择一个优化器来更新模型的参数,常见的优化器有随机梯度下降法(SGD)和Adam优化器。 4. 训练模型:在训练模型之前,你需要定义一些超参数,如学习率、迭代次数和批量大小。然后,你可以使用一个循环来迭代地训练模型。在每一次迭代中,你需要将输入数据传递给模型,计算模型的输出,计算损失函数并进行反向传播,最后使用优化器来更新模型的参数。重复这个过程直到达到设定的迭代次数。 5. 模型评估:在训练完成后,你可以使用测试集来评估模型的性能。通过传递测试集的输入数据给模型,计算模型的预测结果,并与真实标签进行比较,可以得到模型的准确率或其他性能指标。 综上所述,这是一个基本的Pytorch深度学习实践流程,你可以根据具体的任务和数据集进行相应的调整和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值