# 核心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的一个张量
李沐深度学习-线性回归从零开始
于 2024-01-19 14:26:49 首次发布
本文详细介绍了如何使用PyTorch库中的Tensor和autograd功能实现线性回归模型,包括数据预处理、模型定义、损失函数选择(如均方误差)、优化算法(如SGD)以及小批量反向传播的过程。作者通过实例展示了如何训练模型并更新参数梯度。
摘要由CSDN通过智能技术生成