• 使用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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这里的输入维度设置为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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

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

    • 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}")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73

    运行结果如下
    在这里插入图片描述

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

    比如我使用tanh函数测试后得到的均方误差就小了许多
    在这里插入图片描述

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

    🥦总结

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

    请添加图片描述

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

  • 相关阅读:
    【愚公系列】2022年11月 微信小程序-优购电商项目-个人中心页面
    计算机毕业设计springboot+vue基本微信小程序的家装公司管理系统小程序
    mybatis执行器,缓存
    推荐一款实用的用户画像工具--快鲸scrm
    elementPlus的table设置序号
    Leaflet结合Echarts实现迁徙图
    OpenMP task construct 实现原理以及源码分析
    windows逆向的工具 (没有Android工具)
    转转前端周刊第八十一期
    Go语言开发环境安装,hello world!
  • 原文地址:https://blog.csdn.net/null18/article/details/133766867