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(使用类设计模型)
线性单元计算图
# 二、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)