深度学习-加载数据集 -Dataset and DataLoader-自用笔记7

深度学习- 加载数据集-Dataset and DataLoader-自用笔记7

说明:自用笔记1-6都是采用加载全部数据集放到batch中,今天讲解的是采用mini_batch的方法
之前采用全部数据集的代码方法如下:
在这里插入图片描述

采用mini_batch的方法加载数据集

采用mini_batch的方法加载数据集需要设置:Epoch, Batch-Size, Iterations三个两的值,如图
在这里插入图片描述
DataLoader: batch_size=2, shuffle=True
batch_size=2代表每一个mini_batch有2个数据样本
shuffle=True表示随机打乱数据
在这里插入图片描述

如何定义数据集

Dataset is an abstract class. We can define our class inherited from this class
Dataset 是一个抽象的类,我们需要定义一个自己的类来继承这个Dataset类的资源在这里插入图片描述
DataLoader is a class to help us loading data in PyTorch.
DataLoaderDataset不同,DataLoader是一个可以直接调用的类,可以对他实例化调用。
在这里插入图片描述
定义数据集需要5个重要的部分

  1. class DiabetesDataset(Dataset),DiabetesDataset继承Dataset父类
  2. def init(self): 初始化
  3. def getitem(self, index): 可以索引数据集中的任何一个元素
  4. def len(self): 知道数据集的长度
  5. train_loader = DataLoader(dataset=dataset, batch_size=32, shuffle=True, num_workers=2),设置加载数据集的dataset文件路径, batch-size, shuffle, process number.
    在这里插入图片描述

采用mini_batch的方法的训练模型用两个for函数

在这里插入图片描述
代码

for epoch in range(100): 
	for i, data in enumerate(train_loader, 0):#enumerate可以传递给i第几次循环的数值,并且将train_loader所加载的数据集以元组(x,y)的形式传入data
		……

enumerate可以传递给i第几次循环的数值,并且将train_loader所加载的数据集以元组(x,y)的形式传给data,所以data中就含有元组的数据(输入数据x,和标签y)再把data传递给inputs, labels。
inputs, labels = data

注意:在需训练模型的过程中,可能会遇到的问题及解决方案。
在这里插入图片描述
在这里插入图片描述

举例子

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码

import torch
import numpy as np
from torch.utils.data import Dataset
from torch.utils.data import 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=1)
# ------------------------------------------------------- #
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.Rprop(model.parameters(), lr=0.01)
# ------------------------------------------------------- #
def print_hi(name):
    # Use a breakpoint in the code line below to debug your script.
    print(f'Hi, {name}')  # Press Ctrl+F8 to toggle the breakpoint.
# ------------------------------------------------------- #
if __name__ == '__main__':
    for epoch in range(100):
        for i, data in enumerate(train_loader, 0):
            # 1.Prepare data
            inputs, labels = data
            # 2. Forward
            y_pred = model(inputs)
            loss = criterion(y_pred, labels)
            print(epoch, i, loss.item())
            # 3. Backward
            optimizer.zero_grad()
            loss.backward()
            # 4. Update
            optimizer.step()

如果加载torchvision中现有的数据集
在这里插入图片描述
transform= transforms.ToTensor(),这句代表的意思是,将图片的数据0-256的像素值的图片类型转换到张量tensor类型后的数据值就转换到0-1之间。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页