视频:https://www.bilibili.com/video/BV1Y7411d7Ys?p=7
博客:
https://blog.csdn.net/bit452/article/details/109682078
https://blog.csdn.net/weixin_44841652/article/details/105125826


官方激活函数API:https://pytorch.org/docs/stable/nn.html#non-linear-activations-weighted-sum-nonlinearity

知识点

最后一个激活函数要用sigmoid,用RELU,后面计算ln0有风险

回归和分类的区别

  • 回归:y是实数
  • 分类:y是离散的集合

糖尿病数据集
一行:Sample样本
一列:Feature特征
image.png

视频中截图
7 处理多维特征的输入(8列特征举例) - 图2
image.png
image.png
说明:1、N个Samples,8个Future。只有行向量是不同的样本。乘的权重(w)都一样,加的偏置(b)也一样。b变成矩阵时使用广播机制。
2、学习能力越强,有可能会把输入样本中噪声的规律也学到。我们要学习数据本身真实数据的规律,学习能力要有泛化能力。
3、一次处理一个样本,8维到1维的非线性空间变换
4、torch.nn.Sigmoid() # 将其看作是网络的一层,而不是简单的函数使用
5、torch.sigmoid、torch.nn.Sigmoid和torch.nn.functional.sigmoid的区别

矩阵看成空间的转换映射函数(维度变换)

image.png

为什么要多次降维,而不是一次降维8→ 1????
回答:中间神经元越多,参数越多,学习能力越强

根据数据集,我们需要构造一个从八维到一维的计算图,就是这样:
image.pngimage.png

1 Prepare dataset

数据集通常用32位浮点数 float32,因为一般GPU1080,2080只支持32位浮点数,当然特斯拉的GPU支持double类型的

2 Design model using Class

3 Construct loss and optimizer

4 Training cycle

尝试不同激活函数

最后一个激活函数要用sigmoid,用RELU,后面计算ln0有风险
image.png

  1. import torch
  2. class Model(torch.nn.Module):
  3. def __init__(self):
  4. super(Model, self).__init__()
  5. self.linear1 = torch.nn.Linear(8, 6)
  6. self.linear2 = torch.nn.Linear(6, 4)
  7. self.linear3 = torch.nn.Linear(4, 1)
  8. self.activate = torch.nn.ReLU()
  9. def forward(self, x):
  10. x = self.activate(self.linear1(x))
  11. x = self.activate(self.linear2(x))
  12. x = self.activate(self.linear3(x))
  13. return x
  14. model = Model()
  15. Lecturer : Hongpu Liu
  16. Lecture 7-26

image.png

官方激活函数API:https://pytorch.org/docs/stable/nn.html#non-linear-activations-weighted-sum-nonlinearity

完整代码

  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 19:59:50
  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.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.01)#lr为学习率
  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