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

1. 模型训练步骤

1.准备数据集
dataset和dataloader
2.设计模型
3.构造损失函数和优化器
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图

在这里插入图片描述

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>