使用PyTorch处理多维特征输入的完美指南

简介: 使用PyTorch处理多维特征输入的完美指南

🥦引言

机器学习和深度学习领域,我们经常会面对具有多维特征输入的问题。这种情况出现在各种应用中,包括图像识别、自然语言处理、时间序列分析等。PyTorch是一个强大的深度学习框架,它提供了丰富的工具和库,可以帮助我们有效地处理这些多维特征输入数据。在本篇博客中,我们将探讨如何使用PyTorch来处理多维特征输入数据。

🥦前期的回顾与准备

这里我们采用一组预测糖尿病的数据集,如下图


这里的每一行代表一个样本,同样的,每一列代表什么呢,代表一个特征,如下图。所以糖尿病的预测由下面这八个特征共同进行决定

按照过去的逻辑回归,应该是下图所示的,因为这是单特征值

但是现在由单特征值已经转变为多特征值了,所以我们需要对每个特征值进行处理,如下图

中间的特征值与权重的点乘可以从矩阵的形式进行表现

因为逻辑回归所以还有套一个Sigmoid函数,通常情况下我们将函数内的整体成为z(i)

注意: Sigmoid函数是一个按向量方式实现的

下面我们从矩阵相乘的形式进行展示,说明可以将一组方程合并为矩阵运算,可以想象为拼接哈。这样的目的是转化为并行运算,从而实现更快的运行速度。

所以从代码的角度去修改,我们只需要改变一下维度就行了

class Model(torch.nn.Module):
  def __init__(self):
    super(Model, self).__init__()
    self.linear = torch.nn.Linear(8, 1) 
    self.sigmoid = torch.nn.Sigmoid()
  def forward(self, x):
    x = self.sigmoid(self.linear(x)) 
    return x
model = Model()

这里的输入维度设置为8,就像上图中展示的x一样是N×8形式的矩阵,而y ^ \hat{y}y^是一个N×1的矩阵。

这里我们将矩阵看做是一个空间变换的函数

我们可以从下图很好的展示多层神经网络的变换

从一开始的属于8维变为输出6维,再从输入的6维变为输出的4维,最后从输入的4维变为输出的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, 1) 
    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)) 
    return x
model = Model()

这里我说明一下下面这条语句

  • self.sigmoid = torch.nn.Sigmoid():这一行创建了一个 Sigmoid 激活函数的实例,用于在神经网络的正向传播中引入非线性。

后面的前向计算就是一层的输出是另一层输入进行传,最后将y ^ \hat{y}y^返回


同时我们的损失函数也没有变化,更新函数也没有变化,采用交叉熵和梯度下降

刘二大人这里没有使用Mini-Batch进行批量,后续的学习应该会更新

🥦代码实现

import torch
import torch.nn as nn
import torch.optim as optim
from sklearn import datasets
from sklearn.model_selection import train_test_split
import numpy as np
# 载入Diabetes数据集
diabetes = datasets.load_diabetes()
# 将数据集拆分为特征和目标
X = diabetes.data  # 特征
y = diabetes.target  # 目标
# 数据预处理
X = (X - np.mean(X, axis=0)) / np.std(X, axis=0)  # 特征标准化
# 拆分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 转换为PyTorch张量
X_train = torch.FloatTensor(X_train)
y_train = torch.FloatTensor(y_train).view(-1, 1)  # 将目标变量转换为列向量
X_test = torch.FloatTensor(X_test)
y_test = torch.FloatTensor(y_test).view(-1, 1)
# 构建包含多个线性层的神经网络模型
class DiabetesModel(nn.Module):
    def __init__(self, input_size):
        super(DiabetesModel, self).__init__()
        self.fc1 = nn.Linear(input_size, 64)  # 第一个线性层
        self.fc2 = nn.Linear(64, 32)  # 第二个线性层
        self.fc3 = nn.Linear(32, 1)  # 最终输出线性层
    def forward(self, x):
        x = torch.relu(self.fc1(x))  # ReLU激活函数
        x = torch.relu(self.fc2(x))
        x = self.fc3(x)
        return x
# 初始化模型
input_size = X_train.shape[1]
model = DiabetesModel(input_size)
# 定义损失函数和优化器
criterion = nn.MSELoss()  # 均方误差损失
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 训练模型
num_epochs = 1000
for epoch in range(num_epochs):
    # 前向传播
    outputs = model(X_train)
    loss = criterion(outputs, y_train)
    # 反向传播和优化
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    if (epoch + 1) % 100 == 0:
        print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item():.4f}')
# 在测试集上进行预测
model.eval()
with torch.no_grad():
    y_pred = model(X_test)
# 计算性能指标
mse = nn.MSELoss()(y_pred, y_test)
print(f"均方误差 (MSE): {mse.item():.4f}")

运行结果如下

感兴趣的同学可以使用不同的激活函数一一测试一下

比如我使用tanh函数测试后得到的均方误差就小了许多

此链接是GitHub上的大佬做的可视化函数https://dashee87.github.io/deep%20learning/visualising-activation-functions-in-neural-networks/

🥦总结

这就是使用PyTorch处理多维特征输入的基本流程。当然,实际应用中,你可能需要更复杂的神经网络结构,更大的数据集,以及更多的调优和正则化技巧。但这个指南可以帮助你入门如何处理多维特征输入的问题,并利用PyTorch构建强大的深度学习模型。希望这篇博客对你有所帮助!

