李沐深度学习-线性回归从零开始

本文详细介绍了如何使用PyTorch库中的Tensor和autograd功能实现线性回归模型,包括数据预处理、模型定义、损失函数选择(如均方误差)、优化算法(如SGD)以及小批量反向传播的过程。作者通过实例展示了如何训练模型并更新参数梯度。
摘要由CSDN通过智能技术生成
# 核心Tensor,autograd
import torch
from IPython import display
import numpy as np
import random
from matplotlib import pyplot as plt

import sys

sys.path.append('路径')
from d2lzh_pytorch import *

'''
backward()函数:一次小批量执行完在进行反向传播
线性回归模型步骤;
    1.数据处理
    2.模型定义:根据矩阵形式运算,模型可以一次计算多个样本,比如X:1000x2, w:2x1  则模型可以一次计算1000个样本
    3.损失函数:
    4.优化算法:sgd则是小批量中每个样本loss运行完后,对应参数的梯度进行了累加,得到一个小批量的代表梯度 w1,w2,b
            然后将每个小批量的参数梯度进行梯度下降
    5.模型预测
'''
# ------------------------------------------------------------------------
# 生成数据集
'''
样本X=1000,特征=2,w=2,-3.4;b=4.2   随机噪声ξ     y=Xw+b+ξ
噪声服从均值为0,标准差为0.01的正态分布  噪声代表了数据集中无意义的干扰
'''
num_inputs = 2  # 特征数
num_examples = 1000  # 样本数量
true_w = [2, -3.4]  # w
true_b = 4.3  # b
# 生成所有包含特征  1000x2的样本 向量
features = torch.randn(num_examples, num_inputs, dtype=torch.float32)
# 下列运算属于矢量运算  预测y 表达式  是个向量,1000x1
labels = true_w[0] * features[:, 0] + true_w[1] * features[:, 1] + true_b
# 添加符合正态分布的噪声
labels += torch.tensor(np.random.normal(0, 0.01, size=labels.size()), dtype=torch.float32)

# set_figsize()
# plt.scatter(features[:, 1].numpy(), labels.numpy(), 1)
# plt.savefig('/home/eilab2023/yml/project/limu/picture/picture.png')

# 读取数据集

# ---------------------------------------------------------------------------------------------

# ---------------------------------------------------------------------------------------------
# 定义模型

# ---------------------------------------------------------------------------------------------

# 损失函数
# ---------------------------------------------------------------------------------------------

# 优化算法
# ---------------------------------------------------------------------------------------------

# 模型训练
# ---------------------------------------------------------------------------------------------
lr = 0.03
num_epoch = 3
net = linreg
loss = squared_loss
'''
每次返回一个batch-size大小随机样本的特征和标签
'''
batch_size = 10
# 初始化模型参数 w b  都是列矩阵  上面的是确定的公式,x,w,b都是确定的,label确定。这里的参数是初始化模拟的
# 一般是,X确定,label确定,然后初始化w,b,在模型训练寻找最优解,这里提前确定是为了方便
w = torch.tensor((np.random.normal(0, 0.01, (num_inputs, 1))), dtype=torch.float32)
b = torch.tensor(1, dtype=torch.float32)
w.requires_grad_(requires_grad=True)
b.requires_grad_(requires_grad=True)
# 外部定义了变量w后若在方法内有改变w,则该变量值会随着改变

for epoch in range(num_epoch):
    for X, y in data_iter(batch_size, features, labels):
        l = loss(net(X, w, b), y).sum()  # 小批量的损失计算完
        l.backward()  # 计算小批量的样本参数梯度,这里每个样本的参数梯度会自动累加

        sgd([w, b], lr, batch_size)  # 一个小批量出一个w,b   梯度下降算法
        # 一个小批量的参数更新后就要对参数的梯度进行清零操作
        w.grad.data.zero_()
        b.grad.data.zero_()
    train_l = loss(net(features, w, b), labels)  # 这里的w,b是一轮所有的批量更新完成之后得到的最新的值,然后用于所有的样本进行损失计算
    print('epoch %d, loss %f' % (epoch + 1, train_l.mean().item()))  # 因为loss是一个1000x1的一个张量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值