torch学习笔记——利用DataSet和DataLoader加载数据集

目录

一:背景

二:准备数据集

        1:初始化Dataset

        2:定义getitem函数

        3:Dataloader的配置

三:构造模型

四:循环搭建

 五:整体代码


一:背景

        为什么不用上一篇笔记中所用到的np.txtload()直接加载,是因为1、简化计算量,DataLoader中可以将整个batch分解为mini-bach(因为minibatch)的出现,引出了iteration来并行计算(利用CPU、GPU);2、DataSet可以将数据集中的元素按照索引取出。

        整体思路:①准备数据集②构造模型③损失函数与优化器的选择④训练周期的设定

二:准备数据集

        还是利用上一篇的糖尿病数据集。这个阶段我们需要定义Dataset和Dataloader

        1:初始化Dataset

                

    def __init__(self,filepath):
        z = np.loadtxt(filepath,dtype=np.float32,delimiter=',')
        self.x_data = torch.from_numpy(z[:,:-1])
        self.y_data = torch.from_numpy(z[:,[-1]])
        self.len = z.shape[0]

                self.len的目的是为了可以知道数据集的个数(759条数据)

        2:定义getitem函数

                目的:可以将数据集其中的一条信息按照索引取出

    def __getitem__(self, item):
        return self.x_data[item],self.y_data[item]

        3:Dataloader的配置

dataset1 = dataset('diabetes.csv')
dataloader = DataLoader(dataset=dataset1,batch_size=32,shuffle=True,num_workers=2)

                DataLoader的参数:

                        dataset = :使用哪个数据集

                        batch_size=:将数据集拆成一组多少个进行训练

                        shuffle=:是否需要打乱数据

                        num_workers=:几个mini_batch并行计算,一般<=你的电脑cpu数目

三:构造模型

        与上一篇一样

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.activate = torch.nn.Sigmoid()
    def forward(self,x):
        x = self.activate(self.linear1(x))
        x = self.activate(self.linear2(x))
        x = self.activate(self.linear3(x))
        return x
model = Model()
loss = torch.nn.BCELoss(reduction='mean')
optim = torch.optim.SGD(model.parameters(),lr=0.01)

四:循环搭建

        因为引入了mini-batch所以在epoch循环的架构里还要嵌套每一个mini-batch的训练

torch学习笔记——利用DataSet和DataLoader加载数据集_第1张图片

if __name__ == '__main__':
    for epoch in range(1000):
        for i,data in enumerate(dataloader,0):
            input,result = data
            print(epoch,i,data)

     ①:第一行代码是因为windows和linux环境的接口不一样

     ②:引入iteration,data来在循环中记录小循环次数(多少次能跑完一个epoch)和datal用来存储每个mini-batch

对于enumerate(a,b)函数,a表示遍历谁,b表示起始位置,enumerate函数可以遍历多个目标

torch学习笔记——利用DataSet和DataLoader加载数据集_第2张图片

 五:整体代码

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

class dataset(Dataset):
    def __init__(self,filepath):
        z = np.loadtxt(filepath,dtype=np.float32,delimiter=',')
        self.x_data = torch.from_numpy(z[:,:-1])
        self.y_data = torch.from_numpy(z[:,[-1]])
        self.len = z.shape[0]

    def __len__(self):
        return self.len
    def __getitem__(self, item):
        return self.x_data[item],self.y_data[item]
dataset1 = dataset('diabetes.csv')
dataloader = DataLoader(dataset=dataset1,batch_size=32,shuffle=True,num_workers=3)
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.activate = torch.nn.Sigmoid()
    def forward(self,x):
        x = self.activate(self.linear1(x))
        x = self.activate(self.linear2(x))
        x = self.activate(self.linear3(x))
        return x
model = Model()
loss = torch.nn.BCELoss(reduction='mean')
optim = torch.optim.SGD(model.parameters(),lr=0.01)
x_list = []
y_list = []
if __name__ == '__main__':
    for epoch in range(1000):
        for i,data in enumerate(dataloader,0):
            input,result = data
            y_pred = model(input)
            loss1 = loss(y_pred,result)
            print(epoch,i,loss1.item())
            optim.zero_grad()
            loss1.backward()
            optim.step()

torch学习笔记——利用DataSet和DataLoader加载数据集_第3张图片

 问题

如何加入测试数据,和将整体过程可视化

 

你可能感兴趣的:(学习,python,开发语言)