使用基本的PyTorch API 实现线性回归模型 | “朝闻道”知识分享大赛

九酿丸子 2023-12-05 17:21:19

这是我参加朝闻道知识分享大赛的第4篇文章

目录

使用基本的PyTorch API 实现线性回归模型

 创建数据

初始化参数

 定义函数表达式

前向计算(forward)

反向传播更新参数(backward)

 循环迭代训练

使用PyTorch的自动求导机制计算


使用基本的PyTorch API 实现线性回归模型

 创建数据

import torch

x = torch.randn(100)   # 生成100个标准正态分布随机数
y = 3*x+2

初始化参数

k = torch.randn(1)
b = torch.randn(1)

print(f'k:{k},b:{b}')

 定义函数表达式

# 定义模型(函数表达式)
def linear(x,k,b):
    return k*x+b    

# 定义损失函数(误差函数)
def loss_fun(y_true,y_pred):
    return 1/2 * torch.sum(torch.square(y_true-y_pred))

前向计算(forward)

y_pred = linear(x,k,b)
error = loss_fun(y,y_pred)
print(error)

反向传播更新参数(backward)

# 求参数关于损失的梯度
d_k=(y - y_pred )*(-1)*x
d_b = (y - y_pred )*(-1)

# 超参数定义

# 定义学习率
lr=0.5

# 更新参数
k = k - torch.sum(d_k) * lr
b = b - torch.sum(d_b) * lr 

print(f'k:{k},b={b}')

 循环迭代训练

# 定义超参数

# 定义最大迭代次数
epochs = 100

for epoch in range (epochs):
    #向前计算
    y_pred = linear(x,k,b)
    errpr = loss_fun(y,y_pred)
    
    #反向传播计算梯度
    d_k = (y - y_pred) * (-1) *x
    d_b = (y - y_pred) * (-1)
    
    #更新参数
    k = k-torch.sum(d_k)  * lr
    b = b-torch.sum(d_b) * lr
    
    print(f"epoch{epoch+1},loss:{error},k:{k},b:{b}")

 出现梯度爆炸现象,说明学习率设置得过大

# 重新定义学习率
lr=0.01

 # 重新初始化参数
k = torch.randn(1)
b = torch.randn(1)

#再次迭代
for epoch in range (epochs):
    #向前计算
    y_pred = linear(x,k,b)
    errpr = loss_fun(y,y_pred)
    
    #反向传播计算梯度
    d_k = (y - y_pred) * (-1) *x
    d_b = (y - y_pred) * (-1)
    
    #更新参数
    k = k-torch.sum(d_k)  * lr
    b = b-torch.sum(d_b) * lr
    
    print(f"epoch:{epoch+1},loss:{error},k:{k},b:{b}")

 为了减少我们写代码的数量,我们也可以使用使用PyTorch的自动求导机制计算

使用PyTorch的自动求导机制计算

# 重新初始化参
k = torch.randn(1,requires_grad=True)
b = torch.randn(1,requires_grad=True)

print(f'k:{k},b:{b}')

y_pred = linear(x,k,b)
error = loss_fun(y,y_pred)

#反向传播计算梯度
error.backward()
d_k = k.grad
#再次迭代
for epoch in range (epochs):
    #向前计算
    y_pred = linear(x,k,b)
    error = loss_fun(y,y_pred)
    
    #反向传播计算梯度
    error.backward(retain_graph=True)
    d_k = k.grad
    d_b = b.grad
    
    #更新参数
    k.data-=d_k * lr
    b.data-=d_b * lr
    
    #梯度置零
    k.grad.data.zero_()
    b.grad.data.zero_()
    
    print(f"epoch:{epoch+1},loss:{error},k:{k},b:{b}")

...全文
30 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

1,040

社区成员

发帖
与我相关
我的任务
社区描述
中南民族大学CSDN高校俱乐部聚焦校内IT技术爱好者,通过构建系统化的内容和运营体系,旨在将中南民族大学CSDN社区变成校内最大的技术交流沟通平台。
经验分享 高校 湖北省·武汉市
社区管理员
  • c_university_1575
  • WhiteGlint666
  • wzh_scuec
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

欢迎各位加入中南民族大学&&CSDN高校俱乐部社区(官方QQ群:908527260),成为CSDN高校俱乐部的成员具体步骤(必填),填写如下表单,表单链接如下:
人才储备数据库及线上礼品发放表单邀请人吴钟昊:https://ddz.red/CSDN
CSDN高校俱乐部是给大家提供技术分享交流的平台,会不定期的给大家分享CSDN方面的相关比赛以及活动或实习报名链接,希望大家一起努力加油!共同建设中南民族大学良好的技术知识分享社区。

注意:

1.社区成员不得在社区发布违反社会主义核心价值观的言论。

2.社区成员不得在社区内谈及政治敏感话题。

3.该社区为知识分享的平台,可以相互探讨、交流学习经验,尽量不在社区谈论其他无关话题。

试试用AI创作助手写篇文章吧