当前位置:   article > 正文

八、加载数据集_loader = dataloader(data_list, batch_size=32)

loader = dataloader(data_list, batch_size=32)

一、通过维度变化

        梯度下降:采用全部样本

        随机梯度下降

二、Mini-Batch

        1)DataSet 是抽象类,不能实例化对象,主要是用于构造我们的数据集

        2)DataLoader 需要获取DataSet提供的索引[i]和len;用来帮助我们加载数

        3)对应参数:

epoch:对全部训练样本实现一次前馈和反馈

Batch-Size:一次前馈和反馈包含的训练样本数量

Iterations: Batch分成了多少份,内部循环的次数

三、DataLoader : Batch-Size = 2 ,shuffle = True(随机打乱)

3.1 步骤

        1)需要提供样本数量和样本长度

        2)随机打乱顺序

        3)样本分组形成迭代Loader

四、数据集划分

x_train,x_test,y_train,y_test=sklearn.model_selection.train_test_split(x_data,y_target,test_size=0.4, random_state=0, stratify=y_train)

        1)x_data :所要划分的样本特征数据集()数据集

        2)y_data :所要划分的样本标签

        3)test_size :测试集样本占比

        4)random_state:随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。控制随机状态,固定random_state后,每次构建的模型是相同的、生成的数据集是相同的、每次的拆分结果也是相同的。

        5)stratify是为了保持split前类的分布:

比如有100个数据,80个属于A类,20个属于B类。如果train_test_split(… test_size=0.25, stratify = y_all), 那么split之后数据如下:

training: 75个数据,其中60个属于A类,15个属于B类。

testing: 25个数据,其中20个属于A类,5个属于B类。

用了stratify参数,training集和testing集的类的比例是 A:B= 4:1,等同于split前的比例(80:20)。通常在这种类分布不平衡的情况下会用到stratify。

将stratify=X就是按照X中的比例分配

将stratify=y就是按照y中的比例分配

五、代码实现

