视频:https://www.bilibili.com/video/BV1Y7411d7Ys?p=8
博客:
https://blog.csdn.net/bit452/article/details/109686474
https://blog.csdn.net/weixin_44841652/article/details/105129235

这期教程讲的是如何使用dataset(构造数据集,支持索引)和dataloader(拿出一个mini-bath),咱们直接看代码,边看边说。

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

代码说明:

1、需要mini_batch 就需要import DataSet和DataLoader
2、继承DataSet的类需要重写init,getitem,len魔法函数。分别是为了加载数据集,获取数据索引,获取数据总量。
3、DataLoader对数据集先打乱(shuffle),然后划分成mini_batch。
4、len函数的返回值 除以 batch_size 的结果就是每一轮epoch中需要迭代的次数。
5、inputs, labels = data中的inputs的shape是[32,8],labels 的shape是[32,1]。也就是说mini_batch在这个地方体现的
6、diabetes.csv数据集老师给了下载地址,该数据集需和源代码放在同一个文件夹内。

DataLoader对数据集先打乱(shuffle),然后划分成mini_batch。

image.png

数据集加载

  • 数据少,一次加载
  • 数据多,将文件路径加载到一个列表,每次读取一个文件列表进行后续处理

image.png

image.png

训练循环

image.png

内置数据集介绍

  1. MNIST
  2. Fashion-MNIST
  3. EMNIST
  4. COCO
  5. LSUN
  6. ImageFolder
  7. DatasetFolder
  8. Imagenet-12
  9. CIFAR•STL10
  10. PhotoTour

image.png

Example: MINST Dataset

image.png
PyTorch

全部代码

  1. '''
  2. Description: 处理多维特征的输入
  3. 视频:https://www.bilibili.com/video/BV1Y7411d7Ys?p=7
  4. 博客:
  5. https://blog.csdn.net/bit452/article/details/109682078
  6. https://blog.csdn.net/weixin_44841652/article/details/105125826
  7. Author: HCQ
  8. Company(School): UCAS
  9. Email: 1756260160@qq.com
  10. Date: 2020-12-06 12:37:48
  11. LastEditTime: 2020-12-06 17:16:16
  12. FilePath: /pytorch/PyTorch深度学习实践/07处理多维特征的输入.py
  13. '''
  14. import torch
  15. # import torch.nn.functional as F # 没用到
  16. import numpy as np
  17. import matplotlib.pyplot as plt # 画图
  18. # from sklearn import datasets # 没用到
  19. # prepare dataset
  20. xy=np.loadtxt('./data/Diabetes_class.csv.gz',delimiter=',',dtype=np.float32)#加载训练集合
  21. x_data = torch.from_numpy(xy[:,:-1])#取前八列 第二个‘:-1’是指从第一列开始,最后一列不要
  22. y_data = torch.from_numpy(xy[:,[-1]]) # [-1] 最后得到的是个矩阵
  23. # 没有这个测试集
  24. # test =np.loadtxt('./data/test_class.csv.gz',delimiter=',',dtype=np.float32)#加载测试集合,这里我用数据集的最后一个样本做测试,训练集中没有最后一个样本
  25. # test_x = torch.from_numpy(test)
  26. # 2 design model using class
  27. class Model(torch.nn.Module):
  28. def __init__(self):#构造函数
  29. super(Model,self).__init__()
  30. self.linear1 = torch.nn.Linear(8,6)#8维到6
  31. self.linear2 = torch.nn.Linear(6, 4)#6维到4
  32. self.linear3 = torch.nn.Linear(4, 1)#4维到1
  33. self.sigmoid = torch.nn.Sigmoid()# 将其看作是网络的一层,而不是简单的函数使用 # 因为他里边也没有权重需要更新,所以要一个就行了,单纯的算个数
  34. # 尝试不同的激活函数 torch.nn.ReLU()
  35. def forward(self, x):#构建一个计算图,就像上面图片画的那样
  36. x = self.sigmoid(self.linear1(x))
  37. x = self.sigmoid(self.linear2(x))#将上面一行的输出作为输入
  38. x = self.sigmoid(self.linear3(x)) # # y hat ==================================
  39. return x
  40. # 3 construct loss and optimizer
  41. model = Model()#实例化模型
  42. criterion = torch.nn.BCELoss(size_average=False)
  43. #model.parameters()会扫描module中的所有成员,如果成员中有相应权重,那么都会将结果加到要训练的参数集合上
  44. optimizer = torch.optim.SGD(model.parameters(),lr=0.1)#lr为学习率,因为0.01太小了,我改成了0.1
  45. epoch_list = [] # 用来画图
  46. loss_list = [] # 用来画图
  47. # 4 training cycle forward, backward, update
  48. for epoch in range(1000):
  49. #Forward
  50. y_pred = model(x_data) # 没有用Mini_batch
  51. loss = criterion(y_pred,y_data)
  52. print(epoch,loss.item())
  53. epoch_list.append(epoch) # 用来画图
  54. loss_list.append(loss.item()) # 用来画图
  55. #Backward
  56. optimizer.zero_grad()
  57. loss.backward()
  58. #update
  59. optimizer.step()
  60. y_pred = model(x_data)
  61. print(y_pred.detach().numpy())
  62. # y_pred2 = model(test_x)
  63. # print(y_pred2.data.item())
  64. # 绘图
  65. plt.plot(epoch_list, loss_list)
  66. plt.ylabel('loss')
  67. plt.xlabel('epoch')
  68. plt.show()

image.png

Exercise8.1 Titanic dataset

image.png