利用phtorch中的优化器实现梯度下降

import torch
from matplotlib import pyplot as plt
import torch.optim as optim
# 因为grad在反向传播的过程中是累加的,也就是说上一次反向传播的结果会对下一次的反向传播的结果造成影响,
# 则意味着每一次运行反向传播,梯度都会累加之前的梯度,所以一般在反向传播之前需要把梯度清零。
#
#清零使用的方法是
# #未加入优化器时
# if params.grad is not None:
# # params.grad.zero_()#params=[w,b]
#加入优化器时
#optimizer.zero_grad()#梯度清零
#未加入优化器时
# def loss_fn(t_p,t_c):#注意定义变量是函数名字和变量名字不要混淆
#     l=(t_p-t_c)**2
#     return l.mean()#对所有损失求和key 变量.mean()为对变量求和
# def model(t_u,w,b):
#     return w*t_u+b
#
#
# def training_loop(iterations, learning_rate, params, t_u, t_c,
#                     print_params = True, verbose=1):
#     for epoch in range(1, iterations + 1):
#         # if params.grad is not None:
#         #     params.grad.zero_()  # 这可以在调用backward之前在循环中的任何时候完成
#         w,b=params
#         t_p = model(t_u, w,b)
#         loss = loss_fn(t_p, t_c)
#         loss.backward()
#         params = (params - learning_rate * params.grad).detach().requires_grad_()
#         # params.grad.zero_()
#         if epoch % 500 == 0:
#             print('Epoch %d, Loss %f' % (epoch, float(loss)))
#
#     return params
# #t_c是摄氏度数,t_u是未知单位度数
# t_c = [0.5,  14.0, 15.0, 28.0, 11.0,  8.0,  3.0, -4.0,  6.0, 13.0, 21.0]
# t_u = [35.7, 55.9, 58.2, 81.9, 56.3, 48.9, 33.9, 21.8, 48.4, 60.4, 68.4]
# t_c = torch.tensor(t_c)
# t_u = torch.tensor(t_u)
# t_cn=t_c/21.0#正则化
# t_un=t_u/68.4#为x
# [w_last,b_last]=training_loop(5000,1e-2,torch.tensor([1.0,0.0],requires_grad=True),t_un,t_cn)#注意点params为2维度矩阵
# print(w_last,b_last)
# t_p = model(t_un,w_last,b_last) # 记住你是在规范后数据上训练的
# # fig = plt.figure(dpi=600)
# plt.xlabel("t_un")
# plt.ylabel("t_p")
# # plt.plot(t_un, t_p) # 在原数据上作图t_p.detach().numpy()
# # plt.plot(t_un, t_cn, 'o')
# # plt.show()
# plt.plot(t_un.detach().numpy(), t_p.detach().numpy()) # 在原数据上作图t_p.detach().numpy()
# plt.plot(t_un.detach().numpy(), t_cn.detach().numpy(), 'o')
# plt.show()
# # 加入优化器时
# def loss_fn(t_p,t_c):#注意定义变量是函数名字和变量名字不要混淆
#     l=(t_p-t_c)**2
#     return l.mean()#对所有损失求和key 变量.mean()为对变量求和
# def model(t_u,w,b):
#     return w*t_u+b
#
#
# def training_loop(n_epochs, optimizer, params, t_u, t_c):
#     for epoch in range(1, n_epochs + 1):
#         w,b=params
#         t_p = model(t_u, w,b)
#         loss = loss_fn(t_p, t_c)
#         optimizer.zero_grad()#梯度清零
#         loss.backward()
#         optimizer.step()
#         if epoch % 500 == 0:
#             print('Epoch %d, Loss %f' % (epoch, float(loss)))
#     return params
# t_c = [0.5,  14.0, 15.0, 28.0, 11.0,  8.0,  3.0, -4.0,  6.0, 13.0, 21.0]
# t_u = [35.7, 55.9, 58.2, 81.9, 56.3, 48.9, 33.9, 21.8, 48.4, 60.4, 68.4]
# t_c = torch.tensor(t_c)
# t_u = torch.tensor(t_u)
# t_cn=t_c/21.0#正则化
# t_un=t_u/68.4#为x
# params = torch.tensor([1.0, 0.0], requires_grad=True)
# learning_rate = 1e-2
# optimizer = optim.SGD([params], lr=learning_rate)
# #选用梯度下降算法SGD
# [w_last,b_last]=training_loop(
#     n_epochs = 5000,
#     optimizer = optimizer,
#     params = params,
#     t_u = t_un,
#     t_c = t_cn)#t_c是摄氏度数,t_u是未知单位度数
# t_p = model(t_un,w_last,b_last) # 记住你是在规范后数据上训练的
# # fig = plt.figure(dpi=600)
# plt.xlabel("t_un")
# plt.ylabel("t_p")
# # plt.plot(t_un, t_p) # 在原数据上作图t_p.detach().numpy()
# # plt.plot(t_un, t_cn, 'o')
# # plt.show()
# #画图时注意此时t_un和t_cn,t_p有梯度所以需要加detach()后缀将其从梯度中抽离
# plt.plot(t_un.detach().numpy(), t_p.detach().numpy()) # 在原数据上作图t_p.detach().numpy()
# plt.plot(t_un.detach().numpy(), t_cn.detach().numpy(), 'o')
# plt.show()
# #画图时注意此时t_un和t_cn,t_p有梯度所以需要加detach()后缀将其从梯度中抽离
# #错误的做法
# # t_un.grad=False
# # t_cn.grad=False
# # t_p.grad=False
# # plt.plot(t_un.numpy(), t_p.numpy()) # 在原数据上作图t_p.detach().numpy()
# # plt.plot(t_un.numpy(), t_cn.numpy(), 'o')
# # plt.show()

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值