PyTorch多维特征输入

多维特征输入(刘二大人PyTorch第七讲)

之前的输入是一维的实数,这一讲讲解了当输入为多个维度时,预测对应的分类。讨论了线性变换的原理,模型的泛化问题。

  1. 加载数据集
  • 数据集分析:diabetes.csv,该数据集包含768条数据,每条数据8个维度的特征,类别为两个类别。数据集的第一行为表头。

加载数据集:

try:
    xy = np.loadtxt('./dataset/diabetes.csv', delimiter=',', dtype=np.float32, skiprows=1)
    x_data = torch.from_numpy(xy[:, :-1])   # 把提取出来的numpy数组转换为PyTorch张量
    y_data = torch.from_numpy(xy[:, [-1]])
    print("特征数据形状:", x_data.shape)
    print("标签数据形状:", y_data.shape)
except FileExistsError:
    print("文件未找到,检查文件路径")
except ValueError:
    print("数据格式错误,检查CSV文件")

说明:使用矩阵的方式读取,再转换为张量运算(利用CPU和GPU的并行计算能力提高运算速度)。

  1. 模型设计
    我们的目的是根据输入的8个特征判断是否是糖尿病患者,是二分类问题。设计的模型是三层的线性变换层。

模型代码:

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

线性变换层:线性变换层是要把输入数据x从N维空间映射到M维空间,矩阵就是N维空间到M维空间的线性变换。所以,矩阵就是空间变换的函数。但是我们经常要做的线性变换不一定是线性的,可能是一些非常复杂的非线性,所以用多个线性变换层、通过找到最优的权重,把它们组合起来,模拟出非线性的变换。神经网络,本质上是寻找一种非线性的空间变换函数,这个空间变换函数能将数据根据类别分离开。

  1. 构造损失和优化器
criterion = torch.nn.BCELoss(size_average=True)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
image.png
  1. 模型训练
    训练的本质,是根据神经网络的多次迭代,计算每个特征对分类的重要程度,赋予其相应的权重(矩阵)。得到权重矩阵参数,用于预测新的数据。
    训练的过程:前馈(计算损失),反馈(损失反向传播和梯度更新)
for epoch in range(100):
    optimizer.zero_grad()
    # 前馈(计算预测值和loss)
    y_pred = model(x_data)
    loss = criterion(y_pred,y_data)
    print(epoch, loss.item())
    # 反馈
    loss.backward()  # 损失反向传播
    # 更新
    optimizer.step() 

整体代码:

# !usr/bin/env python
# -*- conding:utf-8 -*-
# author: WangLijuan time:2025/1/23
# content: 刘二大人第七讲(处理多维特征的输入。输入为多维特征的二分类)


import numpy as np
import torch

# 1. 准备数据集
try:
    xy = np.loadtxt('./dataset/diabetes.csv', delimiter=',', dtype=np.float32, skiprows=1)
    x_data = torch.from_numpy(xy[:, :-1])   # 把提取出来的numpy数组转换为PyTorch张量
    y_data = torch.from_numpy(xy[:, [-1]])
    print("特征数据形状:", x_data.shape)
    print("标签数据形状:", y_data.shape)
except FileExistsError:
    print("文件未找到,检查文件路径")
except ValueError:
    print("数据格式错误,检查CSV文件")

# 2. 设计模型
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.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()

# 3. 损失和优化器
criterion = torch.nn.BCELoss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(),lr=0.01)

# 训练
for epoch in range(100):
    optimizer.zero_grad()
    # 前馈(计算预测值和loss)
    y_pred = model(x_data)
    loss = criterion(y_pred,y_data)
    print(epoch, loss.item())
    # 反馈
    loss.backward()  # 损失反向传播
    # 更新
    optimizer.step()  
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前面介绍了深度神经网络和卷积神经网络,这些神经网络有个特点:输入的向量越大,训练得到的模型越大。但是,拥有大量参数...
    金字塔下的小蜗牛阅读 3,108评论 2 7
  • 主要内容 自然语言输入编码 前馈网络 卷积网络 循环网络(recurrent networks ) 递归网络(re...
    JackHorse阅读 4,324评论 0 2
  • 原文传送门:核函数与支持向量机入门 理解支持向量机(Support Vector Machine, SVM)的角度...
    willheng阅读 2,110评论 0 1
  • 特征提取是计算机视觉和图像处理中的一个概念。它指的是使用计算机提取图像信息,决定每个图像的点是否属于一个图像特征。...
    mogu酱阅读 2,122评论 1 11
  • 特征提取是计算机视觉和图像处理中的一个概念。它指的是使用计算机提取图像信息,决定每个图像的点是否属于一个图像特征。...
    ChrisJO阅读 2,496评论 1 10