【李沐】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_w,其中 [2, -3.4] 表示两个特征的权重值
true_b = 4.2  # 定义真实偏差 true_b,表示模型的截距项

# 调用 synthetic_data 函数生成合成数据集,传入真实权重 true_w、偏差 true_b 和样本数量 1000
# 这将返回特征矩阵 features 和目标值 labels,用于训练和测试模型
features, labels = d2l.synthetic_data(true_w, true_b, 1000)

2、读取数据集

def load_array(data_arrays, batch_size, is_train=True):  # 定义函数 load_array,接受数据数组、批量大小和是否训练标志 is_train 作为参数
    """构造一个 PyTorch 数据迭代器"""
    
    dataset = data.TensorDataset(*data_arrays)  # 创建一个 PyTorch 数据集,使用给定的数据数组
    
    # 使用 data.DataLoader 构造数据迭代器,传入数据集、批量大小和是否训练标志
    # 当 is_train 为 True 时,数据会被随机打乱,用于训练;否则,数据不会被打乱,用于测试或验证
    return data.DataLoader(dataset, batch_size, shuffle=is_train)
batch_size = 10
data_iter = load_array((features, labels), batch_size)
batch_size = 10
data_iter = load_array((features, labels), batch_size)

3、定义模型
线性层输入2,输出1

# nn是神经⽹络的缩写
from torch import nn
net = nn.Sequential(nn.Linear(2, 1))

4、初始化模型
通过net[0]选择⽹络中的第⼀个图层,然后使⽤weight.data和bias.data⽅法访问参数。我们还可以使⽤替换⽅法normal_和fill_来重写参数值。
0,0.0.01的意思是均值为0、标准差为0.01的正态分布中随机采样

net[0].weight.data.normal_(0, 0.01)
net[0].bias.data.fill_(0)

5、定义损失函数
均方误差,L2范数

loss = nn.MSELoss()

6、定义优化函数
net.parameters() 返回神经网络模型中需要被优化的参数列表

trainer = torch.optim.SGD(net.parameters(), lr=0.03)

7、训练
主要是注意里面的写法,看到的别的代码知道啥意思就可以

num_epochs = 3  # 定义训练轮次数量为 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}')  # 打印当前训练轮次和损失值

你可能感兴趣的:(李沐深度学习笔记,线性回归,算法,回归)