《PyTorch深度学习实践》第八节:加载数据集

dataset 数据集,有索引能够快速使用

dataloader 使用Mini-batch

我们之前学过在进行梯度下降时,我们可以有两种方式:1全部样本、2只用一个样本随机梯度下降

其中1.全部样本可以利用向量计算的优势,来提升计算速度

​ 2.只用一个样本的随机梯度下降会有比较好的随机性,会帮助我们跨越鞍点,提高性能

因此在deep learning中常采用Mini-batch的方法来综合性能和速度的优缺点。

使用Mini-batch时需要掌握的几个知识点:Epoch,Batch-size,lterations
在这里插入图片描述

训练阶段要写成嵌套循环,外层是循环的次数,循环一次是一个epoch;每一次epoch中执行一次内层;内层每循环一次,执行一次Mini-batch

epoch:所有的训练样本都进行了一次前向传播和反向传播的过程。

batch-size:每一个Mini_batch训练时所用的样本数量。

lteration:内层的迭代一共执行了多少次,即:total_batch中执行了多少次Mini_batch

dataloader使用,两个重要参数:batch_size = 2, shuffle = True

首先需要dataset提供两个信息:1、支持索引[i] 2、长度

shuffle:为了提高训练样本的随机性,设置为True可以随机打乱dataset

在这里插入图片描述

import torch
import numpy as np
from torch.utils.data import Dataset
from torch.utils.data import DataLoader

# prepare dataset
class DiabetesDataset(Dataset):
    def __init__(self, filepath):
        xy = np.loadtxt(filepath, delimiter=',', dtype=np.float32)
        self.len = xy.shape[0]  # xy是一个n*(8+1)的矩阵,shape(多少行,多少列)=(n,9),shape[0] = n
        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]

    'this magic function returns length of dataset'
    def __len__(self):
        return self.len


'实例化'
dataset = DiabetesDataset('diabetes.csv')
train_loader = DataLoader(dataset=dataset,
                          batch_size=32,
                          shuffle=True,
                          num_workers=2) #num_workers = 2是多线程读取


# design model using class
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()

    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()

# construct loss and optimizer
criterion = torch.nn.BCELoss(reduction='mean')
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

# training cycle
if __name__ == '__main__':   #这条语句在windows系统下一定要加,否则会报错
    for epoch in range(100):
        for i, data in enumerate(train_loader, 0):  #取一个mini_batch训练,0表示下标从0开始
            'prepare data'
            inputs, labels = data
            'forward'
            y_pred = model(inputs)
            loss = criterion(y_pred, labels)
            print(epoch, i, loss.item())
            'backward'
            optimizer.zero_grad()
            loss.backward()
            'updata'
            optimizer.step()

Guess you like

Origin blog.csdn.net/weixin_44894550/article/details/121063891