挑战与创造都是很痛苦的,但是很充实。

相关文章
|
机器学习/深度学习 PyTorch 算法框架/工具
使用Pytorch处理多维特征的输入
下图这个预测一个人在一年之后得糖尿病的概率的例子,这个时候我们的输入将会有很多的指标。你可以把它看成是我们体检的各种值。最后一排的外代表了他是否会得糖尿病。
194 0
|
机器学习/深度学习 资源调度 PyTorch
PyTorch实现随机傅里叶特征映射的示例代码
这里我们定义了一个名为RFFeatureMap的类,它继承自PyTorch的nn.Module类。该类接受输入维度input_dim、输出维度output_dim和高斯核参数sigma作为参数。在初始化函数中,我们生成了随机正弦和余弦函数的系数omega和随机偏移量b,并将它们保存在该类的实例变量中。 在前向函数中,我们首先将输入x转换为形状为(batch_size, input_dim)的张量。然后我们通过点乘x和omega的转置,加上偏移量b,并应用余弦函数,计算出特征映射z。最后我们返回特征映射z。
394 0
|
机器学习/深度学习 数据可视化 PyTorch
使用Pytorch和Matplotlib可视化卷积神经网络的特征(下)
使用Pytorch和Matplotlib可视化卷积神经网络的特征
356 0
使用Pytorch和Matplotlib可视化卷积神经网络的特征(下)
|
机器学习/深度学习 数据可视化 自动驾驶
使用Pytorch和Matplotlib可视化卷积神经网络的特征(上)
使用Pytorch和Matplotlib可视化卷积神经网络的特征
202 0
使用Pytorch和Matplotlib可视化卷积神经网络的特征(上)
|
机器学习/深度学习 并行计算 PyTorch
【PyTorch基础教程7】多维特征input
之前的一维特征input,只有一个x和权重w相乘,多维的情况则是xi依次与逐个wi相乘(ps:每行x都这样算,每行即每个样本),可以用向量形式表示:
174 0
【PyTorch基础教程7】多维特征input
|
2月前
|
算法 PyTorch 算法框架/工具
Pytorch学习笔记(九):Pytorch模型的FLOPs、模型参数量等信息输出(torchstat、thop、ptflops、torchsummary)
本文介绍了如何使用torchstat、thop、ptflops和torchsummary等工具来计算Pytorch模型的FLOPs、模型参数量等信息。
384 2
|
23天前
|
机器学习/深度学习 人工智能 PyTorch
Transformer模型变长序列优化:解析PyTorch上的FlashAttention2与xFormers
本文探讨了Transformer模型中变长输入序列的优化策略,旨在解决深度学习中常见的计算效率问题。文章首先介绍了批处理变长输入的技术挑战,特别是填充方法导致的资源浪费。随后,提出了多种优化技术,包括动态填充、PyTorch NestedTensors、FlashAttention2和XFormers的memory_efficient_attention。这些技术通过减少冗余计算、优化内存管理和改进计算模式,显著提升了模型的性能。实验结果显示,使用FlashAttention2和无填充策略的组合可以将步骤时间减少至323毫秒,相比未优化版本提升了约2.5倍。
42 3
Transformer模型变长序列优化:解析PyTorch上的FlashAttention2与xFormers
|
2月前
|
机器学习/深度学习 自然语言处理 监控
利用 PyTorch Lightning 搭建一个文本分类模型
利用 PyTorch Lightning 搭建一个文本分类模型
75 8
利用 PyTorch Lightning 搭建一个文本分类模型
|
2月前
|
机器学习/深度学习 自然语言处理 数据建模
三种Transformer模型中的注意力机制介绍及Pytorch实现:从自注意力到因果自注意力
本文深入探讨了Transformer模型中的三种关键注意力机制:自注意力、交叉注意力和因果自注意力,这些机制是GPT-4、Llama等大型语言模型的核心。文章不仅讲解了理论概念,还通过Python和PyTorch从零开始实现这些机制,帮助读者深入理解其内部工作原理。自注意力机制通过整合上下文信息增强了输入嵌入,多头注意力则通过多个并行的注意力头捕捉不同类型的依赖关系。交叉注意力则允许模型在两个不同输入序列间传递信息,适用于机器翻译和图像描述等任务。因果自注意力确保模型在生成文本时仅考虑先前的上下文,适用于解码器风格的模型。通过本文的详细解析和代码实现,读者可以全面掌握这些机制的应用潜力。
130 3
三种Transformer模型中的注意力机制介绍及Pytorch实现:从自注意力到因果自注意力
|
3月前
|
机器学习/深度学习 PyTorch 调度
在Pytorch中为不同层设置不同学习率来提升性能,优化深度学习模型
在深度学习中,学习率作为关键超参数对模型收敛速度和性能至关重要。传统方法采用统一学习率,但研究表明为不同层设置差异化学习率能显著提升性能。本文探讨了这一策略的理论基础及PyTorch实现方法,包括模型定义、参数分组、优化器配置及训练流程。通过示例展示了如何为ResNet18设置不同层的学习率,并介绍了渐进式解冻和层适应学习率等高级技巧,帮助研究者更好地优化模型训练。
214 4
在Pytorch中为不同层设置不同学习率来提升性能,优化深度学习模型