pytorch实现线性回归模型

使用pytorch框架实现线性回归一共分为四步
一、Prepare dataset(准备数据集)
二、Design model using Class(使用类设计模型)
三、Construct Loss and Optimizer(构造损失函数和优化器)
四、Training Cycle(训练循环)

一、Prepare dataset(准备数据集)
这里本文使用了一个最简单的线性模型
我们假设x的值是某学生每周学习的时长,y表示最后获得的分数。

import torch
# 一、Prepare dataset
x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[2.0], [4.0], [6.0]])

张量Tensor,可以理解为一个数组,它可以是一个数(标量)、一维数组(向量)、二维数组(矩阵)和更高维的数组(高阶数据)

二、Design model using Class(使用类设计模型)

线性单元计算图

pytorch LSTM 完成回归任务 pytorch线性回归_深度学习

# 二、Design model
class LinearModel(torch.nn.Module):  # 定义一个LinearModel(所有的模型都要继承这个父类)类继承自父类nn.Module。构造模型的模板,将其定义成一个类。
    # 每个模板都要构造实现这两个方法,一个初始函数,一个前馈函数。用Module构造的函数,他会自动帮你实现反馈的过程。
    def __init__(self):
        """
        构造初始化函数
        """
        super(LinearModel, self).__init__()  # super调用父类的构造(必须要有)
        self.linear = torch.nn.Linear(1, 1)  # 构造一个线性模型对象,包含权重和偏置,这里的是指的列数。
        # ***********************************************************
        # 在小批量计算中,行表示样本数,列表示样本的维度(feature)。(但是在真正运算时,是要做转置的,即行表示feature,列表示样本数。)
        # **************************************************************

        # class torch.nn.Linear(in_features, out_features,bias=Ture)
        # y = A * x + b
        # in_features:size of each input sample
        # out_features:size of each output sample
        # bias:If set to False,the layer will learn an additive bias,Default:True

    def forward(self, x):
        """
        构造前馈函数,重写父类forward函数
        :param x:
        :return:
        """
        y_pred = self.linear(x)  # linear是一个可调用的对象
        return y_pred


# 模型实例化
model = LinearModel()  # 模型实例化,这里的model是可以被调用的

Construct Loss and Optimizer(构造损失函数和优化器

# 三、Construct Loss and Optimizer
criterion = torch.nn.MSELoss(size_average=False)  # 损失函数,用的是MSE模型(Default:将所有损失求和,然后再求均值),两个参数,第一个是否求均值,默认是求。
# **************************************************
# class torch.nn.MSELoss(size_average=True, reduce=True)
# size_average=True表示把损失求均值,一般来说,我们只考虑size_average
# reduce,表示是否要把损失求和,Default:True,降维
# **************************************************

optimizer = torch.optim.SGD(model.parameters(), lr=0.01)  # 优化器,SGD模型,lr为 学习率
# ****************************************************************************************************
# class torch.optim.SGD(params(权重), lr=<object object>, momentum=0,dampening=0, weight_decay=0, nesterov=False)
# parameters会自动检查model中的所有成员中相应的权重,会将这些权重加到训练结果上。
# lr一般来说,设置一个固定的学习率;
# ***************************************************************************************************

四、Training Cycle(训练循环)

# 四、Training Cycle
for epoch in range(1000):
    # Forward
    # 1.计算预测值
    y_pred = model(x_data)  # 计算预测值
    # 2.计算损失
    loss = criterion(y_pred, y_data)  # 计算损失
    print(epoch, loss)  # 打印代数、损失

    optimizer.zero_grad()  # 梯度归零

    # Backward
    loss.backward()  # 反向传播

    # 权重更新
    optimizer.step()  # 权重更新

以上就完成了pytorch线性回归的训练过程。最后我们打印一下训练好的权重和偏置的值。并且用训练好的模型去去测4、5、6的值。

# Output weight and bias,输出训练好的权重和偏置的值
print('w= ', model.linear.weight.item())  # weight是一个矩阵,所以要用.item()打印数值
print('b= ', model.linear.bias.item())  # bias是一个矩阵,所以要用.item()打印数值

# Test Model
x_test = torch.Tensor([[4.0], [5.0], [6.0]])
y_test = model(x_test)
print('y_pred = ', y_test.data)