【PyTorch深度学习实践】04_用PyTorch实现线性回归

1. 模型训练步骤

1.准备数据集
dataset和dataloader
2.设计模型(计算y帽)
3.构造损失函数和优化器(使用pytorch的封装接口)
4.训练过程
前馈(算损失-构建计算图)、反馈(算梯度)、更新(用梯度下降更新)

2. 实现过程

2.1 准备数据集

在这里插入图片描述

import torch
# x,y这里都是张量
x_data = torch.tensor([[1.0],[2.0],[3.0]])  # 这里外面用[]框起来是为了变成一个矩阵,只有是矩阵这代码才能跑
y_data = torch.tensor([[2.0],[4.0],[6.0]])

2.2 设计模型

# 线性回归模型
class LinearModel(torch.nn.Module):  # 表明从Moudle类继承
    # 以下两个类是必须要写的
    def __init__(self):
        super().__init__()  # 调用父类的__init__(),这句无脑写就可以
        # 对Linear进行实例化,创建名为linear的对象,Linear是继承自Moudle的,Moudle里面有__call__()函数
        self.linear = torch.nn.Linear(1, 1)  # (1,1)代表输入的是1维数据(只有1个feature-只有1列),输出也是1维数据

    def forward(self, x):  # 只能叫forward
        # 下面的实现结构是:对象(),即对象是可调用的,传入x就可以进行计算
        y_pred = self.linear(x)  # 计算y_hat,即wx+b(预测值)
        return y_pred
# 实例化上面创建的类
model = LinearModel()   # model也是可调用的,model(x)会自动送入forward(x)里,因为__call__()里会调用forward

快捷键 command,查看被继承的类的完整代码

2.3 设计损失函数和优化器

损失函数

在这里插入图片描述

# 实例化MSELoss,需要y_hat和y两个参数来求损失
criterion = torch.nn.MSELoss(size_average=False,reduce=True)

优化器

在这里插入图片描述

# 实例化SGD,可以求梯度
# parameters()可以求得所有需要更新(优化)的参数(w,b),lr是自己设定的学习率
optimizer = torch.nn.SGD(model.parameters(), lr=0.01)

在这里插入图片描述

2.4 训练过程

for epoch in range(100):
    # 前馈
    y_pred = model(x_data)
    loss = criterion(y_pred,y_data)
    print(epoch,loss.item())  # 这里的loss是标量
    # 梯度清零
    optimizer.zero_grad()
    # 反馈
    loss.backward()   # 求梯度
    # 更新
    optimizer.step()

# 输出
print('w = ', model.linear.weight.item())
print('b = ', model.linear.bias.item())

x_test = torch.tensor([[4.0]])
y_test = model(x_test)
print('y_pred=',y_test.data)

输出

0 25.836095809936523
1 18.030044555664062
2 12.605081558227539
3 8.834733963012695
4 6.214179039001465
5 4.3926191329956055
6 3.126283884048462
7 2.2457785606384277
8 1.6333876848220825
9 1.2073142528533936
10 0.91071617603302
11 0.7040932774543762
12 0.5599988102912903
13 0.45935899019241333
14 0.38891932368278503
15 0.3394688665866852
16 0.3046071529388428
17 0.2798873782157898
····
93 0.1312834471464157
94 0.13033844530582428
95 0.12940005958080292
96 0.12846867740154266
97 0.1275438666343689
98 0.12662562727928162
99 0.12571397423744202
w =  1.7631036043167114
b =  0.5385211706161499
y_pred= tensor([[7.5909]])

3. 完整代码

import torch
import matplotlib.pyplot as plt

x_data = torch.tensor([[1.0], [2.0], [3.0]])
y_data = torch.tensor([[2.0], [4.0], [6.0]])


