多目标多线性回归模型是一种机器学习模型,它以单个或多个特征作为输入来做出多个预测。在我们之前的文章中,我们讨论了如何使用多线性回归进行简单预测并生成多个输出。在这里,我们将构建模型并在数据集上进行训练。
在本文中,我们将生成一个数据集,并定义我们的模型以及优化器和损失函数。然后,我们将训练我们的模型并可视化训练过程的结果。具体来说,我们将解释:
- 如何在 PyTorch 中训练多目标多线性回归模型。
- 如何生成一个简单的数据集并将其输入模型。
- 如何使用 PyTorch 中的内置包构建模型。
- 如何使用小批量梯度下降训练模型并可视化结果。
通过我的《用PyTorch进行深度学习》一书来启动你的项目。它提供了包含可用代码的自学教程。
让我们开始吧。

在 PyTorch 中训练多目标多线性回归模型。
图片来源:drown_in_city。部分权利保留。
概述
本教程分为四个部分;它们是:
- 创建数据类
- 使用
nn.Module
构建模型 - 使用小批量梯度下降进行训练
- 绘制进度
创建数据类
我们需要数据来训练我们的模型。在 PyTorch 中,我们可以利用 Dataset
类。首先,我们将创建我们的数据类,其中包括数据构造函数、返回数据样本的 __getitem__()
方法以及允许我们检查数据长度的 __len__()
方法。我们在构造函数中根据线性模型生成数据。请注意,torch.mm()
用于 **m**atrix **m**ultiplication,并且张量的形状应设置得允许乘法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import torch from torch . utils . data import Dataset , DataLoader torch.manual_seed(42) # 创建数据集类 class Data(Dataset): # 构造函数 def __init__(self): self . x = torch . zeros ( 40 , 2 ) self . x [ : , 0 ] = torch . arange ( - 2 , 2 , 0.1 ) self . x [ : , 1 ] = torch . arange ( - 2 , 2 , 0.1 ) w = torch . tensor ( [[ 1.0 , 2.0 ], [ 2.0 , 4.0 ]] ) b = 1 func = torch . mm ( self . x , w ) + b self . y = func + 0.2 * torch . randn (( self . x . shape [ 0 ], 1 )) self . len = self . x . shape [ 0 ] # Getter def __getitem__ ( self , idx ) : return self . x [ idx ] , self . y [ idx ] # 获取数据长度 def __len__(self): return self.len |
然后,我们可以创建将在训练中使用的数据集对象。
1 2 |
# 创建数据集对象 data_set = Data() |
想开始使用PyTorch进行深度学习吗?
立即参加我的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
使用 nn.Module
构建模型
PyTorch 的 nn.Module
包含了我们构建多线性回归模型所需的所有方法和属性。这个包将帮助我们在本系列未来的教程中构建更复杂的神经网络架构。
我们将使我们的模型类成为 nn.Module
包的子类,从而允许我们继承所有已包含的功能。我们的模型将包括一个构造函数和一个用于进行预测的 forward()
函数。
1 2 3 4 5 6 7 8 9 10 11 |
... # 创建自定义多重线性回归模型 class MultipleLinearRegression ( torch . nn . Module ) : # 构造函数 def __init__ ( self , input_dim , output_dim ) : super ( MultipleLinearRegression , self ) . __init__ ( ) self . linear = torch . nn . Linear ( input_dim , output_dim ) # 预测 def forward ( self , x ) : y_pred = self . linear ( x ) return y_pred |
由于我们需要处理多个输出,因此我们将创建一个具有两个输入和两个输出的模型对象。我们还将列出模型参数。
参数看起来是这样的,权重最初是随机化的。
1 2 3 4 |
... # 创建模型对象 MLR_model = MultipleLinearRegression ( 2 , 2 ) print ( "The parameters: " , list ( MLR_model . parameters ( ) ) ) |
输出看起来是这样的。
1 2 3 4 |
参数: [Parameter 包含 tensor([[ 0.2236, -0.0123], [ 0.5534, -0.5024]], requires_grad=True), Parameter 包含 tensor([ 0.0445, -0.4826], requires_grad=True)] |
我们将使用随机梯度下降来训练模型,学习率保持在 0.1。为了衡量模型损失,我们将使用均方误差。
1 2 3 4 |
# 定义模型优化器 optimizer = torch . optim . SGD ( MLR_model . parameters ( ) , lr = 0.1 ) # 定义损失函数 criterion = torch . nn . MSELoss ( ) |
PyTorch 有一个 DataLoader
类,它允许我们将数据输入模型。这不仅可以加载数据,还可以在实时应用各种转换。在开始训练之前,让我们定义我们的 dataloader 对象并定义批量大小。
1 2 |
# 创建数据加载器 train_loader = DataLoader ( dataset = data_set , batch_size = 2 ) |
通过我的《用PyTorch进行深度学习》一书来启动你的项目。它提供了包含可用代码的自学教程。
使用小批量梯度下降进行训练
一切就绪后,我们可以创建训练循环来训练模型。我们创建一个空列表来存储模型损失,并训练模型 20 个 epoch。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 训练模型 losses = [ ] epochs = 20 for epoch in range ( epochs ) : for x , y in train_loader : y_pred = MLR_model ( x ) loss = criterion ( y_pred , y ) losses . append ( loss . item ( ) ) optimizer.zero_grad() loss.backward() optimizer . step ( ) print(f"epoch = {epoch}, loss = {loss}") print ( "Done training!" ) |
如果运行此代码,您应该会看到类似以下的输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
epoch = 0 , loss = 0.052659016102552414 epoch = 1 , loss = 0.13005244731903076 epoch = 2 , loss = 0.13508380949497223 epoch = 3 , loss = 0.1353638768196106 epoch = 4 , loss = 0.13537931442260742 epoch = 5 , loss = 0.13537974655628204 epoch = 6 , loss = 0.13537967205047607 epoch = 7 , loss = 0.13538001477718353 epoch = 8 , loss = 0.13537967205047607 epoch = 9 , loss = 0.13537967205047607 epoch = 10 , loss = 0.13538001477718353 epoch = 11 , loss = 0.13537967205047607 epoch = 12 , loss = 0.13537967205047607 epoch = 13 , loss = 0.13538001477718353 epoch = 14 , loss = 0.13537967205047607 epoch = 15 , loss = 0.13537967205047607 epoch = 16 , loss = 0.13538001477718353 epoch = 17 , loss = 0.13537967205047607 epoch = 18 , loss = 0.13537967205047607 epoch = 19 , loss = 0.13538001477718353 Done training ! |
绘制进度
由于这是一个线性回归模型,因此训练应该很快。我们可以可视化模型损失在训练过程中每个 epoch 后的下降情况。
1 2 3 4 5 6 |
import matplotlib.pyplot as plt plt . plot ( losses ) plt.xlabel("迭代次数") plt.ylabel("总损失") plt.show() |
将所有内容放在一起,完整的代码如下。
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 |
import matplotlib.pyplot as plt import torch from torch . utils . data import Dataset , DataLoader torch.manual_seed(42) # 创建数据集类 class Data(Dataset): # 构造函数 def __init__(self): self . x = torch . zeros ( 40 , 2 ) self . x [ : , 0 ] = torch . arange ( - 2 , 2 , 0.1 ) self . x [ : , 1 ] = torch . arange ( - 2 , 2 , 0.1 ) w = torch . tensor ( [[ 1.0 , 2.0 ], [ 2.0 , 4.0 ]] ) b = 1 func = torch . mm ( self . x , w ) + b self . y = func + 0.2 * torch . randn (( self . x . shape [ 0 ], 1 )) self . len = self . x . shape [ 0 ] # Getter def __getitem__ ( self , idx ) : return self . x [ idx ] , self . y [ idx ] # 获取数据长度 def __len__(self): return self.len # 创建数据集对象 data_set = Data() # 创建自定义多重线性回归模型 class MultipleLinearRegression ( torch . nn . Module ) : # 构造函数 def __init__ ( self , input_dim , output_dim ) : super ( MultipleLinearRegression , self ) . __init__ ( ) self . linear = torch . nn . Linear ( input_dim , output_dim ) # 预测 def forward ( self , x ) : y_pred = self . linear ( x ) return y_pred # 创建模型对象 MLR_model = MultipleLinearRegression ( 2 , 2 ) print ( "The parameters: " , list ( MLR_model . parameters ( ) ) ) # 定义模型优化器 optimizer = torch . optim . SGD ( MLR_model . parameters ( ) , lr = 0.1 ) # 定义损失函数 criterion = torch . nn . MSELoss ( ) # 创建数据加载器 train_loader = DataLoader ( dataset = data_set , batch_size = 2 ) # 训练模型 losses = [ ] epochs = 20 for epoch in range ( epochs ) : for x , y in train_loader : y_pred = MLR_model ( x ) loss = criterion ( y_pred , y ) losses . append ( loss . item ( ) ) optimizer.zero_grad() loss.backward() optimizer . step ( ) print(f"epoch = {epoch}, loss = {loss}") print ( "Done training!" ) # 绘制损失 plt . plot ( losses ) plt.xlabel("迭代次数") plt.ylabel("总损失") plt.show() |
总结
在本教程中,您学习了在 PyTorch 中训练多目标多线性回归模型所需的步骤。具体来说,您学到了:
- 如何在 PyTorch 中训练多目标多线性回归模型。
- 如何生成一个简单的数据集并将其输入模型。
- 如何使用 PyTorch 中的内置包构建模型。
- 如何使用小批量梯度下降训练模型并可视化结果。
暂无评论。