d2l 线性回归的从零开始实现

本文详细介绍了如何从头开始构建线性回归模型,包括数据集生成、批量处理、参数初始化、模型定义、损失函数计算、使用小批量随机梯度下降进行训练,以及训练过程中的参数评估。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线性回归的从零开始实现

  • 导入需要使用的包
  • 数据流水线、模型、损失函数、小批量随机梯度下降器

1. 构造人造数据集

  • y=xw+b+c
  • feature,label=synthetic_data(w,b,num)
  • detach().numpy()有些版本tensor需要线detach出来才能转换为numpy

2. data_iter每次读取一个小批量

  • data_iter(batch_size,features,labels)
  • num
  • 打乱下标索引 随机顺序访问样本
  • 每次跳batch_size的大小,如果超出取最后一个
  • yeid每次返回一个x,y

3. 定义 初始化模型参数

  • w正态分布,resuires_gard=True
  • b

4. 定义模型

  • linreg(x,w,b)
  • 线性回归模型
  • return torch.matual(x,w)+b

5. 定义损失函数

def squared_loss(y_hat,y)
    return (y_hat-y.reshape(y_hat.shape))**2/2

6. 定义优化算法

def sgd(params,lr,batch_size)
    with torch.no_grad():
        for param in params:
            param-=lr*param.grad/batch_size
            param.grad.zero_()

7. 训练过程

lr=0.03 # 调整超参数对结果产生的影响
num_epochs=3
net=lireg
loss=squared_loss

for epoch in range(num_epoch)
    for x,y in data_iter(batch_size,features,labels):
        l=loss(net(x,w,b),y) # l (batch_size,1)
        l.sum().backward()
        sgd([w,b],lr,batch_size)
    with torch.no_gard():
        train_l=loss(net(features,w,b),labels)
        printf(f'epoch{epoch+1},loss{float(train_l.mean()):f}')

  • 比较真实参数和通过训练学到的参数来评估训练的成功成功程度
使用PyTorch库和D2L(深度学习框架)实现线性回归的一个简单例子会涉及以下几个步骤: 1. **导入所需库**: ```python import torch import d2l ``` 2. **创建张量数据**: ```python # 创建随机模拟的数据 n_train, n_features = 100, 1 # 假设我们有一个特征 true_w, true_b = torch.tensor([[2.0]], requires_grad=True), torch.tensor([1.0], requires_grad=True) X = torch.rand(n_train, n_features) * 2 - 1 y = X @ true_w + true_b + torch.randn(n_train) * 0.01 ``` 这里,`@`操作代表矩阵乘法,生成了输入特征和真实权重的线性组合加上一些噪声作为实际标签。 3. **定义模型和损失函数**: ```python model = torch.nn.Linear(n_features, 1) # 线性层,对应于线性回归模型 loss = torch.nn.MSELoss() # 均方误差损失 ``` 4. **训练模型**: ```python learning_rate = 0.001 num_epochs = 1000 for epoch in range(num_epochs): l = loss(model(X).squeeze(), y) l.backward() with torch.no_grad(): model.weight -= learning_rate * model.weight.grad model.bias -= learning_rate * model.bias.grad model.zero_grad() ``` 这里,通过反向传播更新模型的权重和偏置。 5. **模型评估和预测**: ```python # 使用测试数据(假设有的话)评估模型 test_X, test_y = ... # 用类似的方式创建测试数据 test_l = loss(model(test_X).squeeze(), test_y) print('After training:') print(f'True parameters: w={true_w.item():.3f}, b={true_b.item():.3f}') print(f'Learned parameters: w={model.weight.item():.3f}, b={model.bias.item():.3f}') print(f'Test loss: {test_l.item():.3f}') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值