深度学习- 加载数据集-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.
DataLoader与Dataset不同,DataLoader是一个可以直接调用的类,可以对他实例化调用。
定义数据集需要5个重要的部分
- class DiabetesDataset(Dataset),DiabetesDataset继承Dataset父类
- def init(self): 初始化
- def getitem(self, index): 可以索引数据集中的任何一个元素
- def len(self): 知道数据集的长度
- 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之间。