【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
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值