当前位置:   article > 正文

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

linear probe 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]])
  • 1
  • 2
  • 3
  • 4

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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

2.3 设计损失函数和优化器

损失函数

在这里插入图片描述

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

优化器

在这里插入图片描述

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

在这里插入图片描述

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

输出

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]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

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()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

训练轮数epoch-损失loss图

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/577735
推荐阅读
相关标签
  

闽ICP备14008679号