深度学习之线性回归代码实现(代码详解)

线性回归从零开始

问题解读

这里要先详细解读一下我们前文提到的问题,如何实现我们的梯度下降的迭代?

我们自然是使用最最常用的BP神经网络了。它是一种按照误差逆向传播算法训练的多层前馈神经网络,是应用最广泛的神经网络模型之一 。

看起来很复杂是吧,那我们简而言之就是:前向传播,计算预测值,反向传播更新权重,不断迭代知道达到要求。

这里具体过程我就不推导了,其实很简单,大家甚至可以手算一下,可以看这个UP主的视频。

反向传播算法手算+推导,学不会你打我

另外,如何解决数据集过大的问题,那就是整一个小点的数据集呀。具体实施起来就是抽取一个小批量,它是由固定数量的训练样本组成的。 然后,我们计算小批量的平均损失关于模型参数的导数(也可以称为梯度)。

好,那么下面我们开始写代码吧(这里代码全部来自于沐神的教程)

代码详解

首先,我们定义线性回归的模型,一定要看注释!注释里啥都有!!!!!!!

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

#定义模型
net = nn.Sequential(nn.Linear(2,1))
net[0].weight.data.normal_(0,0.01)
net[0].bias.data.fill_(0)
#在PyTorch中,全连接层在Linear类中定义。 
#值得注意的是,我们将两个参数传递到nn.Linear中。 #第一个指定输入特征形状,即2,
#第二个指定输出特征形状,
#输出特征形状为单个标量,因此为1。
#初始化模型
#在使用net之前,我们需要初始化模型参数。
#深度学习框架通常有预定义的方法来初始化模型
#在这里,我们制定每个权重参数应该从均值为0,
#标准差为0.01的正态分布中随机采样
#偏置参数将初始化为0
#我们可以直接通过net[0]来制定输入参数

#定义损失函数
loss = nn.MSELoss()
#使得!你没看错,就是这么简单,就是这么方便,pytorch永远滴神!!!

#定义优化算法
trainer=torch.optim.SGD(net.parameters(),lr=0.03)
#lr也就是学习率的问题,别问为什么,问就是后面再讲
#parameters是继承自tensor的子类,
#主要作用就是作为nn.module中的可训练参数使用
#两者的区别就是它会被自动认为是module的可训练参数
#其requires_grad也是默认为true

#好了到目前为止,我们的四个组件已经有了三个,
#唯独缺少数据,但是我们也没有现成的数据,
#所以我们自己生成一点数据
true_w = torch.tensor([2,-3.4])
true_b = 4.2
features,labels = d2l.synthetic_data(true_w,true_b,1000)
#可能有人会疑惑d2l是啥
#这是李沐老师自己打包的库,主要是一堆库的集合
#可以直接用pip安装
def load_array(data_arrays, batch_size, is_train=True):  #@save
    """构造一个PyTorch数据迭代器。并打乱数据顺序"""
    dataset = data.TensorDataset(*data_arrays)
    return data.DataLoader(dataset, batch_size, shuffle=is_train)

batch_size = 10
data_iter = load_array((features, labels), batch_size)

#好!万事俱备,开训!!
num_epochs = 3
for epoch in range(num_epochs):
	    for X, y in data_iter:
        l = loss(net(X) ,y)
        trainer.zero_grad()
        l.backward()
        trainer.step()
    l = loss(net(features), labels)
    print(f'epoch {epoch + 1}, loss {l:f}')
w = net[0].weight.data
print('w的估计误差:', true_w - w.reshape(true_w.shape))
b = net[0].bias.data
print('b的估计误差:', true_b - b)
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值