【PyTorch深度学习实践】学习笔记 第八节 序 文本数据集的加载

课程链接PyTorch深度学习实践第八节课程。
go go go~!

这一讲将介绍非常重要的加载数据集的相关知识,加油·~~!学习到这里你应该非常激动,因为学会他们之后,马上你就能独自探索深度学习项目实践的世界了!!

介绍:

1、DataSet 是抽象类,不能实例化对象,主要是用于构造我们的数据集. 只能通过自定义一个class, 然后调用。就像前面torch.nn.Module

class LinearModel ( torch.nn.Module ):
def _init_ (self):
pass

2、DataLoader 需要获取DataSet提供的索引[i]和len ; 用来帮助我们加载数据,比如说做shuffle(提高数据集的随机性),batch_size, 能拿出Mini-Batch进行训练。它帮我们自动完成这些工作。DataLoader是可实例化对象

DataLoader( dataset = dataset , #dataset 是继承了dataset类之后加载数据集提供路径
            batch_size = 32, #选择batch_size的大小
            shuffle = true,  #增强数据集随机性
            num_workers = 2 ) #多进程读数据

先来看代码,然后解释里面的细节

代码

import  torch
import  numpy as np
from torch.utils.data import Dataset
from torch.utils.data import DataLoader


#一  prepare datasets
'''
Dataset是一个抽象函数,不能直接实例化,所以我们要创建一个自己类,继承Dataset
继承Dataset后我们必须实现三个函数:
__init__()是初始化函数,之后我们可以提供数据集路径进行数据的加载
__getitem__()帮助我们通过索引找到某个样本
__len__()帮助我们返回 数据集大小  /一个epoch中迭代的次数,即iteration
'''
class DiabetesDataset(Dataset):
 def __init__(self,filepath):
 	xy=np.loadtxt(filepath,delimiter=',',dtype=np.float32)
 	# shape本身是一个二元组,对应数据集的行数和列数,这里[0]取行数,即样本数
 	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): # 根据index返回相应的x和y的data
 	return self.x_data[index] ,self.y_data[index]
 
 def __len__(self):
 	return self.len

# 定义好DiabetesDataset类 后 就可以实例化了
dataset = DiabetesDataset('diabetes.csv')
train_loader = DataLoader(dataset=dataset,batch_size=32,shuffle=True,num_workers=2) # Dataloader 是可实例化对象  在加载数据集时 先进行的Dataloader,见另一篇博客
print('train_loader size:',train_loader.shape[0])

# 二 construct model
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()

# 三construct criterion and optimizer
criterion = torch.nn.BCEloss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(),lr=0.1) #lr为学习率  model.parameters()会扫描module 几个线性模块里的所有成员,如果成员有相应权重,那么将结果加到要训练的参数集合上

# 四train cycles
if __name__=='__main__': 
	for epoch in range(100):
		for i,data in enumerate(train_loader,0): 
			inputs,labels =data # 这里查了python里 enumerate函数用法  
			# forward
			y_pred = model(inputs)
			loss = criterion(y_pred,labels)
			print(epoch,loss.item())
			# backward
			optimizer.zero_grad()
			loss.backward()
			# update w
			optimizer.step()

在这里插入图片描述

代码解释

1、对比第七讲的载入数据集部分载入的是全部样本(批量梯度下降),而本讲的训练使用的是mini_batch(小批量梯度下降), 就需要import DataSet和DataLoader了。即小批量操作,每次是一个batch_size大小的数据集。
2、继承DataSet的类需要重写init,getitem, len 魔法函数。分别是为了加载数据集,获取索引的数据,获取数据总量。
3、上图展示的是DataLoader对数据集先打乱(shuffle),然后划分成mini_batch。
4、len函数的返回值 ➗ batch_size 就是每一轮epoch中需要迭代的次数(即所有样本被划分为多少个batch,样本总数 / batch_size)。
5、inputs, labels = data中的inputs的shape是[32,8],labels 的shape是[32,1]。也就是说mini_batch在这个地方体现的 (batch_size = 32)
另外enumerate函数的用法,是一个得到下标的函数,将一个可遍历的数据对象(如列表/元组/string组合为一个索引序列,同时得到数据和迭代次数,分别赋给data和 i )
这里train_loader 得到的是有许多组大小为32的样本集,每次迭代一个batch_size的x_data和y_data。
从代码中可以发现,数据的获取是通过for循环获取的;
for i, data in enumerate(train_loader):
DataLoader迭代器中不停地去获取一个Batchsize大小的数据。
6、diabetes.csv数据集老师给了下载地址,该数据集需和源代码放在同一个文件夹内。
7、 shape 元组
对于图像来说
img.shape[0]:图像的垂直尺寸(高度)
img.shape[1]:图像的水平尺寸(宽度)
img.shape[2]:图像的通道数
对于矩阵来说
shape[0]:表示矩阵的行数
shape[1]:表示矩阵的列数

by 小李

如果你坚持到这里了,请一定不要停,山顶的景色更迷人!好戏还在后面呢。加油!
欢迎交流学习和批评指正,你的点赞和留言将会是我更新的动力!谢谢😃

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值