PyTorch复现多维逻辑回归
【前言】
本专题为PyTorch专栏。从本专题开始,我将通过使用PyTorch编写基础神经网络,带领大家学习PyTorch。并顺便带领大家复习以下深度学习的知识。希望大家通过本专栏学习,更进一步了解人更智能这个领域。
数据集来源:百度网盘 请输入提取码,提取码:kif1
一、如何理解单维变多维
这是单维输入的计算过程:
一维输入X与一维参数W相乘后得到的输出也是以一个一维的矩阵。正如图上所示。
那么多维输入X矩阵就可以表示成由多个行向量X'堆叠而成的。如下图所示。
这部分是线性代数的内容,有遗忘的同学可以回归一下线性代数的内容。
二、单维变多维从代码上理解
self.linear = torch.nn.Linear(8, 1)
torch.nn.Linear()这个代码我们第一节课的时候就讲过。第一个参数指的是输入的维度,第二个参数指的是输出的维度。
上图所示内容是指,现在给一个8维的输入向量,最后要得到一个1维的输出向量
当然,这是只有一个线性层的代码形式。如果我们希望有多个线性层来使神经网路拟合的更好的话我们可以多加几个线性层,这时,这几个torch.nn.Linear()的参数也就发生了变化。
图中表示这个神网络有三个线性层。
第一层:输入一个8维的向量,输出一个6维的向量
第二层:输入一个6维的向量,输出一个4维的向量
第三层:输入一个4维的向量,输出一个1维的向量
三、用PyTorch实现多维逻辑回归
(1)导入模块、加载数据集
xy = np.loadtxt('diabetes.csv.gz', delimiter=',', dtype=np.float32)
-
使用
np.loadtxt
函数从diabetes.csv.gz
文件中加载数据。 -
delimiter=','
:指定字段之间的分隔符为逗号,适用于 CSV 文件。 -
dtype=np.float32
:指定数据类型为float32
,这在深度学习中很常见,因为 PyTorch 默认使用float32
类型进行计算。
x_data = torch.from_numpy(xy[:, :-1])
-
使用
torch.from_numpy
将 NumPy 数组转换为 PyTorch 张量。 -
xy[:, :-1]
:提取所有行,但只取到倒数第二列为止的列,这些列通常包含特征数据。
y_data = torch.from_numpy(xy[:, [-1]])
-
同样使用
torch.from_numpy
将 NumPy 数组转换为 PyTorch 张量。 -
xy[:, [-1]]
:提取所有行的最后一列,这一列通常包含标签数据。 -
注意:
[-1]
用方括号括起来,确保y_data
是二维张量,这对于某些 PyTorch 操作(如计算损失)是必要的。
我么们来看一下数据集的样子:
(2)设计模型
1.在这里你会发现,上述代码中所用的sigmoid函数是torch.nn.Sigmoid(),而上节课我们所用的是torch.nn.functional.Sigmoid()。接下来我们讲一下这二者的区别。
1.
model(x_data)
这是推荐的使用方式,也是最常见的方式。当你调用
model(x_data)
时,PyTorch 会自动调用模型的forward
方法来计算输出。工作原理
当你调用
model(x_data)
时,PyTorch 会调用模型的__call__
方法。
__call__
方法内部会调用forward
方法,并处理一些额外的逻辑,例如:
调用
forward
方法之前,会检查是否需要进行梯度跟踪(requires_grad
)。调用
forward
方法之后,会处理一些后处理逻辑,例如记录操作图。
2.
model.forward(x_data)
这种方式直接调用了模型的
forward
方法。虽然这种方式也可以工作,但它绕过了__call__
方法的额外逻辑,因此不推荐在正常情况下使用。工作原理
forward
方法是模型的核心部分,定义了输入数据如何通过模型的各个层。直接调用
forward
方法时,不会触发__call__
方法中的额外逻辑。
2.【self.activate=torch.nn.ReLU()】
图中这段代码表示引用一个激活函数ReLU,但本例中没有用到,如果你想用的话,你可以将代码中的Sigmoid()替换为ReLU()
(3)计算损失
(4)周期训练模式
【补充】
这段代码是为了为下一步描绘图像提供X轴数据、Y轴数据。
我们的图像描绘的是训练批次epoch(x轴)与损失值Loss(y轴)的关系
这是训练模型的运行结果:
(5)描绘图像
import matplotlib.pyplot as plt
导入这个包用来描绘图像
这是图像结果
-