【Pytorch深度学习实践】B站up刘二大人之Dataset&DataLoader-代码理解与实现(7/9)

开篇几句题外话:

  • 本节内容,主要是把数据集写成了一个类,这个类要继承Dataset类,有点像DIY一个数据集的感觉,只有自定义了之后,才能实例化,然后把之前直接在文件夹中读取数据的方式进行了修改;
  • 数据集类里面有三个函数,这三个函数较为固定,分别自己的作用;
    • 继承Dataset后我们必须实现三个函数:
      • __init__()是初始化函数,之后我们可以提供数据集路径进行数据的加载
      • getitem__()帮助我们通过索引找到某个样本
      • __len__()帮助我们返回数据集大小
  • 后面加载数据的DataLoader(注意L大写),直接可以调用对数据集类做了实例化的对象,即把他当做一个参数,传入DataLoader当中;

Lecture08 —— Dataset&DataLoader 加载数据集

说在前面:

  • 本节内容,主要是把数据集写成了一个类,这个类要继承Dataset类,有点像DIY一个数据集的感觉,只有自定义了之后,才能实例化,然后把之前直接在文件夹中读取数据的方式进行了修改;

  • 后面加载数据的DataLoader(注意L大写),直接可以调用对数据集类做了实例化的对象,即把他当做一个参数,传入DataLoader当中;

详细过程:

  • 本课程的主要任务是通过将原本简单的标量输入,升级为向量输入,构建线性传播模型:
    • 在导入数据阶段就有很大不同:
      • 数据集类里面有三个函数,这三个函数较为固定,分别自己的作用;
    • 继承Dataset后我们必须实现三个函数:
      • __init__()是初始化函数,之后只要提供数据集路径,就可以进行数据的加载,也就是说,传入init的参数,只要有一个文件路径就可以了;
      • getitem__()通过索引找到某个样本;
      • __len__()返回数据集大小;

完整代码:

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author: 24_nemo
@file: 08_Dataset_and_DataLoader_handType.py
@time: 2022/04/11
@desc:
"""

import numpy as np
import torch
from torch.utils.data import Dataset, 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('../diabetes.csv.gz')
train_loader = DataLoader(dataset=dataset,
                          batch_size=32,
                          shuffle=True,
                          num_workers=2)


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

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

if __name__ == '__main__':
    for epoch in range(100):
        for i, data in enumerate(train_loader, 0):
            # 1、导入数据
            inputs, labels = data
            # 2、前向传播
            y_hat = model(inputs)
            loss = criterion(y_hat, labels)
            print(epoch, i, loss.item())
            # 3、反向传播(为什么loss.backward这里不会自动补全?)
            optimizer.zero_grad()
            loss.backward()
            # 4、更新权重
            optimizer.step()

            if epoch % 30 == 1:
                y_pred_label = torch.where(y_hat >= 0.5, torch.tensor([1.0]), torch.tensor([0.0]))

                accuracy = torch.eq(y_pred_label, labels).sum().item() / labels.size(0)
                print("loss = ", loss.item(), "acc = ", accuracy)

【Pytorch深度学习实践】B站up刘二大人之Dataset&DataLoader-代码理解与实现(7/9)_第1张图片

上一篇:

【Pytorch深度学习实践】B站up刘二大人之MultipleDimensionLogisticRegressionModel-代码理解与实现(6/9)

下一篇:

【Pytorch深度学习实践】B站up刘二大人之SoftmaxClassifier-代码理解与实现(8/9)

目录:

【Pytorch深度学习实践】B站up刘二大人课程笔记——目录与索引(已完结)

你可能感兴趣的:(深度学习/PyTorch,Python/Pycharm,图像处理,深度学习,python,计算机视觉)