线性回归是一种统计技术,用于估计两个变量之间的关系。线性回归的一个简单例子是根据一个人体重的平方根来预测身高(这正是 BMI 的基础)。为此,我们需要找到直线的斜率和截距。斜率是一个变量随另一个变量变化一个单位而变化的量。截距是我们的直线与 y 轴相交的位置。
让我们以简单的线性方程 $y=wx+b$ 为例。输出变量是 $y$,而输入变量是 $x$。方程的斜率和 y 截距由字母 $w$ 和 $b$ 表示,因此它们被称为方程的参数。知道这些参数可以让你预测任何给定 $x$ 值的输出 $y$。
现在您已经了解了简单线性回归的一些基础知识,让我们尝试在 PyTorch 框架中实现这个有用的算法。在这里,我们将重点关注以下几点:
- 什么是线性回归以及如何在 PyTorch 中实现它。
- 如何在 PyTorch 中导入线性类并使用它进行预测。
- 我们如何为线性回归问题或未来更复杂的模型构建自定义模块。
通过我的《用PyTorch进行深度学习》一书来启动你的项目。它提供了包含可用代码的自学教程。
那么,让我们开始吧。

在 PyTorch 中进行线性预测。
图片来源:Daryan Shamkhali。保留部分权利。
概述
本教程分为三个部分;它们是
- 准备张量
- 使用 PyTorch 的线性类
- 构建自定义线性类
准备张量
请注意,在本教程中,我们将介绍只有两个参数的一维线性回归。我们将创建以下线性表达式:
$$y=3x+1$$
我们将在 PyTorch 中将参数 $w$ 和 $b$ 定义为张量。我们将 `requires_grad` 参数设置为 `True`,表示我们的模型必须学习这些参数。
1 2 3 4 5 |
import torch # 定义参数 'w' 和 'b' w = torch.tensor(3.0, requires_grad = True) b = torch.tensor(1.0, requires_grad = True) |
在 PyTorch 中,预测步骤称为前向步骤。因此,我们将编写一个函数,允许我们在任何给定 $x$ 值下对 $y$ 进行预测。
1 2 3 4 |
# 用于进行预测的线性方程函数 def forward(x): y_pred = w * x + b return y_pred |
现在我们已经定义了线性回归函数,让我们在 $x=2$ 处进行预测。
1 2 3 4 |
# 让我们在 x = 2 处预测 y_pred x = torch.tensor([[2.0]]) y_pred = forward(x) print("当 'x = 2' 时 y 的预测值是: ", y_pred) |
输出如下:
1 |
当 'x = 2' 时 y 的预测值是: tensor([[7.]], grad_fn=<AddBackward0>) |
我们还用多个 $x$ 输入来评估方程。
1 2 3 4 |
# 对多个 x 值进行预测 x = torch.tensor([[3.0], [4.0]]) y_pred = forward(x) print("当 'x = 3 & 4' 时 y 的预测值是: ", y_pred) |
输出如下:
1 2 |
当 'x = 3 & 4' 时 y 的 预测值 是: tensor([[10.], [13.]], grad_fn=<AddBackward0>) |
如您所见,线性方程函数成功预测了多个 $x$ 值的输出。
总而言之,这是完整的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import torch # 定义参数 'w' 和 'b' w = torch.tensor(3.0, requires_grad = True) b = torch.tensor(1.0, requires_grad = True) # 用于进行预测的线性方程函数 def forward(x): y_pred = w * x + b return y_pred # 让我们在 x = 2 处预测 y_pred x = torch.tensor([[2.0]]) y_pred = forward(x) print("当 'x = 2' 时 y 的预测值是: ", y_pred) # 对多个 x 值进行预测 x = torch.tensor([[3.0], [4.0]]) y_pred = forward(x) print("当 'x = 3 & 4' 时 y 的预测值是: ", y_pred) |
想开始使用PyTorch进行深度学习吗?
立即参加我的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
使用 PyTorch 的线性类
为了解决实际问题,您需要构建更复杂的模型,为此,PyTorch 提供了许多有用的包,包括允许我们进行预测的线性类。以下是如何从 PyTorch 导入线性类模块。我们还将随机初始化参数。
1 2 |
from torch.nn import Linear torch.manual_seed(42) |
请注意,之前我们定义了 $w$ 和 $b$ 的值,但在实践中,它们在机器学习算法开始之前是随机初始化的。
让我们创建一个线性对象模型,并使用 `parameters()` 方法访问模型的参数 ($w$ 和 $b$)。`Linear` 类使用以下参数初始化:
in_features
:反映每个输入样本的大小out_features
:反映每个输出样本的大小
1 2 3 |
linear_regression = Linear(in_features=1, out_features=1) print("显示参数 w 和 b: ", list(linear_regression.parameters())) |
输出如下:
1 2 3 |
显示参数 w 和 b: [Parameter containing tensor([[0.5153]], requires_grad=True), Parameter containing tensor([-0.4414], requires_grad=True)] |
同样,您可以使用 `state_dict()` 方法获取包含参数的字典。
1 2 3 |
print("获取 Python 字典: ",linear_regression.state_dict()) print("字典键: ",linear_regression.state_dict().keys()) print("字典值: ",linear_regression.state_dict().values()) |
输出如下:
1 2 3 |
获取 Python 字典: OrderedDict([('weight', tensor([[0.5153]])), ('bias', tensor([-0.4414]))]) 字典 键: odict_keys(['weight', 'bias']) 字典 值: odict_values([tensor([[0.5153]]), tensor([-0.4414])]) |
现在我们可以重复我们之前所做的。让我们使用单个 $x$ 值进行预测。
1 2 3 4 |
# 在 x = 2 处进行预测 x = torch.tensor([[2.0]]) y_pred = linear_regression(x) print("获取 x 的预测值: ", y_pred) |
这得到
1 |
获取 x 的 预测值: tensor([[0.5891]], grad_fn=<AddmmBackward0>) |
这对应于 $0.5153 \times 2 - 0.4414 = 0.5891$。类似地,我们将对多个 $x$ 值进行预测。
1 2 3 4 |
# 对多个 x 值进行预测 x = torch.tensor([[3.0], [4.0]]) y_pred = linear_regression(x) print("当 'x = 3 & 4' 时 y 的预测值是: ", y_pred) |
输出如下:
1 2 |
当 'x = 3 & 4' 时 y 的 预测值 是: tensor([[1.1044], [1.6197]], grad_fn=<AddmmBackward0>) |
将所有内容放在一起,完整的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import torch from torch.nn import Linear torch.manual_seed(1) linear_regression = Linear(in_features=1, out_features=1) print("显示参数 w 和 b: ", list(linear_regression.parameters())) print("获取 Python 字典: ",linear_regression.state_dict()) print("字典键: ",linear_regression.state_dict().keys()) print("字典值: ",linear_regression.state_dict().values()) # 在 x = 2 处进行预测 x = torch.tensor([[2.0]]) y_pred = linear_regression(x) print("获取 x 的预测值: ", y_pred) # 对多个 x 值进行预测 x = torch.tensor([[3.0], [4.0]]) y_pred = linear_regression(x) print("当 'x = 3 & 4' 时 y 的预测值是: ", y_pred) |
构建自定义线性类
PyTorch 提供了构建自定义线性类的可能性。对于后续的教程,我们将使用这种方法来构建更复杂的模型。让我们首先从 PyTorch 导入 `nn` 模块,以构建自定义线性类。
1 |
from torch import nn |
PyTorch 中的自定义模块是派生自 `nn.Module` 的类。我们将为简单的线性回归构建一个类,并将其命名为 `Linear_Regression`。这应该使其成为 `nn.Module` 的子类。因此,所有方法和属性都将继承到此中。在对象构造函数中,我们将声明输入和输出参数。此外,我们创建一个超构造函数,从 `nn.Module` 调用线性类。最后,为了从输入样本生成预测,我们将在类中定义一个前向函数。
1 2 3 4 5 6 7 8 9 10 |
class Linear_Regression(nn.Module): def __init__(self, input_sample, output_sample): # 继承父类的属性 super(Linear_Regression, self).__init__() self.linear = nn.Linear(input_sample, output_sample) # 定义预测函数 def forward(self, x): output = self.linear(x) return output |
现在,让我们创建一个简单的线性回归模型。在这种情况下,它将仅仅是一个直线方程。为了进行健全性检查,我们还将打印出模型参数。
1 2 |
model = Linear_Regression(input_sample=1, output_sample=1) print("打印模型参数: ", list(model.parameters())) |
输出如下:
1 2 3 |
打印 模型 参数: [Parameter containing: tensor([[-0.1939]], requires_grad=True), Parameter containing: tensor([0.4694], requires_grad=True)] |
正如我们在本教程的早期部分所做的那样,我们将评估我们的自定义线性回归模型,并尝试预测 $x$ 的单个和多个输入值。
1 2 3 |
x = torch.tensor([[2.0]]) y_pred = model(x) print("获取 x 的预测值: ", y_pred) |
输出如下:
1 |
获取 x 的 预测值: tensor([[0.0816]], grad_fn=<AddmmBackward0>) |
这对应于 $-0.1939 \times 2 + 0.4694 = 0.0816$。如您所见,我们的模型能够预测结果,并且结果是一个张量对象。同样,让我们尝试获取多个 $x$ 值的预测。
1 2 3 |
x = torch.tensor([[3.0], [4.0]]) y_pred = model(x) print("当 'x = 3 & 4' 时 y 的预测值是: ", y_pred) |
输出如下:
1 2 |
当 'x = 3 & 4' 时 y 的 预测值 是: tensor([[-0.1122], [-0.3061]], grad_fn=<AddmmBackward0>) |
因此,该模型对于多个 $x$ 值也表现良好。
把所有东西放在一起,下面是完整的代码。
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 |
import torch from torch import nn torch.manual_seed(42) class Linear_Regression(nn.Module): def __init__(self, input_sample, output_sample): # 继承父类的属性 super(Linear_Regression, self).__init__() self.linear = nn.Linear(input_sample, output_sample) # 定义预测函数 def forward(self, x): output = self.linear(x) return output model = Linear_Regression(input_sample=1, output_sample=1) print("打印模型参数: ", list(model.parameters())) x = torch.tensor([[2.0]]) y_pred = model(x) print("获取 x 的预测值: ", y_pred) x = torch.tensor([[3.0], [4.0]]) y_pred = model(x) print("当 'x = 3 & 4' 时 y 的预测值是: ", y_pred) |
总结
在本教程中,我们讨论了如何从头开始构建神经网络,从简单的线性回归模型开始。我们探索了在 PyTorch 中实现简单线性回归的多种方法。特别是,我们学习了
- 什么是线性回归以及如何在 PyTorch 中实现它。
- 如何在 PyTorch 中导入线性类并使用它进行预测。
- 我们如何为线性回归问题或未来更复杂的模型构建自定义模块。
暂无评论。