Pytorch 线性回归

日萌社

人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新)


Pytorch完成线性回归

目标

  1. 知道如何手动完成线性回归

1. 线性回归实现

下面,我们使用一个自定义的数据,来使用torch实现一个简单的线性回归

假设我们的基础模型就是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 as np
from matplotlib import pyplot as plt


#1. 准备数据 y = 3x+0.8,准备参数
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_()
    # [i.grad.data.zero_() for i in [w,b] if i.grad is not None]
    loss.backward()
    return loss.data

def optimize(learning_rate):
    # print(w.grad.data,w.data,b.data)
    w.data -= learning_rate* w.grad.data
    b.data -= learning_rate* b.grad.data

for i in range(3000):
    #2. 计算预测值
    y_predict = x*w + b

    #3.计算损失,把参数的梯度置为0,进行反向传播 
    loss = loss_fn(y,y_predict)

    if i%500 == 0:
        print(i,loss)
    #4. 更新参数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)

图形效果如下:

打印w和b,可有

w tensor([2.9280], requires_grad=True)
b tensor([0.8372], requires_grad=True)

可知,w和b已经非常接近原来的预设的3和0.8


Pytorch基础模型

目标

  1. 知道如何使用pytorch模型组件构建模型
  2. 知道如何在GPU上运行代码
  3. 能够说出常见的优化器及其原理

1 使用pytorch模型组件把线性回归完整代码

构建模型,最重要的有两个步骤:

  1. 找到合适的计算关系,随即初始化参数来拟合输入和输出的关系(前向计算,从输入得到输出)
  2. 选取合适的损失函数和优化器来减小损失(反向传播,得到合适的参数)
import torch
from torch import nn
from torch import optim
import numpy as np
from matplotlib import pyplot as plt

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

#2 .定义模型
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

# 2. 实例化模型,loss,和优化器
model = Lr()
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=1e-3)
#3. 训练模型
for i in range(30000):
    out = model(x) #3.1 获取预测值
    loss = criterion(y,out) #3.2 计算损失
    optimizer.zero_grad()  #3.3 梯度归零
    loss.backward() #3.4 计算梯度
    optimizer.step()  # 3.5 更新梯度
    if (i+1) % 20 == 0:
        print('Epoch[{}/{}], loss: {:.6f}'.format(i,30000,loss.data))

#4. 模型评估
model.eval() #设置模型为评估模式,即预测模式
predict = model(x)
predict = predict.data.numpy()
plt.scatter(x.data.numpy(),y.data.numpy(),c="r")
plt.plot(x.data.numpy(),predict)
plt.show()

输出如下:

注意:

model.eval()表示设置模型为评估模式,即预测模式

model.train(mode=True) 表示设置模型为训练模式

在当前的线性回归中,上述并无区别

但是在其他的一些模型中,训练的参数和预测的参数会不相同,到时候就需要具体告诉程序我们是在进行训练还是预测,比如模型中存在DropoutBatchNorm的时候

2. 在GPU上运行代码

当模型太大,或者参数太多的情况下,为了加快训练速度,经常会使用GPU来进行训练

此时我们的代码需要稍作调整:

  1. 判断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
    
  1. 把模型参数和input数据转化为cuda的支持类型

    model.to(device)
    x_true.to(device)
    
  1. 在GPU上计算结果也为cuda的数据类型,需要转化为numpy或者torch的cpu的tensor类型

    predict = predict.cpu().detach().numpy()
    

    detach()的效果和data的相似,但是detach()是深拷贝,data是取值,是浅拷贝

修改之后的代码如下:

import torch
from torch import nn
from torch import optim
import numpy as np
from matplotlib import pyplot as plt
import time

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

#2 .定义模型
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

# 2. 实例化模型,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)

#3. 训练模型
for i in range(300):
    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,30000,loss.data))

#4. 模型评估
model.eval() #
predict = model(x)
predict = predict.cpu().detach().numpy() #转化为numpy数组
plt.scatter(x.cpu().data.numpy(),y.cpu().data.numpy(),c="r")
plt.plot(x.cpu().data.numpy(),predict,)
plt.show()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PyTorch是一种基于Python的科学计算库,它广泛应用于深度学习和人工智能领域。其中,PyTorch实现了许多机器学习算法,包括线性回归线性回归是一种用于建立输入变量和输出变量之间线性关系的机器学习算法。在PyTorch中,我们可以使用torch.nn模块来实现线性回归。 下面是一个简单的PyTorch线性回归模型的代码示例: ```python import torch import torch.nn as nn import matplotlib.pyplot as plt # 创建训练数据 x = torch.randn(100, 1) * 10 y = x + 3 * torch.randn(100, 1) # 定义模型 model = nn.Linear(1, 1) # 定义损失函数 criterion = nn.MSELoss() # 定义优化器 optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # 训练模型 num_epochs = 1000 for epoch in range(num_epochs): # 前向传播 y_pred = model(x) loss = criterion(y_pred, y) # 反向传播 optimizer.zero_grad() loss.backward() optimizer.step() # 打印损失 if (epoch+1) % 100 == 0: print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item())) # 可视化结果 predicted = model(x).detach().numpy() plt.plot(x.numpy(), y.numpy(), 'ro', label='Original data') plt.plot(x.numpy(), predicted, label='Fitted line') plt.legend() plt.show() ``` 在这个例子中,我们首先创建了100个随机数作为输入数据,并使用这些数据生成对应的输出数据。然后,我们定义了一个具有单个输入和输出的线性模型,并将均方误差(MSE)作为损失函数。 接下来,我们使用随机梯度下降(SGD)作为优化器来训练模型。在每个epoch中,我们执行了一次前向传播和反向传播,并使用优化器来更新模型参数。 最后,我们可视化了模型预测结果和原始数据,以便更好地理解模型的性能。 总的来说,PyTorch提供了一个简单而强大的方法来实现线性回归模型。通过使用PyTorch,我们可以轻松地定义模型、损失函数和优化器,并进行训练和预测。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

あずにゃん

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值