pytorch实现线性回归

"""
目标:
知道如何手动完成线性回归

假设我们的基础模型就是y = wx+b,其中w和b均为参数,我们使用y = 3x+0.8来构造数据x、y,所以最后通过模型应该能够得出w和b应该分别接近3和0.8

步骤:
1、准备数据
2、计算预测值
3、计算损失,把参数的梯度值置为0,进行反向传播
4、更新参数
"""

# import torch
# import numpy
# from matplotlib import pyplot as plt
#
# # 1、准备数据
# x = torch.rand([50])
# y = 3 * x + 0.8
#
# w = torch.rand(1,requires_grad=True)
# b = torch.rand(1,requires_grad=True)
#
# def loss_fn(y,y_predict):
#     loss = (y_predict - y).pow(2).mean()
#     for i in [w,b]:
#         # 每次反向传播前把梯度置为0
#         if i.grad is not None:
#             i.grad.data.zero_()
#     loss.backward()
#     return loss.data
#
# def optimize(learning_rate):
#     w.data -= learning_rate * w.grad.data
#     b.data -= learning_rate * b.grad.data
#
# for i in range(3000):
#     # 计算预测值
#     y_predict = x * w + b
#
#     # 计算损失值,把参数的梯度置为0,进行反向传播
#     loss = loss_fn(y,y_predict)
#
#     if i % 500 == 0:
#         print(i,loss)
#     # 更新参数w和b
#     optimize(0.01)
#
# # 绘制图像,观察训练值和预测值
# predict = x * w + b  # 这里的w和b是经过训练得到的
# plt.scatter(x.data.numpy(),y.data.numpy(),c = 'r')  # 将数据表示在图上
# plt.plot(x.data.numpy(),predict.data.numpy())
# plt.show()
#
# print('w:',w)
# print('b:',b)






# pytorch基础模型
"""
目标:
知道如何使用pytorch模型组件构建模型
知道如何在GPU上运行代码
能够说出常见的优化器及其原理
"""

# 1、使用pytorch模型组件把线性回归完成代码
"""
构建模型,最重要的有两个步骤:

找到合适的计算关系,随即初始化参数来拟合输入和输出的关系(前向计算,从输入得到输出)
选取合适的损失函数和优化器来减小损失(反向传播,得到合适的参数)
"""

# import torch
# from torch import nn
# from torch import optim
# import numpy as np
# from matplotlib import pyplot as plt
#
# # 定义数据
# x = torch.rand([50,1])
# print(x.shape)
# y = x * 3 + 0.8
#
# # 定义模型:
# class Lr(nn.Module):
#     def __init__(self):
#         super(Lr,self).__init__()
#         self.linear = nn.Linear(1,1)
#
#     def forward(self,x):
#         out = self.linear(x)
#         return out
#
# # 实例化模型
# model = Lr()
# citerion = nn.MSELoss()
# optimizer = optim.SGD(model.parameters(),lr = 1e-3)
#
# # 训练模型
# for i in range(50000):
#     out = model(x)  # 获取预测值
#     loss = citerion(y,out)  # 计算损失值
#     optimizer.zero_grad()  # 梯度清零
#     loss.backward()  # 计算梯度
#     optimizer.step()  # 更新梯度
#     if (i+1) % 20 == 0:
#         print('Epoch[{}/{}],loss:{:.6f}'.format(i,50000,loss.data))
#
# # 模型评估
# model.eval()  # 设置模式为评估模式,即预测模式
# predict = model(x)
# predict = predict.data.numpy()
# plt.scatter(x.data.numpy(),y.data.numpy(),c='b')
# plt.plot(x.data.numpy(),predict)
# plt.show()

# 注意:
"""
model.eval()表示设置模型为评估模式,即预测模式
model.train(mode=True) 表示设置模型为训练模式
"""




# 在GPU上运行代码:当模型太大,或者参数太多的情况下,为了加快训练速度,经常会使用GPU来进行训练
"""
判断GPU是否可用torch.cuda.is_available():
    torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    >>device(type='cuda', index=0)  #使用gpu
    >>device(type='cpu') #使用cpu
    
把模型参数和input数据转化为cuda的支持类型:
    model.to(device)
    x_true.to(device)
    
在GPU上计算结果也为cuda的数据类型,需要转化为numpy或者torch的cpu的tensor类型:
    predict = predict.cpu().detach().numpy()
detach()的效果和data的相似,但是detach()是深拷贝,data是取值,是浅拷贝
"""
import torch
import numpy as np
from torch import nn
from torch import optim
from matplotlib import pyplot as plt
import time

# 定义数据
x = torch.rand([50,1])
y = x * 3 + 0.8

# 定义模型
class Lr(nn.Module):
    def __init__(self):
        super(Lr, self).__init__()
        self.linear = nn.Linear(1,1)

    def forward(self,x):
        out = self.linear(x)
        return out

# 实例化模型,loss,和优化器
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
x,y = x.to(device),y.to(device)

model = Lr().to(device)
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(),lr = 1e-3)

# 训练模型
for i in range(50000):
    out = model(x)
    loss = criterion(y,out)

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    if (i + 1) % 20 == 0:
        print("Epoch[{}/{}],loss:{:.6f}".format(i,50000,loss.data))

# 模型评估
model.eval()
predict = model(x)
predict = predict.cpu().detach().numpy()  # 转换为numpy】数组
plt.scatter(x.cpu().data.numpy(),y.cpu().data.numpy(),c = 'b')
plt.plot(x.cpu().data.numpy(),predict)
plt.show()

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值