# 模型
class LinearModel(torch.nn.Module):  # 表明从Moudle类继承
    # 快捷键 ctrl+H
    # 以下两个类是必须要写的
    def __init__(self):
        super().__init__()  # 调用父类的__init__(),这句无脑写就可以
        # 对Linear进行实例化,创建名为linear的对象,Linear是继承自Moudle的,Moudle里面有__call__()函数
        self.linear = torch.nn.Linear(1, 1)  # (1,1)代表输入的是1维数据(只有1个feature-只有1列),输出也是1维数据

    def forward(self, x):  # 只能叫forward
        # 下面的实现结构是:对象(),即对象是可调用的,传入x就可以进行计算
        y_pred = self.linear(x)  # 计算y_hat,即wx+b(预测值)
        return y_pred


# 实例化上面创建的类
model = LinearModel()  # model也是可调用的,model(x)会自动送入forward(x)里,因为__call__()里会调用forward

# 实例化MSELoss,需要y_pred和y求损失
criterion = torch.nn.MSELoss(size_average=False,reduce=True)

# 实例化SGD,可以求梯度
# parameters()可以求得所有需要更新(优化)的参数(w,b),lr是自己设定的学习率
optimizer = torch.optim.SGD(model.parameters(), lr=0.005)

loss_list = []
epoch_list = []

for epoch in range(100):

    # 前馈
    y_pred = model(x_data)
    loss = criterion(y_pred,y_data)
    print(epoch,loss.item())  # 这里的loss是标量
    epoch_list.append(epoch)
    loss_list.append(loss.item())
    # 梯度清零
    optimizer.zero_grad()
    # 反馈
    loss.backward()   # 求梯度
    # 更新
    optimizer.step()

# 输出
print('w = ', model.linear.weight.item())
print('b = ', model.linear.bias.item())

x_test = torch.tensor([[4.0]])
y_test = model(x_test)
print('y_pred=',y_test.data)

plt.plot(epoch_list, loss_list)
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()

训练轮数epoch-损失loss图

在这里插入图片描述

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
线性回归是一种经典的机器学习算法,用于建立变量之间的线性关系,从而预测连续型变量的值。在PyTorch中,可以使用torch.nn模块来实现线性回归。 以下是一个简单的例子,展示如何使用PyTorch实现线性回归: 首先,导入必要的库: ```python import torch import torch.nn as nn import numpy as np import matplotlib.pyplot as plt ``` 接下来,我们生成一些随机的数据,用于训练模型: ```python #生成随机数据 np.random.seed(0) X = np.random.rand(100, 1) y = 2 + 3*X + 0.2*np.random.randn(100, 1) ``` 然后,我们定义一个线性回归模型,该模型由一个全连接层组成: ```python #定义线性回归模型 class LinearRegression(nn.Module): def __init__(self, input_dim, output_dim): super(LinearRegression, self).__init__() self.linear = nn.Linear(input_dim, output_dim) def forward(self, x): out = self.linear(x) return out #实例化模型 model = LinearRegression(1, 1) ``` 在训练模型之前,我们需要定义损失函数和优化器: ```python #定义损失函数和优化器 criterion = nn.MSELoss() optimizer = torch.optim.SGD(model.parameters(), lr=0.01) ``` 接下来,我们进行模型训练: ```python #训练模型 epochs = 1000 for epoch in range(epochs): inputs = torch.from_numpy(X).float() labels = torch.from_numpy(y).float() #前向传播 outputs = model(inputs) #计算损失 loss = criterion(outputs, labels) #反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() #每100个epoch打印一次损失 if (epoch+1) % 100 == 0: print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, epochs, loss.item())) ``` 最后,我们可以使用训练好的模型来进行预测: ```python #使用模型进行预测 predicted = model(torch.from_numpy(X).float()).data.numpy() #绘制预测结果和真实结果的散点图 plt.plot(X, y, 'ro', label='Original data') plt.plot(X, predicted, label='Fitted line') plt.legend() plt.show() ``` 这样,我们就完成了一个简单的线性回归模型的实现

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值