3-3线性回归简洁实现
1.生成数据集
import numpy as np
import torch
from torch.utils import data
from d2l import torch as d2l
true_w = torch.tensor([2,-3.4])
true_b = 4.2
features, labels = d2l.synthetic_data(true_w, true_b, 1000)
2.读取数据集
我们可以调用框架中现有的API来读取数据。我们将features和labels作为API的参数传递,并通过数据迭代器指定batch_size。此外,布尔值is_train表示是否希望数据迭代器对象在每个迭代周期内打乱数据。
代码逻辑
data.TensorDataset(*data_arrays):TensorDataset是 PyTorch 中的一个类,用于将多个张量封装成一个数据集。它会将输入的张量按索引对齐,形成一个数据集。例如,如果data_arrays = (features, labels),那么TensorDataset会将每个features[i]和labels[i]组合成一个样本。
data.DataLoader(dataset, batch_size, shuffle=is_train):DataLoader是 PyTorch 中的一个类,用于创建一个可迭代的数据加载器。它可以从数据集中批量加载数据,并支持多线程加载、打乱数据等功能。dataset:输入的数据集(这里是TensorDataset)。batch_size:每个批次的大小。shuffle:是否打乱数据。如果is_train=True,则打乱数据;否则不打乱。
def load_array(data_arrays, batch_size, is_train=True):
'''构造一个pytorch数据迭代器'''
dataset = data.TensorDataset(*data_arrays)
return data.DataLoader(dataset, batch_size, shuffle=is_train)
batch_size = 10
data_iter = load_array((features, labels),batch_size)
next(iter(data_iter)) #从迭代器中获取第一项
[tensor([[-0.5796, 1.6132],
[-1.1829, 0.8217],
[-0.4605, 1.1009],
[ 0.3755, 0.6308],
[-0.5977, 0.9539],
[ 0.2596, 0.3201],
[ 0.9428, 0.7196],
[-0.3294, 0.3562],
[-0.1318, 0.1971],
[-0.1610, 1.3767]]),
tensor([[-2.4613],
[-0.9579],
[-0.4757],
[ 2.8286],
[-0.2393],
[ 3.6279],
[ 3.6488],
[ 2.3290],
[ 3.2765],
[-0.8094]])]
3.定义模型
# nn是神经网络的缩写
from torch import nn
net = nn.Sequential(nn.Linear(2,1))
4.初始化模型参数
在使用net之前,我们需要初始化模型参数。如在线性回归模型中的权重和偏置。深度学习框架通常有预定义的方法来初始化参数。在这里,我们指定每个权重参数应该从均值为0、标准差为0.01的正态分布中随机采样,偏置参数将初始化为零。
正如我们在构造nn.Linear时指定输入和输出尺寸一样,现在我们能直接访问参数以设定它们的初始值。我们通过net[0]选择网络中的第一个图层,然后使用weight.data和bias.data方法访问参数。我们还可以使用替换方法normal_和fill_来重写参数值。
net[0].weight.data.normal_(0,0.01)
net[0].bias.data.fill_(0)
tensor([0.])
5.定义损失函数
loss = nn.MSELoss()
6.定义优化算法
在 PyTorch 中,torch.optim.SGD 是一个用于实现随机梯度下降(Stochastic Gradient Descent, SGD)优化算法的类
参数说明
net.parameters():- 这是一个生成器,返回神经网络
net中所有需要优化的参数(通常是权重和偏置)。这些参数的requires_grad属性必须设置为True,以便在反向传播中计算梯度。
- 这是一个生成器,返回神经网络
lr=0.03:- 学习率(Learning Rate),是一个标量值,控制参数更新的步长。学习率越大,每次更新的步长越大。
代码逻辑
torch.optim.SGD是一个优化器类,它接受模型的参数和学习率作为输入,并创建一个优化器实例。- 优化器的作用是在训练过程中根据计算出的梯度更新模型的参数。
trainer = torch.optim.SGD(net.parameters(), lr=0.03)
7.训练
在每个迭代周期里,我们将完整遍历一次数据集(train_data),不停地从中获取一个小批量的输入和相应的标签。对于每一个小批量,我们会进行以下步骤:
-
通过调用net(X)生成预测并计算损失l(前向传播)
-
通过进行反向传播来计算梯度。
-
通过调用优化器来更新模型参数。
为了更好的衡量训练效果,我们计算每个迭代周期后的损失,并打印它来监控训练过程。
num_epochs = 3
for epoch in range(num_epochs):
for x,y in data_iter:
l = loss(net(x), y)
trainer.zero_grad()
l.backward()
trainer.step()
l = loss(net(features), labels)
print(f'epoch{epoch+1},loss{l:f}')
epoch1,loss0.000427
epoch2,loss0.000112
epoch3,loss0.000112
w = net[0].weight.data
print('w的估计误差:',true_w-w.reshape(true_w.shape))
b = net[0].bias.data
print('b的估计误差:', true_b-b)
w的估计误差: tensor([-0.0009, -0.0009])
b的估计误差: tensor([-4.1485e-05])

线性回归的简洁实现调用相关的库函数,实现步骤为:生成数据集、读取数据集、初始化模型参数、定义模型、定义损失函数、定义优化算法和训练等7步
浙公网安备 33010602011771号