笔记来源于B站up主,@刘二大人
视频链接07.处理多维特征的输入_哔哩哔哩_bilibili
感谢所有社区创作者提供的帮助。
前言回顾
前面所学习的参数输入都只有一个维度的特征,如下图所示,左边是回归问题,右边是分类问题
他们的特点是输入都只有一个维度特征。
本期任务
多维特征输入数据集
一个输入多个特征:输入参数x多个维度的特征共同决定了y的取值。
下图也是一个分类任务,具体可描述为,根据一个人的8个特征指标,判断这个人是否生病了
每一行是一个样本sample,每一列是一个特征feature
多维logistic回归模型
特征x*对应权重w,记上偏置b得到参数z,对z使用激活函数,变为一个概率分布
回归函数从单一特征对应单一权重变为多特征对应多个权重,偏置b利用广播机制进行广播
线性模型
构造这种8个输入1个输出的函数,采用torch.nn.Linear(8,1)
Linear就是对输入进行一个线性变换
具体见下文
Pytorch nn.Linear的基本用法与原理详解_iioSnail的博客-CSDN博客
网络构造
使用多个线性层建立网络,逐步的从8输入过渡到1输出
损失函数和优化器
依旧是二分类问题,采用二分类交叉熵损失BCELoss
随机梯度下降法SGD来对权重w进行优化
代码
代码参考:PyTorch 深度学习实践 第7讲_layer_weight.shape-CSDN博客
import numpy as np
import torch
'''
训练任务
给的数据集为diabetes数据集,其中输入x有8个特征维度,输出y为0或1
具体含义:根据病人的8个生理指标判断是否生病,生病为1没病为0
'''
# 加载数据集,用','作为分隔符来分隔每个数据,数据类型设置为32位浮点数
# Tesla和NV高端系列显卡才支持double数据类型
xy = np.loadtxt('diabetes.csv.gz', delimiter=',', dtype=np.float32)
'用torch.from_numpy从xy这个np数据类型从提取数据,提取出的数据自动转为tensor数据类型'
# # 第一个‘:’取所有行,第二个‘:’指从第一列开始,最后一列不要
x_data = torch.from_numpy(xy[:, :-1])
# 取所有行的最后一列,[-1]表示最后得到的是个矩阵,和-1:效果相同
y_data = torch.from_numpy(xy[:, [-1]])
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, 2)
self.linear4 = torch.nn.Linear(2, 1)
# torch.nn.Sigmoid()是一个模块,自身没有参数,创建一个后面可以反复调用
# torch.Sigmoid()是一个函数
self.sigmoid = torch.nn.Sigmoid()
def forward(self, x):
x = self.sigmoid(self.linear1(x))
x = self.sigmoid(self.linear2(x))
x = self.sigmoid(self.linear3(x))
x = self.sigmoid(self.linear4(x))
return x
model = Model()
# 构造损失函数和优化器
# criterion = torch.nn.BCELoss(size_average=True)
criterion = torch.nn.BCELoss(reduction='mean')
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
# 训练循环
for epoch in range(1000000):
# 前馈
y_pred = model(x_data)
loss = criterion(y_pred,y_data)
# print(epoch, loss.item())
# 反馈
optimizer.zero_grad()
loss.backward()
# 更新
optimizer.step()
if epoch % 100000 == 99999:
'条件判断语句torch.where(condition, x, y) condition为判断条件,True返回x,False返回y'
# 所有预测结果y≥0.5的判断为生病取1,y<0.5的取0
y_pred_label = torch.where(y_pred >= 0.5, torch.tensor([1.0]), torch.tensor([0.0]))
'torch.eq(input, other, *, out=None)判断input和other,相同位置的两个元素相同,则返回True否则返回False'
'.sum()用于计算输入张量的所有元素之和,即计算所有'
# 计算判断准确度
# 将预测值与真实值通过eq对应比较,将所有True统计起来即为判断对的数量,除以总数y_data.size(0)就是正确率
acc = torch.eq(y_pred_label, y_data).sum().item() / y_data.size(0)
print("loss = ", loss.item(), "acc = ", acc)
结果
部分代码解释
torch.where() torch.eq() .sum() .tiem()
torch.where()函数详解_带上吉他去大理的博客-CSDN博客