回归实战(小白版本)

一.完整代码

python 复制代码
import torch
import matplotlib.pylab as plt#画图
import random #产生随机数

def create_data(w,b,data_num):#生成数据,w系数,b截距,data_num表样本数量
     x=torch.normal(0,1,(data_num,len(w)))#注:系数个数必须等于特征数
     y=torch.matmul(x,w)+b#表矩阵相乘

     noise=torch.normal(0,0.01,(y.shape))#噪声要加到y上,生成的数据与y一样的维度
     y+=noise
     return x,y

num=500

true_w=torch.tensor([8.1,2,2,4])#四个特征系数
true_b=torch.tensor(1.1)#是一个标量张量,对应线性模型的截距

X,Y=create_data(true_w,true_b,num)

#X[:,3]表取所有行,取第四列,1表示散点大小
plt.scatter(X[:,2],Y,1)#画一个散点图,展示第四个特征与y的关系
plt.show()



# 不知道w,b来推测其值
#label特征对应的标签集(比如线性回归中的 y 值,是模型预测的目标)
def data_provider(data,label,batchsize):#每次访问函数,就会提供一批数据(即一组一组计算)
     length=len(label)
     indices=list(range(length))#样本索引

     for each in range(0,length,batchsize):#每次循环的步长为batchsize
          get_indices=indices[each:each+batchsize]#当前批次索引
          get_data=data[get_indices]
          get_label=label[get_indices]

          yield get_data,get_label#有存档点的return 暂停点

batchsize=16
# for batch_x,batch_y in data_provider(X,Y,batchsize):
#      print(batch_x,batch_y)
#      break


#定义模型
def fun(x,w,b):
     pred_y=torch.matmul(x,w)+b#预测值
     return pred_y

#损失函数
def maeLoss(pre_y,y):
     return torch.sum(abs(pre_y-y))/len(y)

#优化函数
def sgd(paras,lr):#随机梯度下降,更新参数
     with torch.no_grad():#属于这句代码的部分,不计算梯度
          for para in paras:
                  para-=para.grad*lr#往损失函数减小的方向移动
                  para.grad.zero_()#使用过的梯度,归0


lr=0.03
w_0=torch.normal(0,0.01,true_w.shape,requires_grad=True)
b_0=torch.tensor(0.01,requires_grad=True)
print(w_0,b_0)


epochs=50#训练的轮数

for epoch in range(epochs):
     data_loss=0
     for batch_x,batch_y in data_provider(X,Y,batchsize):
          pred_y=fun(batch_x,w_0,b_0)
          loss=maeLoss(pred_y,batch_y)
          loss.backward()
          sgd([w_0,b_0],lr)
          data_loss+=loss

     print("epoch %03d: loss:%.6f"%(epoch,data_loss))

print("真实的函数值是",true_w,true_b)
print("训练得到的函数值是",w_0,b_0)


#只能看某一列的y值图
#第一列
idx=0
plt.plot(X[:,idx].detach().numpy(),X[:,idx].detach().numpy()*w_0[idx].detach().numpy()+b_0.detach().numpy())
plt.scatter(X[:,idx],Y,1)
plt.show()

二.具体细节(有疑惑的部分)

python 复制代码
#优化函数
def sgd(paras,lr):#随机梯度下降,更新参数
     with torch.no_grad():#属于这句代码的部分,不计算梯度重点
          for para in paras:
                  para-=para.grad*lr#往损失函数减小的方向移动
                  para.grad.zero_()#使用过的梯度,归0

首先就是分批进行优化参数w,b;每一轮末尾要将使用过的梯度归0,防止梯度累积影响下一轮数据的参数优化更新;

但不是分批的进行吗 那么每次不是一直在覆盖之前存储的w吗?

  • 不是丢失信息 ,而是在改进参数
  • 每次批处理都让w变得更接近"正确答案"(每一批都在优化参数)
相关推荐
kishu_iOS&AI几秒前
机器学习 —— 线性回归(实例)
人工智能·python·机器学习·线性回归
天天进步20158 分钟前
[架构篇] 解构项目蓝图:Toonflow 的模块化设计与 AI 管道流转
人工智能·架构
龙文浩_8 分钟前
AI中NLP的深入浅出注意力机制 Seq2Seq 模型
人工智能·pytorch·深度学习·神经网络·自然语言处理
小饕8 分钟前
RAG 学习之-向量数据库与 FAISS 索引完全指南:从原理到选型实战
人工智能·rag·大模型应用
北京耐用通信9 分钟前
CC-Link IE转Modbus TCP集成实战:耐达讯自动化网关在五星级酒店节能改造中的应用
人工智能·物联网·网络协议·自动化·信息与通信
小超同学你好9 分钟前
面向 LLM 的程序设计 9:系统提示中的「能力边界」——减少越权与幻觉调用
人工智能·深度学习·语言模型
黑金IT10 分钟前
从“抽卡”到“工业化”:多模态 Harness 如何重塑 AI 内容生产的反馈闭环
人工智能·prompt·harness工程
笨笨饿12 分钟前
# 52_浅谈为什么工程基本进入复数域?
linux·服务器·c语言·数据结构·人工智能·算法·学习方法
dtsola15 分钟前
小遥搜索生态新成员:一键导出钉钉文档,实现本地AI搜索
人工智能·ai编程·知识库·ai创业·独立开发者·个人开发者·一人公司
星爷AG I16 分钟前
18-9 预测心智(AGI基础理论)
人工智能·agi