PyTorch深度学习实践(五)用PyTorch实现线性回归

①准备数据集
②设计模型
③构造损失函数和优化器
④训练周期:前馈反馈更新,前馈算损失,反馈算梯度,用梯度下降算法更新权重

准备数据

在这里插入图片描述

设计模型

在这里插入图片描述在这里插入图片描述在这里插入图片描述

PyTorch定义模型

①首先把模型定义成一个类

③构造损失函数和优化器
训练过程:先算y^ ,再算损失,这两个叫前馈,然后是后向传播,更新

构造损失函数和优化器

代码展现

import torch
x_data=torch.Tensor([[1.0],[2.0],[3.0]])#构建数据集
y_data=torch.Tensor([[2.0],[4.0],[6.0]])
class LinearModel(torch.nn.Module):#括号里面表示继承类
    def __init__(self):#构造函数
        super(LinearModel,self).__init__()#调用父类的构造
        self.linear=torch.nn.Linear(1,1)
        #torch.nn.Linear是pyTorch里面的一个类,加了括号就是实例化对象,包含了权重和偏置两个张量  
        #可以直接用Linear完成 权重*输入+偏置的计算
        #Linear也是继承自Module,所以可以自动进行反向传播
        #nn:Neural Network神经网络
        #linear是由Linear实例化得到的
    def forward(self,x):
        y_pred=self.linear(x)
        return y_pred
    #构造函数用于初始化对象, forward是前馈过程中需要执行的计算,没有backward,这是因为
    #Module构造的对象会根据你的计算图自动实现backward
model=LinearModel()#用模型的时候这样调用,也可以传入参数x,x就送入forward函数,计算出y_pred
criterion=torch.nn.MSELoss(size_average=False)#构造损失函数
#MSELoss需要有y,y_pred,然后构造计算,用MSELoss的共识算出来是一个向量,再把向量求和,最后得出标量的损失值
#MSELoss的计算过程也要构建计算图,只要是需要构建计算图,就应该是继承自Module,MSELoss继承自nn.Module
#size_average=False表示得到的损失不求均值
optimizer=torch.optim.SGD(model.parameters(),lr=0.01)#构造优化器
#优化器不会构建计算图 torch.optim.SGD是一个类,带了参数就是实例化了这个类
#model.parameters()会检查model里面所有的成员,如果成员里面有相应的权重,就把这些都加到最后训练的参数集合上
#lr是学习率,当模型比较复杂,pyTorch还支持对模型的不同部分使用不同的学习率,w=w-lr*(损失对权重的导数)

#训练过程
for epoch in range(100):
    y_pred=model(x_data)#先在前馈里面算出y_pred
    loss=criterion(y_pred,y_data)#算损失
    print(epoch,loss.item())#loss是一个对象是标量,打印的时候会自动调用__str__(),不会产生计算图
    
    optimizer.zero_grad()#进行训练的时候梯度归零
    loss.backward()#反向传播
    optimizer.step()#更新,step函数用于更新,会根据所有参数里面所包含的梯度以及预先设置的学习率进行更新
#output weight and bias
#print('w=',model.linear.weight.item())
print('w = ', model.linear.weight.item()) 
print('b=',model.linear.bias.item())
#Test model
x_test=torch.Tensor([4.0])#测试模型输入的是1*1的矩阵
y_test=model(x_test)
print('y_pred=',y_test.data)

结果展示

0 35.011505126953125
1 16.0350284576416
2 7.5807881355285645
3 3.810842514038086
4 2.1263022422790527
5 1.3702154159545898
6 1.0275384187698364
...........
...........
95 0.20996397733688354
96 0.20694677531719208
97 0.2039722204208374
98 0.20104095339775085
99 0.19815167784690857
w =  1.7036596536636353
b= 0.6736512780189514
y_pred= tensor([7.4883])

结果分析

在100次迭代中,第100次,损失是0.198,w,b没有达到最理想的值,最理想情况下,w=2,b=0(可以观察我们的输入数据分布得到)
预测值 y_pred=7.4,实际值应为8,说明我们的训练还没有收敛
加大训练次数,比如加到1000次迭代,如下图,得到的结果更加理想
在这里插入图片描述
真正训练的时候不仅要观察训练集上损失减少到什么程度,还要观察测试集上损失有没有升上去(因为有的时候测试集上面的损失会随着迭代次数增加会增大,说明过拟合了)

2000次迭代
在这里插入图片描述
以下都是pytoch里面提供的优化器
在这里插入图片描述

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值