08 线性回归 + 基础优化算法-P3:线性回归的简洁实现

在过去的几年里,出于对深度学习强烈的兴趣, 许多公司、学者和业余爱好者开发了各种成熟的开源框架。 这些框架可以自动化基于梯度的学习算法中重复性的工作。 在 3.2节中,我们只运用了: (1)通过张量来进行数据存储和线性代数; (2)通过自动微分来计算梯度。 实际上,由于数据迭代器、损失函数、优化器和神经网络层很常用, 现代深度学习库也为我们实现了这些组件。

介绍如何通过使用深度学习框架来简洁地实现 3.2节中的线性回归模型。

1.生成数据集

import numpy as np
import torch
from torch.utils import data
from d2l import torch as d2l

true_w = torch.tensor([2,-3.4])
true_b = 4.2
features,labels = d2l.synthetic_data(true_w,true_b,1000)

2.读取数据集

def load_array(data_arrays,batch_size, is_train = True): #创造pytorch的数据迭代器
    dataset = data.TensorDataset(*data_arrays) #创造数据集
    return data.DataLoader(dataset,batch_size,shuffle=is_train) #要不要随机打乱顺序,在training中当然需要随机打乱顺序


batch_size = 10
data_iter = load_array((features,labels),batch_size)
#构造这样的intert出来
next(iter(data_iter))
#通过next函数得到x和y

3.定义模型

 我们首先定义一个模型变量net,它是一个Sequential类的实例。 Sequential类将多个层串联在一起。 当给定输入数据时,Sequential实例将数据传入到第一层, 然后将第一层的输出作为第二层的输入,以此类推。 在下面的例子中,我们的模型只包含一个层,因此实际上不需要Sequential。 但是由于以后几乎所有的模型都是多层的,在这里使用Sequential会让你熟悉“标准的流水线”。


#使用框架的预定义好的层
#nn是神经网络的缩写
from torch import nn
#nn是大量定义好的层
net = nn.Sequential(nn.Linear(2,1)) #唯一要制定的是输入输出的维度,这里输入=1,输出=1,把数据存在Sequential里面

4.初始化模型函数+定义损失函数loss function+定义优化算法

#初始化模型参数,把w和b先变成0
net[0].weight.data.normal_(0,0.01)
net[0].bias.data.fill_(0)

#计算均方误差用的是MSELoss类,也成为平方范数
loss = nn.MSELoss()


#实例化 SGD
trainer = torch.optim.SGD(net.parameters(),lr=0.03) #net.parameters就是拿出模型里的所有参数, lr是自己定义的学习率

5.训练模型

num_epochs = 3
for epoch in range(num_epochs):
    for X,y in data_iter:
        l = loss(net(X),y) #和之前不一样的地方是,net自带了模型参数,不需要把虚假的w和b放进去
        trainer.zero_grad() #先把梯度清零
        l.backward() #做backward
        trainer.step() #调用step函数来做模型更新
    l = loss(net(features),labels) #做完一个epoch以后把所有的feature和label放进函数里
    print(f'epoch {epoch + 1},loss{l:f}')

最终结果:

epoch 1,loss0.000188
epoch 2,loss0.000095
epoch 3,loss0.000094

loss在越变越小

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值