Pytorch 深度学习实践Lecture_8 Dataset and Dataloader

up主 刘二大人

视频链接 刘二大人的个人空间_哔哩哔哩_Bilibili

DataSet类

作用:

1) 加载数据集

2) 数据集索引
 

from torch.utils.data import Dataset

表示Dataset的抽象类

所有其他数据集都应该进行子类化。所有子类应该实现函数:  __init__, __len__, and __getitem__

__len__提供了数据集的大小

__getitem__支持整数索引,范围从0到len(self)

DataLoader类

作用:支持Mini-batch

DataLoader: 是pytorch中用来处理模型输入数据的一个工具,组合了数据集dataset+采样器sampler,并在数据集上提供单线程或多线程(num_workers)的可迭代对象。

from torch.utils.data import DataLoader

class torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=False, sampler=None, num_workers=0, collate_fn=, pin_memory=False, drop_last=False)

参数:

  • dataset (Dataset) – 加载数据的数据集。
  • batch_size (int, optional) – 每个batch加载多少个样本(默认: 1)。
  • shuffle (bool, optional) – 设置为True时会在每个epoch重新打乱数据(默认: False).
  • sampler (Sampler, optional) – 定义从数据集中提取样本的策略。如果指定,则忽略shuffle参数。
  • num_workers (int, optional) – 用多少个子进程加载数据。0表示数据将在主进程中加载(默认: 0)
  • collate_fn (callable, optional) –
  • pin_memory (bool, optional) –
  • drop_last (bool, optional) – 如果数据集大小不能被batch size整除,则设置为True后可删除最后一个不完整的batch。如果设为False并且数据集的大小不能被batch size整除,则最后一个batch将更小。(默认: False)
     

糖尿病数据集,使用Mini-Batch

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


class DiabetesDataset(Dataset):
    """
    继承抽象类Dataset
    必须实现如下函数: __init__, __len__, and __getitem__
    """

    def __init__(self, file_path):
        xy = np.loadtxt(file_path, 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, item):
        return self.x_data[item], self.y_data[item]

    def __len__(self):
        return self.len


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.sigmoid = 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

#if这条语句在windows系统下一定要加,否则会报错
if __name__ == '__main__':
    data = DiabetesDataset('data\diabetes.csv.gz')
    model = Model()
    """
    DataLoader: 是pytorch中用来处理模型输入数据的一个工具,组合了数据集dataset+采样器sampler,并在数据集上提供单线程或多线程(num_workers)的可迭代对象。
        shuffle: 是否打乱数据
        num_workers: 并行进程数
    """
    batch_size = 20
    train_loader = DataLoader(dataset=data, batch_size=batch_size, shuffle=True, num_workers=2)
    criterion = torch.nn.BCELoss(reduction='mean')
    optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
    epoch_list = []
    loss_list = []
    # 如本数据集示例, 数据样本有759个, batch_size=20, iteration=759/20 ≈ 37
    # 每一个epoch: 一轮前向传播+一轮后向传播到所有training dataset
    # 每一个batch: 一轮前向传播的训练样本数目
    # iteration: 每次训练一个batch样本数目, 需要多少次iteraion才可以训练完所有training dataset
    for epoch in range(10):
        running_loss = 0
        total_sample = 0
        for i, data in enumerate(train_loader, 0):
            # inputs, labels:  x, y
            inputs, labels = data
            # Forward
            y_pred = model(inputs)
            loss = criterion(y_pred, labels)
            print(f"当前epoch: {epoch}, iteration: {i}, loss: {loss.item()}")

            # Backward
            optimizer.zero_grad()
            loss.backward()

            # Update
            optimizer.step()
            running_loss += loss.item()

        epoch_list.append(epoch)
        loss_list.append(running_loss)

    plt.plot(epoch_list, loss_list)
    plt.xlabel('epoch')
    plt.ylabel('Loss')
    plt.show()

结果显示:

Pytorch 深度学习实践Lecture_8 Dataset and Dataloader_第1张图片

 

你可能感兴趣的:(Pytorch深度学习实践,pytorch,深度学习,人工智能)