开篇几句题外话:
- 本节内容,主要是把数据集写成了一个类,这个类要继承
Dataset
类,有点像DIY一个数据集的感觉,只有自定义了之后,才能实例化,然后把之前直接在文件夹中读取数据的方式进行了修改; - 数据集类里面有三个函数,这三个函数较为固定,分别自己的作用;
- 继承Dataset后我们必须实现三个函数:
__init__()
是初始化函数,之后我们可以提供数据集路径进行数据的加载getitem__()
帮助我们通过索引找到某个样本__len__()
帮助我们返回数据集大小
- 继承Dataset后我们必须实现三个函数:
- 后面加载数据的
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刘二大人之MultipleDimensionLogisticRegressionModel-代码理解与实现(6/9)
下一篇:
【Pytorch深度学习实践】B站up刘二大人之SoftmaxClassifier-代码理解与实现(8/9)