多维特征输入(刘二大人PyTorch第七讲)
之前的输入是一维的实数,这一讲讲解了当输入为多个维度时,预测对应的分类。讨论了线性变换的原理,模型的泛化问题。
- 加载数据集
- 数据集分析: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的并行计算能力提高运算速度)。
- 模型设计
我们的目的是根据输入的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()
线性变换层:线性变换层是要把输入数据从N维空间映射到M维空间,矩阵就是N维空间到M维空间的线性变换。所以,矩阵就是空间变换的函数。但是我们经常要做的线性变换不一定是线性的,可能是一些非常复杂的非线性,所以用多个线性变换层、通过找到最优的权重,把它们组合起来,模拟出非线性的变换。神经网络,本质上是寻找一种非线性的空间变换函数,这个空间变换函数能将数据根据类别分离开。
- 构造损失和优化器
criterion = torch.nn.BCELoss(size_average=True)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
image.png
- 模型训练
训练的本质,是根据神经网络的多次迭代,计算每个特征对分类的重要程度,赋予其相应的权重(矩阵)。得到权重矩阵参数,用于预测新的数据。
训练的过程:前馈(计算损失),反馈(损失反向传播和梯度更新)
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()