前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Pytorch基础】处理多维特征的输入

【Pytorch基础】处理多维特征的输入

作者头像
yhlin
发布2023-02-27 17:00:39
8520
发布2023-02-27 17:00:39
举报
文章被收录于专栏:yhlin's blogyhlin's blog

回顾

  到目前为止,我们讨论的都是只有一个实数输入的模型。但实际情况要复杂的多,因此,如何处理多维输入是个非常重要的问题。

关于糖尿病的二分类问题

1. 准备数据集

【Pytorch 基础】处理多维特征的输入
【Pytorch 基础】处理多维特征的输入

上述样本的输入为 8 个指标,输出为两个类别(病情未来会加重 1、病情未来不会加重 0)。

代码语言:javascript
复制
import numpy as np
import torch

xy = np.loadtxt('https://project-preview-1257022783.cos.ap-chengdu.myqcloud.com/diabetes.csv.gz',delimiter=',',dtype=np.float32)

# 创建 tensor
x_data = torch.from_numpy(xy[:,:-1]) # 所有行,最后一列不要
y_data = torch.from_numpy(xy[:,[-1]]) # 所有行,只要最后一列,- 1 加 [] 表示拿出来一个矩阵,而不是向量

多维度输入的逻辑回归模型

  上述数据集的输入不再是一个简单的实数,而是一个 8 维向量 x^{(i)}, 对于单个样本其模型为:

\hat{y}^{(i)} = \sigma (w^T \times x^{(i)} + b)
\Leftrightarrow \sigma (\sum{n=1}^{8} x{n}^{(i)} \cdot w_n + b)
\Leftrightarrow \sigma((w^T \times x^{(i)})^T + b) \text{标量的转置还是该标量}
\Leftrightarrow \sigma \left(\begin{bmatrix} x_1 & x_2 & x_3 & x_4 & x_5 & x_6 & x_7 & x_8 \end{bmatrix} \times \begin{bmatrix} w_1 \ w_2 \ w_3 \ w_4 \ w_5 \ w_6 \ w_7 \ w_8 \end{bmatrix} + b \right) = \sigma(z^{(i)})

上述操作得到一个标量 \hat{y}^{(i)}, \sigma 为 Logistic 函数。

Mini-Batch(N samples) 情况下

  Mini_Batch 的大小为 N, 即每次更新都根据 N 个样本来计算损失,其模型为:

\begin{bmatrix} \hat{y}^{(1)} \ \vdots \ \hat{y}^{(N)} \end{bmatrix} = \begin{bmatrix} \sigma(z^{(1)}) \ \vdots \ \sigma(z^{(N)}) \end{bmatrix} = \sigma(\begin{bmatrix} z^{(1)} \ \vdots \ z^{(N)} \end{bmatrix})

其中:

z^{(1)} = \begin{bmatrix} x{1}^{(1)} & \cdots & x{8}^{(1)} \end{bmatrix} \times \begin{bmatrix} w_1 \ \vdots \ w_8 \end{bmatrix} + b
z^{(N)} = \begin{bmatrix} x{1}^{(N)} & \cdots & x{8}^{(N)} \end{bmatrix} \times \begin{bmatrix} w_1 \ \vdots \ w_8 \end{bmatrix} + b

即:

\begin{bmatrix} z^{(1)} \ \vdots \ z^{(N)} \end{bmatrix}{N\times 1} = \begin{bmatrix} x{1}^{(1)} & \cdots & x{8}^{(1)} \ \vdots & \ddots & \vdots \ x{1}^{(N)} & \cdots & x{8}^{(N)} \end{bmatrix}{N\times 8} \begin{bmatrix} w_1 \ \vdots \ w8 \end{bmatrix}{8\times 1} + \begin{bmatrix} b \ \vdots \ b \end{bmatrix}_{N\times 1}

构造多层神经网络

先导知识: 对于矩阵运算 y = A \times x 其中

y{m \times 1},A{m \times n},x_{n \times 1}

那么,上式表示为将 n 维空间映射到 m 维空间的一个线性变换。 因此,可以将矩阵看成一种空间变换的函数。 所以,self.linear = torch.nn.Linear(8,6) 就可以看做将一个 8 维空间经过线性变换映射到一个 6 维空间上。 但是,若我们在每一次线性变换后加入了非线性函数 \sigma,就可以实现非线性变换,使得模型可以拟合非线性问题。

  多层神经网络,就是通过拼接多次变换得到的:

【Pytorch 基础】处理多维特征的输入
【Pytorch 基础】处理多维特征的输入
【Pytorch 基础】处理多维特征的输入
【Pytorch 基础】处理多维特征的输入

注意:理论上,隐层数量越多模型的学习能力就越强。但是,太强的学习能力会导致模型连数据中的噪声都学习到了(过拟合)反而适得其反。一个号的模型应该要具有一定的泛化能力,不能去死扣细节而去抓住问题的主要矛盾。因此,层数的多少应该根据实际情况适当尝试调整,而不是一味地求多。

定义多层神经网络

代码语言:javascript
复制
class Model(torch.nn.Module):
    def __init__(self):
        super(Model,self).__init__()
        self.linear1 = torch.nn.Linear(8,6) # 输入维度为 8
        self.linear2 = torch.nn.Linear(6,4)
        self.linear3 = torch.nn.Linear(4,1)
        self.activate = torch.nn.Sigmoid() # 激活函数

    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()

损失函数和优化器

代码语言:javascript
复制
criterion = torch.nn.BCELoss(reduction="mean")
optimizer = torch.optim.SGD(model.parameters(),lr=0.01)

训练模型

代码语言:javascript
复制
h_list = []
l_list = []
for epoch in range(10000):
    # 前馈计算
    y_pred = model(x_data)
    loss = criterion(y_pred,y_data)
    print(epoch, loss.item())
    h_list.append(epoch)
    l_list.append(loss.item())

    # 反向传播
    optimizer.zero_grad()
    loss.backward()

    # 更新参数
    optimizer.step()

绘制收敛图

代码语言:javascript
复制
import matplotlib.pyplot as plt

plt.plot(h_list, l_list)
plt.ylabel('loss')
plt.xlabel('epoch')
plt.show()
【Pytorch 基础】处理多维特征的输入
【Pytorch 基础】处理多维特征的输入
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-01-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 回顾
  • 关于糖尿病的二分类问题
    • 1. 准备数据集
    • 多维度输入的逻辑回归模型
    • Mini-Batch(N samples) 情况下
    • 构造多层神经网络
    • 定义多层神经网络
    • 损失函数和优化器
    • 训练模型
      • 绘制收敛图
      相关产品与服务
      批量计算
      批量计算(BatchCompute,Batch)是为有大数据计算业务的企业、科研单位等提供高性价比且易用的计算服务。批量计算 Batch 可以根据用户提供的批处理规模,智能地管理作业和调动其所需的最佳资源。有了 Batch 的帮助,您可以将精力集中在如何分析和处理数据结果上。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档