Loading

Pytorch 实现线性回归

 

Pytorch很简单,分为5步骤,准备数据-》选择模型-》选择损失函数-》确定优化器-》训练模型

​
 

import torch

# -----------准备数据-----------
#           y=2*x+1
#下面注释中的是错误数据
# x = torch.Tensor([1, 2, 3])
# y = torch.Tensor([3, 5, 7])

#数据必须是按照列算,一个样本一行,数据维度(3*1) ,特征维度(1维特征)
x = torch.Tensor([[1],[2],[3]])
y = torch.Tensor([[3], [5], [7]])

# -----------选择模型-----------
# 模型定义为一个类而不是一个方法
# 模型继承自  torch.nn.Module
class LinearModel(torch.nn.Module):
    # 构造函数:进行初始化工作,必须实现
    def __init__(self):
        # 调用父类的构造,参数分别为:本类名称,self
        super(LinearModel, self).__init__()
        # 实例化一个线性对象,参数是输入特征得维度,输出特征的维度,是否要bias
        self.linear = torch.nn.Linear(in_features=1, out_features=1)

    # 前馈函数:必须实现,反馈函数自动实现
    # 因为,实例化这个类时,就会调用__call__*() 方法,而这个方法
    # 就写死了一定会调用forward这个方法,所以forward必须覆盖
    def forward(self, x):
        y_pred = self.linear(x)  # y=wx+b
        return y_pred


# 实例化LinearModel(),它是可以callable的  model(x)
model = LinearModel()
# -----------损失函数 -----------
# 实例化最小二乘法损失函数,继承自module critertion参数(y_pre,y)
critertion = torch.nn.MSELoss(size_average=True)
# -----------优化器--------------
# 随机梯度下降,参数传入  LinearModel的权重 ,学习率
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
# -----------训练模型------------
for epoch in range(1000):
    # 将数据传入模型,调用__call__,调用forward()
    y_pred = model(x)
    # 计算损失,loss是对象,值是标量
    loss = critertion(y_pred, y)
    print(epoch, loss)

    # 梯度归零
    optimizer.zero_grad()
    # 对损失函数反向传播(为了求梯度)
    loss.backward()
    # 使用优化器进行梯度更新
    optimizer.step()

# 要不要item()都可以
print('w=', model.linear.weight.item())
print('b=', model.linear.bias.item())
x_test = torch.Tensor([[4]])
y_test = model(x_test)
print('y_test=', y_test.data)

​

 

posted @ 2021-05-29 11:14  cheney-pro  阅读(143)  评论(0编辑  收藏  举报