Pytorch实现线性模型

1、模型训练步骤

(1)准备数据集

(2)设计模型,计算y_pred

(3)计算loss

(4)训练周期

​ ①前馈②反馈(梯度)③更新权重

2、知识点

(1)线性单元(Linear Unit)

①线性单元就是计算一次y_pred,也就是一个感知机。

在这里插入图片描述

②在实际的计算中,y_pred与X都是向量,而在pytorch里面使用Tensor进行向量的存储,因此在进行数据准备时需要将训练数据存储为Tensor。

注:例如:w矩阵在扩充之前是1*1,那么在实际的计算中,需要将w扩充为31矩阵
在这里插入图片描述

1632912136360

③w需要根据z与x来确定形状,而b需要根据x来确定形状。
根 据 线 性 单 元 得 到 : z = w ∗ x + b , 根据线性单元得到:z=w*x+b, 线z=wx+b

(2)Loss计算

①loss计算公式
L o s s = ∑ L o s s i Loss = ∑Loss^i Loss=Lossi
注:为了使用pytorch使用backword()计算反馈,因此需要将Loss转化为标量

(3)tensor.nn.类的使用

定义自己的网络,需要继承Tensor.nn,Moudle类,并实现forward方法

tensor.nn,Moudle()类会自动构建计算图

构建模型:

A、继承torch.nn.Moudle接口

B、定义__init__()构造函数,在实例化对象的时候就会启用

C、构造线性模型对象。【其中torch.nn.Linear是一个线性模型类,其内部实现了__call()__函数,因此在调用的时候可以传参数weight、bias】

tensor.nn,Linear线性模型

A、tensor.nn.Linear(in_features, out_features, bias=True)

B、in_features:表示输入的样本、out_features:表示输出的样本

class LinearMoudle(torch.nn.Module):
    def __init__(self):
        super(LinearMoudle, self).__init__()
        self.linear = torch.nn.Linear(1, 1)

③损失函数和优化器

#定义损失函数 torch.nn.MSELoss(size_average=True, reduce=True)
# ——> size_average是否求均值、reduce是否降维求和
#SGD——optim里面的一个随机梯度下降算法
#torch.optim.SGD(params【权重参数】, lr=【学习率】, momentum=0【冲量】)
# moudle.parameters()——检查Linear里成员的权重
riterion = torch.nn.MSELoss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

3、代码是实现

import torch

# 数据集加载
x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[2.0], [4.0], [6.0]])

# LinearMoudle类的创建,并继承Moudle
class LinearMoudle(torch.nn.Module):
    # 继承类
    def __init__(self):
        # 继承
        super(LinearMoudle, self).__init__()
        # 继承linear
        # torch.nn.Linear(weight, bits)用于构造对象
        # 在类里面定义__call__函数可以使用里面的参数
        self.linear = torch.nn.Linear(1, 1)

    # 定义前馈函数
    def forward(self, x):
        # 使用torch里面的线性模型计算预测值
        y_pred = self.linear(x)
        return y_pred

# 构造对象
model = LinearMoudle()

# 定义损失函数 torch.nn.MSELoss(size_average=True, reduce=True)
# ——> 是否求均值、是否降维求和
criterion = torch.nn.MSELoss(size_average=False)

# 定义优化器
# torch.optim.SGD(params【权重参数】, lr=【学习率】, momentum=0【冲量】)
# moudle.parameters()——检查Linear里成员的权重
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
# 训练
for epoch in range(1000):
    # 前馈
    y_pred = model(x_data)
    # 计算损失函数
    loss = criterion(y_pred, y_data)
    # 输出提示
    print(epoch, loss.item())

    # 清零
    optimizer.zero_grad()
    # 反馈
    loss.backward()
    # 权重更新
    optimizer.step()

# 输出权重和偏移量
print("w=", model.linear.weight.item())
print("bias=", model.linear.bias.item())

# 预测值
x_test = torch.tensor([4.0])
y_test = model(x_test)
print("y_pred=", y_test.data)

第一张图片是训练100次的结果、第二张图片是训练一千次的结果。

增加训练的次数可能会提高准确率,但是还需要考虑其他的因素。因为当训练次数增加时,模型对于训练数据的,损失函数值会逐渐下降,但是对于预测数据其损失函数的值是先下降再上升,这就是过拟合。
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值