本节介绍如何通过使用深度学习框架来简洁地实现线性回归模型。
生成数据集
与 :numref:sec_linear_scratch
中类似,我们首先[生成数据集]。
先构造真实的w和b,再通过人工数据合成的函数synthetic_data生成features和labels
读取数据集
我们可以[调用框架中现有的API来读取数据]。
我们将features
和labels
作为API的参数传递,并通过数据迭代器指定batch_size
。
布尔值is_train
表示是否希望数据迭代器对象在每个迭代周期内打乱数据。
DataLoader从指定的数据集中读取数据,将数据集划分为多个小批次(batch),每个批次包含固定数量的样本。这样可以在训练过程中,每次只处理一小部分数据,提高训练效率。在每个训练周期(epoch)开始时,DataLoader会对数据集进行随机打乱,以确保模型不会记住数据集的顺序,从而提高模型的泛化能力。
为了验证是否正常工作,让我们读取并打印第一个小批量样本。我们使用iter
构造Python迭代器,使用next
从迭代器中获取第一项。
定义模型
对于标准深度学习模型,我们可以使用框架的预定义好的层。这使我们只需关注使用哪些层来构造模型,而不必关注层的实现细节。
我们首先定义一个模型变量net
,它是一个Sequential
类的实例。
Sequential
类将多个层串联在一起。当给定输入数据时,Sequential
实例将数据传入到第一层, 然后将第一层的输出作为第二层的输入,以此类推。
线性回归就是一个简单的单层的神经网络,因此实际上不需要Sequential
。 但是由于以后几乎所有的模型都是多层的,在这里使用Sequential
会让你熟悉“标准的流水线”。回顾单层网络架构, 这一单层被称为全连接层(fully-connected layer), 因为它的每一个输入都通过矩阵-向量乘法得到它的每个输出。在PyTorch中,全连接层在Linear
类中定义。
将两个参数传递到nn.Linear
中:
第一个指定输入特征形状,即2,第二个指定输出特征形状,输出特征形状为单个标量,因此为1。
初始化模型参数
在使用net
之前,我们需要初始化模型参数。如在线性回归模型中的权重和偏置。深度学习框架通常有预定义的方法来初始化参数。在这里,我们指定每个权重参数应该从均值为0、标准差为0.01的正态分布中随机采样,偏置参数将初始化为零。
正如我们在构造nn.Linear
时指定输入和输出尺寸一样, 现在我们能直接访问参数以设定它们的初始值。
我们通过net[0]
选择网络中的第一个图层, 然后使用weight.data
和bias.data
方法分别访问参数w和b。使用替换方法normal_
和fill_
来重写参数值。
normal_(0,0.01)使用正态分布替换w的值,均值为0,方差为0.01。
fill_(0)
将偏差b设置为0。
定义损失函数
计算均方误差使用的是MSELoss
类,也称为平方𝐿2范数。
默认情况下,它返回所有样本损失的平均值。
定义优化算法
小批量随机梯度下降算法是一种优化神经网络的标准工具,PyTorch在optim
模块中实现了该算法的许多变种。
当我们实例化一个SGD
实例时,我们要指定优化的参数(使用net.parameters()
从模型中获得,net.parameters()包含所有的参数,即包含w和b
)以及优化算法所需的超参数字典(小批量随机梯度下降只需要设置学习率lr
值,这里设置为0.03)
训练
通过深度学习框架的高级API来实现我们的模型只需要相对较少的代码。 我们不必单独分配参数、不必定义我们的损失函数,也不必手动实现小批量随机梯度下降。
当我们需要更复杂的模型时,高级API的优势将大大增加。 当我们有了所有的基本组件,训练过程代码与我们从零开始实现时所做的非常相似。
回顾一下:在每个迭代周期里,我们将完整遍历一次数据集(train_data
),不停地从中获取一个小批量的输入和相应的标签。对于每一个小批量,我们会进行以下步骤:
- 通过调用
net(X)
生成预测并计算损失l
(前向传播)。 - 通过进行反向传播来计算梯度。
- 通过调用优化器来更新模型参数。
为了更好的衡量训练效果,我们计算每个迭代周期后的损失,并打印它来监控训练过程。
trainer是优化器,zero_grad()将梯度清零。
backward()函数负责执行反向传播算法以计算模型参数的梯度。
trainer.step()函数更新模型的参数。
最后计算损失loss。
下面我们比较生成数据集的真实参数和通过有限数据训练获得的模型参数。 要访问参数,我们首先从net
访问所需的层,然后读取该层的权重和偏置。 正如在从零开始实现中一样,我们估计得到的参数与生成数据的真实参数非常接近。
小结
- 我们可以使用PyTorch的高级API更简洁地实现模型。
- 在PyTorch中,
data
模块提供了数据处理工具,nn
模块定义了大量的神经网络层和常见损失函数。 - 我们可以通过
_
结尾的方法将参数替换,从而初始化参数。