代码说明:

        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在这个地方体现的

  1. #dataset and dataloader
  2. import numpy as np
  3. import torch
  4. from torch.utils.data import Dataset #数据工具,为抽象类不可实例化只可用子类继承
  5. from torch.utils.data import DataLoader #可用来加载数据,可实例化
  6. import matplotlib.pyplot as plt
  7. import os
  8. os.environ['KMP_DUPLICATE_LIB_OK']='True'
  9. #___________________________________Prepare dataset___________________________________#
  10. '''
  11. Dataset是一个抽象函数,不能直接实例化,所以我们要创建一个自己类,继承Dataset
  12. 继承Dataset后我们必须实现三个函数:
  13. __init__()是初始化函数,之后我们可以提供数据集路径进行数据的加载
  14. __getitem__()帮助我们通过索引找到某个样本
  15. __len__()帮助我们返回数据集大小
  16. '''
  17. class DiabetesDataset(Dataset): #继承Dataset
  18. def __init__(self,filepath): #输入文件地址
  19. xy = np.loadtxt(filepath,delimiter = ',',dtype = np.float32) #下载文件,分割,读取32浮点数
  20. self.len = xy.shape[0] #取xyshape[0] 数据集为N*9 取第0元素得到数据集的个数N
  21. #shape本身是一个二元组(x,y)对应数据集的行数和列数,这里[0]我们取行数,即样本数
  22. self.x_data = torch.from_numpy(xy[:, :-1])
  23. self.y_data = torch.from_numpy(xy[:, [-1]])
  24. def __getitem__(self, index): #支持下标索引
  25. return self.x_data[index], self.y_data[index]
  26. def __len__(self): #获取数据集
  27. return self.len
  28. loss_list = []
  29. dataset = DiabetesDataset('D:\\anaconda3\\Lib\\site-packages\\sklearn\\datasets\\data\\diabetes.csv.gz')
  30. train_loader = DataLoader(dataset = dataset, #传递数据集
  31. batch_size =32,
  32. shuffle = True,
  33. num_workers = 0) #读取mini-batch进行的线程提高读取效率
  34. #___________________________________Design model using class___________________________________#
  35. class Model(torch.nn.Module):
  36. def __init__(self):
  37. super(Model,self).__init__()
  38. self.linear1 = torch.nn.Linear(8,6) #多维降维
  39. self.linear2 = torch.nn.Linear(6,4)
  40. self.linear3 = torch.nn.Linear(4,1) #输入维度为8 输出维度为1
  41. # self.linear4 = torch.nn.Linear(2,1)
  42. self.sigmoid = torch.nn.Sigmoid() #添加激活函数模块作为计算模块,添加非线性变换
  43. #添加激活函数模块作为网络的一层,计算模块,添加非线性变换,无参数无需训练
  44. #可采用多种激活函数,最常用ReLU,但是采用ReLU的过程中需要考虑,当x<0,ln(ReLU(x))错误
  45. #可以改为:
  46. self.activate = torch.nn.ReLU()
  47. #def forward (self,x):
  48. #x = self.activate(self.linear1(x))
  49. #x = self.activate(self.linear2(x))
  50. #x = self.activate(self.linear3(x))
  51. #x = self.activate(self.linear4(x))
  52. def forward (self,x):
  53. x = self.activate(self.linear1(x)) #调用非线性函数做变换
  54. x = self.activate(self.linear2(x))
  55. x = self.sigmoid(self.linear3(x))
  56. return x
  57. model = Model()
  58. #___________________________________construct loss and optimizer___________________________________#
  59. criterion = torch.nn.BCELoss(reduction='sum')
  60. optimizer = torch.optim.Adam(model.parameters(),lr = 0.05)
  61. #___________________________________Training cycle___________________________________#
  62. #if __name__ == '__main__':
  63. for epoch in range(100):
  64. for i, (inputs,labels) in enumerate (train_loader ,0): #遍历索引并得到索引值
  65. y_pred = model(inputs)
  66. loss = criterion(y_pred, labels)
  67. print(epoch , i,loss.item())
  68. #backward
  69. optimizer.zero_grad()
  70. loss.backward()
  71. optimizer.step()
  72. loss_list.append(loss.item())
  73. plt.plot(range(100*(dataset.__len__()//32+1)), loss_list)
  74. plt.ylabel('loss')
  75. plt.xlabel('epoch')
  76. plt.show()

六、拓展

        with torch.no_gard()和requires_gard

requires_gardtensor有该参数,可设置为True,在进行反向传播的过程中,该tensor会自动求导。设置为False节省时间

        with torch.no_gard():在该模块下计算的tensor.requires_gard =False

将数据集分为训练集和测试集,采用Mini-Batch,并对测试集的准确率进行评估

  1. import torch
  2. import numpy as np
  3. from torch.utils.data import Dataset
  4. from torch.utils.data import DataLoader
  5. from sklearn.model_selection import train_test_split
  6. import matplotlib.pyplot as plt
  7. import os
  8. os.environ['KMP_DUPLICATE_LIB_OK']='True'
  9. xy_data = np.loadtxt('D:\\anaconda3\\Lib\\site-packages\\sklearn\\datasets\\data\\diabetes.csv.gz',delimiter = ',',dtype = np.float32)
  10. x = xy_data[:, :-1]
  11. y = xy_data[:,[-1]]
  12. x_train ,x_test,y_train,y_test = train_test_split(x,y,test_size = 0.3)
  13. x_test = torch.from_numpy(x_test)
  14. y_test = torch.from_numpy(y_test)
  15. #nimi_batch
  16. class DiabetesDataset(Dataset):
  17. def __init__(self, data,label):
  18. self.x_data = torch.from_numpy(data)
  19. self.y_data = torch.from_numpy(label)
  20. self.len = data.shape[0]
  21. def __getitem__(self,index):
  22. return self.x_data[index] ,self.y_data[index]
  23. def __len__(self):
  24. return self.len
  25. #实例化对象
  26. train_dataset = DiabetesDataset(x_train,y_train)
  27. train_loader = DataLoader(dataset=train_dataset, batch_size=32, shuffle=True, num_workers=0)
  28. #数据batch
  29. class Model(torch.nn.Module):
  30. def __init__(self):
  31. super(Model,self).__init__()
  32. self.linear1 = torch.nn.Linear(8,6)
  33. self.linear2 = torch.nn.Linear(6,4)
  34. self.linear3 = torch.nn.Linear(4,2)
  35. self.linear4 = torch.nn.Linear(2,1)
  36. self.activate = torch.nn.ReLU()
  37. self.sigmoid = torch.nn.Sigmoid()
  38. def forward(self,x):
  39. x = self.activate(self.linear1(x))
  40. x = self.activate(self.linear2(x))
  41. x = self.activate(self.linear3(x))
  42. x = self.sigmoid(self.linear4(x))
  43. return x
  44. model =Model()
  45. #优化器和损失函数
  46. criterion = torch.nn.BCELoss(reduction = 'sum')
  47. optimizer = torch.optim.SGD(model.parameters(),lr =0.01)
  48. loss_list = []
  49. acc_list = []
  50. count =0
  51. for epoch in range(5000):
  52. for i,data in enumerate(train_loader,0):
  53. inputs ,labels =data
  54. y_preds =model(inputs)
  55. loss = criterion(y_preds, labels)
  56. print('Epoch = ',epoch,'i = ',i)
  57. print('\t',loss.item())
  58. #backward
  59. optimizer.zero_grad()
  60. loss.backward()
  61. optimizer.step()
  62. loss_list.append(loss.item())
  63. if epoch%200 == 0:
  64. with torch.no_grad():
  65. count +=1
  66. y_pred = model(x_test)
  67. y_pred_label = torch.where(y_pred>=0.5,torch.tensor([1.0]),torch.tensor([0.0]))
  68. acc = torch.eq(y_pred_label, y_test).sum().item() / Ytest.size(0)
  69. acc_list.append(acc)
  70. print("\t test acc : ", acc)
  71. plt.plot(range(5000*(train_dataset.__len__()//32+1)), loss_list)
  72. plt.ylabel('loss')
  73. plt.xlabel('epoch')
  74. plt.show()
  75. plt.plot(range(count), acc_list)
  76. plt.ylabel('Acc')
  77. plt.xlabel('epoch')
  78. plt.show()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/318246
推荐阅读
相关标签
  

闽ICP备14008679号