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表示是否希望数据迭代器对象在每个迭代周期内打乱数据。

代码逻辑

  1. data.TensorDataset(*data_arrays):
    • TensorDataset 是 PyTorch 中的一个类,用于将多个张量封装成一个数据集。它会将输入的张量按索引对齐,形成一个数据集。例如,如果 data_arrays = (features, labels),那么 TensorDataset 会将每个 features[i]labels[i] 组合成一个样本。
  2. 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)优化算法的类

参数说明

  1. net.parameters():
    • 这是一个生成器,返回神经网络 net 中所有需要优化的参数(通常是权重和偏置)。这些参数的 requires_grad 属性必须设置为 True,以便在反向传播中计算梯度。
  2. 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])

posted @ 2025-06-17 19:23  小西贝の博客  阅读(17)  评论(0)    收藏  举报