Pytorch学习笔记第七课处理多维特征输入

笔记来源于B站up主,@刘二大人

视频链接07.处理多维特征的输入_哔哩哔哩_bilibili

感谢所有社区创作者提供的帮助。 

前言回顾 

前面所学习的参数输入都只有一个维度的特征,如下图所示,左边是回归问题,右边是分类问题

 他们的特点是输入都只有一个维度特征。

本期任务

多维特征输入数据集

一个输入多个特征:输入参数x多个维度的特征共同决定了y的取值。

下图也是一个分类任务,具体可描述为,根据一个人的8个特征指标,判断这个人是否生病了

每一行是一个样本sample,每一列是一个特征feature

多维logistic回归模型

特征x*对应权重w,记上偏置b得到参数z,对z使用激活函数\sigma,变为一个概率分布

回归函数从单一特征对应单一权重变为多特征对应多个权重,偏置b利用广播机制进行广播

线性模型

构造这种8个输入1个输出的函数,采用torch.nn.Linear(8,1)

Linear就是对输入X^{n}_i进行一个线性变换

Y_{m\times n} = X_{m\times i} W_{i\times n}+b 具体见下文

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博客

PyTorch基础(六)----- torch.eq()方法_底层研究生的博客-CSDN博客

关于python中.item()的用法-CSDN博客

torch.sum()函数用法_torch求和_MinPang的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值