使用pyTorch实现线性回归

使用pyTorch实现线性回归

线性回归神经网络中只有一个神经元,相对基础,入门必备

步骤

了解线性回归的步骤就好理解pyTorch实现的过程了
pyTorch实现神经网络的步骤:
1.准备数据集
2.构建模型 :也叫设计使用类,其继承自模型线性模型(nn.Module)其实也就是一个线性方程
3.构造损失函数和优化器:这里也没什么好说的,其计算都是用封装好了的函数,直接调pyTorch的API就行。这里的优化器可以认为是寻找最佳权重的算法,比如梯度下降
4.写训练周期:前馈、反馈、更新权重(反向传播)

代码实现

把模型定义成一个类,
1.模型继承自父类torch.nn.Module,这个父类中有很多方法,以后训练模型会用到的
2.目前是线性的,也就是最基础的,最少要实现两个函数,即__init__和forward(必须是这两个名字),这也是所以模型都必要的基础函数
__init__函数是构造函数,即初始化对象需要默认调用的函数,forward是前馈过程中要进行的计算,这里没有backward是因为继承自父类的module方法中有自动计算了

**后话:**要用模块pytorch没有定义,或者说没办法对它求导数

法1:如果这个计算模块可由基础的pytorch运算模块构成,可以把他们封装成一个module,然后要用的时候就实例化,调用,他会自动计算反向传播
法2:如果感觉pyTorch中计算图计算效率不高,计算有高效的方法,可以继承pyTorch里面的Fuctions类**,但是自己去设计计算反向传播的导数计算**,可以在Functions中构造自己的计算块,
可知如果能用pytorch基本计算模块构成,为了简单一般选择法1,这样不用自己设计计算反向传播

具体代码

注意这里训练轮数epoch,这里设置的是1000,太小的话模型不能收敛,但是太大的话模型就会过拟合,过拟合也是机器学习里面主要要解决的问题,所以增大训练轮数要注意。

import torch

# prepare dataset
# x,y是矩阵,3行1列 也就是说总共有3个数据,每个数据只有1个特征
x_data = torch.tensor([[1.0], [2.0], [3.0]])
y_data = torch.tensor([[2.0], [4.0], [6.0]])

# design model using class

class LinearModel(torch.nn.Module):
    def __init__(self):
        super(LinearModel, self).__init__()
        # (1,1)是指输入x和输出y的特征维度,这里数据集中的x和y的特征都是1维的
        # 该线性层需要学习的参数是w和b  获取w/b的方式分别是~linear.weight/linear.bias
        self.linear = torch.nn.Linear(1, 1)

    def forward(self, x):
        # 这里self.linear(x)与前面self.linear可以知道,由torch.nn.Linear(1, 1)所实现的类是可调用的(callable)
        # 就是这个类里面定义了一个__call__的子函数,只要把该类传参调用,就会实现__call__里面的内容
        # y_pred其实就是y_hat,self.linear直接得到y_hat
        y_pred = self.linear(x)
        return y_pred


model = LinearModel()

# construct loss and optimizer
# 必要参数:torch.nn.MSELoss(size_average = False,reduce = True)
# size_average参数意思是先对得到的损失值是否要求均值,一般不需要
criterion = torch.nn.MSELoss(reduction='sum')
# 参数优化器类实现,传入参数model.parameters()可以自动寻找未知参数,比如w、b,
# lr是学习率
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)  # model.parameters()自动完成参数的初始化操作

# 第四步也是最后一步————training circle

# training cycle forward, backward, update
# epoch为训练轮数
for epoch in range(1000):
    y_pred = model(x_data)  # forward:predict
    loss = criterion(y_pred, y_data)  # forward: loss
    print(epoch, loss.item())

    optimizer.zero_grad() # 梯度归零,防止迭代
    loss.backward()  # backward: autograd,自动计算梯度
    optimizer.step()  # update 参数,即更新w和b的值

# 打印训练得到的参数,取item就是取标量,因为其是矩阵
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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值