视频: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 torch
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.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 x
model = Model()
Lecturer : Hongpu Liu
Lecture 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/109682078
https://blog.csdn.net/weixin_44841652/article/details/105125826
Author: HCQ
Company(School): UCAS
Email: 1756260160@qq.com
Date: 2020-12-06 12:37:48
LastEditTime: 2020-12-06 19:59:50
FilePath: /pytorch/PyTorch深度学习实践/07处理多维特征的输入.py
'''
import torch
# import torch.nn.functional as F # 没用到
import numpy as np
import matplotlib.pyplot as plt # 画图
# from sklearn import datasets # 没用到
# prepare dataset
xy=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 class
class 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 optimizer
model = 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, update
for epoch in range(1000):
#Forward
y_pred = model(x_data) # 没有用Mini_batch
loss = criterion(y_pred,y_data)
print(epoch,loss.item())
epoch_list.append(epoch) # 用来画图
loss_list.append(loss.item()) # 用来画图
#Backward
optimizer.zero_grad()
loss.backward()
#update
optimizer.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()