视频: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特征
视频中截图


说明: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的区别
矩阵看成空间的转换映射函数(维度变换)

为什么要多次降维,而不是一次降维8→ 1????
回答:中间神经元越多,参数越多,学习能力越强
根据数据集,我们需要构造一个从八维到一维的计算图,就是这样:

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有风险
import torchclass 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.activate = torch.nn.ReLU()def forward(self, x):x = self.activate(self.linear1(x))x = self.activate(self.linear2(x))x = self.activate(self.linear3(x))return xmodel = Model()Lecturer : Hongpu LiuLecture 7-26

官方激活函数API:https://pytorch.org/docs/stable/nn.html#non-linear-activations-weighted-sum-nonlinearity
完整代码
'''Description: 处理多维特征的输入视频:https://www.bilibili.com/video/BV1Y7411d7Ys?p=7博客:https://blog.csdn.net/bit452/article/details/109682078https://blog.csdn.net/weixin_44841652/article/details/105125826Author: HCQCompany(School): UCASEmail: 1756260160@qq.comDate: 2020-12-06 12:37:48LastEditTime: 2020-12-06 19:59:50FilePath: /pytorch/PyTorch深度学习实践/07处理多维特征的输入.py'''import torch# import torch.nn.functional as F # 没用到import numpy as npimport matplotlib.pyplot as plt # 画图# from sklearn import datasets # 没用到# prepare datasetxy=np.loadtxt('./data/diabetes.csv.gz',delimiter=',',dtype=np.float32)#加载训练集合x_data = torch.from_numpy(xy[:,:-1])#取前八列 第二个‘:-1’是指从第一列开始,最后一列不要y_data = torch.from_numpy(xy[:,[-1]]) # [-1] 最后得到的是个矩阵# 没有这个测试集# test =np.loadtxt('./data/test_class.csv.gz',delimiter=',',dtype=np.float32)#加载测试集合,这里我用数据集的最后一个样本做测试,训练集中没有最后一个样本# test_x = torch.from_numpy(test)# 2 design model using classclass Model(torch.nn.Module):def __init__(self):#构造函数super(Model,self).__init__()self.linear1 = torch.nn.Linear(8,6)#8维到6维self.linear2 = torch.nn.Linear(6, 4)#6维到4维self.linear3 = torch.nn.Linear(4, 1)#4维到1维self.sigmoid = torch.nn.Sigmoid()# 将其看作是网络的一层,而不是简单的函数使用 # 因为他里边也没有权重需要更新,所以要一个就行了,单纯的算个数# 尝试不同的激活函数 torch.nn.ReLU()def forward(self, x):#构建一个计算图,就像上面图片画的那样x = self.sigmoid(self.linear1(x))x = self.sigmoid(self.linear2(x))#将上面一行的输出作为输入x = self.sigmoid(self.linear3(x)) # # y hat ==================================return x# 3 construct loss and optimizermodel = Model()#实例化模型criterion = torch.nn.BCELoss(size_average=False)#model.parameters()会扫描module中的所有成员,如果成员中有相应权重,那么都会将结果加到要训练的参数集合上optimizer = torch.optim.SGD(model.parameters(),lr=0.01)#lr为学习率epoch_list = [] # 用来画图loss_list = [] # 用来画图# 4 training cycle forward, backward, updatefor epoch in range(1000):#Forwardy_pred = model(x_data) # 没有用Mini_batchloss = criterion(y_pred,y_data)print(epoch,loss.item())epoch_list.append(epoch) # 用来画图loss_list.append(loss.item()) # 用来画图#Backwardoptimizer.zero_grad()loss.backward()#updateoptimizer.step()y_pred = model(x_data)print(y_pred.detach().numpy())# y_pred2 = model(test_x)# print(y_pred2.data.item())# 绘图plt.plot(epoch_list, loss_list)plt.ylabel('loss')plt.xlabel('epoch')plt.show()
结果

