《动手深度学习》 线性回归从零开始实现实例

这篇具有很好参考价值的文章主要介绍了《动手深度学习》 线性回归从零开始实现实例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


本文是《动手深度学习》线性回归从零开始实现实例的实现和分析。

一、代码实现

实现代码如下所示。

# random 模块 调用 random() 方法返回随机生成的一个实数,值在[0,1)范围内
import random
# 机器学习框架 pythorch,类似于 TensorFlow 和 Keras
import torch
'''
线性回归函数 y = Xw + b + e(噪音)
'''

'''
一系列封装的函数
'''
# 批量获取数据函数
def synthetic_data(w, b, num_examples):
    # 生成 y=Xw+b+噪声
    '''
    返回一个张量,张量里面的随机数是从相互独立的正态分布中随机生成的
    参与 1: 均值
    参与 2: 标准差
    参数 3: 张量的大小 [num_examples, len(w)]
    '''
    X = torch.normal(0, 1, (num_examples, len(w)))  # [1000, 2]
    # torch.matmul 两个张量元素相乘
    y = torch.matmul(X, w) + b  # [1000, 1]
    # 加上噪声
    y += torch.normal(0, 0.01, y.shape)
    return X, y.reshape((-1, 1))   # X [1000, 2] y [1000, 1]

# 随机批量取数据函数
def data_iter(batch_size, features, labels):
    num_examples = len(features)
    # 生成存储值 0 ~ num_examples 值的列表,不重复
    indices = list(range(num_examples))
    # 在原列表 indices 中随机打乱所有元素
    random.shuffle(indices)
    # range() 第三个参数是步长
    for i in range(0, num_examples, batch_size):
        batch_indices = torch.tensor(
            indices[i: min(i + batch_size, num_examples)])
        # yield 相当于不断的 return 的作用
        yield features[batch_indices], labels[batch_indices]

# 计算预测值,网络模型
def linreg(X, w, b):
    # 线性回归模型
    return torch.matmul(X, w) + b

# 计算损失
def squared_loss(y_hat, y):
    # 均方损失
    return (y_hat - y.reshape(y_hat.shape)) ** 2 / 2    # 1/2 * (y1 - y)^2

# 梯度更新
def sgd(params, lr, batch_size):
    # 小批量随机梯度下降
    with torch.no_grad():
        for param in params:
            param -= lr * param.grad / batch_size
            param.grad.zero_() # 清除 param 的梯度值为 0

'''
主要步骤:
1. 生成数据集;
2. 初始化 w 和 b,线性回归函数 y = Xw + b + e(噪音);
3. 训练模型。
'''


'''
1. 生成数据集
包含 1000 条数据,每条 [x1, x2] [1000, 2]
'''
# 用于生成数据临时的 true_w 和 true_b
# 张量 tensor是一个可以运行在 GPU 上的多维数据
true_w = torch.tensor([2, -3.4])
true_b = 4.2
features, labels = synthetic_data(true_w, true_b, 1000)
# features: [1000, 2], labels: [1000, 1]

'''
2. 初始化 w 和 b
w: 2 x 1, b: [0]
'''
# requires_grad 在计算中保留梯度信息
# normal() 返回一个张量,均值是0,方差是0.01的 [2,1] 张量
w = torch.normal(0, 0.01, size=(2,1), requires_grad=True)
# 初始化张量为全零
b = torch.zeros(1, requires_grad=True)

'''
3. 开始训练
'''
# 设置超参数 学习率
lr = 0.03
# 设置超参数 训练批次/迭代周期
num_epochs = 3
# 设置超参数 每次训练的数据量
batch_size = 10

# 重命名函数
net = linreg
loss = squared_loss

'''
with torch.no_grad():
在使用 pytorch 时,并不是所有的操作都需要进行计算图的生成(计算过程的构建,以便梯度反向传播等操作)。
而对于 tensor 的计算操作,默认是要进行计算图的构建的,在这种情况下,可以使用 with torch.no_grad():,
强制之后的内容不进行计算图构建。
'''

for epoch in range(num_epochs): # num_epochs 个迭代周期
    for X, y in data_iter(batch_size, features, labels): # 每次随机取 10 条数据一起训练  X [10, 2] y [10, 1]
        l = loss(net(X, w, b), y)  # X 和 y 的小批量损失,计算损失   Xw + b = y1
        l.sum().backward() # 损失求和后,根据构建的计算图,计算关于[w,b]的梯度,反向传播算法一定要是一个标量才能进行计算,所以进行 sum 操作后 backward
        sgd([w, b], lr, batch_size)  # 使用参数的梯度更新参数
    # 不自动求导
    with torch.no_grad():
        train_l = loss(net(features, w, b), labels) # 使用更新后的 [w, b] 计算所有训练数据的 loss
        print(f'epoch {epoch + 1}, loss {float(train_l.mean()):f}') # 通过 mean 函数取平均值
        print('w = ', w, 'b = ', b)


二、实现解析

2.1 参数和超参数

参数是需要通过训练来得到的结果,最常见的就是神经网络的权重 W 和 b。训练模型的目的就是要找到一套好的模型参数,用于预测未知的结果。这些参数我们是不用调的,是模型来训练的过程中自动更新生成的。

超参数是我们控制我们模型结构、功能、效率等的 调节旋钮,常见超参数:

(1)learning rate(学习率)

(2)epochs(迭代次数,也可称为 num of iterations)

(3)num of hidden layers(隐层数目)

(4)num of hidden layer units(隐层的单元数/神经元数)

(5)activation function(激活函数)

(6)batch-size(用mini-batch SGD的时候每个批量的大小)

(7)optimizer(选择什么优化器,如SGD、RMSProp、Adam)

(8)用诸如RMSProp、Adam优化器的时候涉及到的β1,β2等等

2.2 模型训练

整体的模型训练思路如下所示。

1. 数据集生成,包括:训练数据、测试数据;

2. 初始化参数 w 和 b;

3. 训练模型,设置超参数,开始训练模型;

参考链接:

深度学习中的超参数调节(learning rate、epochs、batch-size...) - 知乎

loss.sum().backward()中对于sum()的理解


🎈 感觉有帮助记得「一键三连支持下哦!有问题可在评论区留言💬,感谢大家的一路支持!🤞猿哥将持续输出「优质文章回馈大家!🤞🌹🌹🌹🌹🌹🌹🤞文章来源地址https://www.toymoban.com/news/detail-680108.html


到了这里,关于《动手深度学习》 线性回归从零开始实现实例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 机器学习&&深度学习——线性回归的从零开始实现

    机器学习&&深度学习——线性回归的从零开始实现

    虽然现在的深度学习框架几乎可以自动化实现下面的工作,但从零开始实现可以更了解工作原理,方便我们自定义模型、自定义层或自定义损失函数。 根据带有噪声的线性模型构造一个人造数据集。任务是使用这个数据集来恢复模型的参数。我们使用低维数据,可以更容易地

    2024年02月15日
    浏览(9)
  • 李沐《动手学深度学习》线性神经网络 线性回归

    李沐《动手学深度学习》线性神经网络 线性回归

    李沐《动手学深度学习》预备知识 张量操作及数据处理 李沐《动手学深度学习》预备知识 线性代数及微积分 教材:李沐《动手学深度学习》 线性回归基于的 假设 : 假设自变量和因变量之间的关系是线性的,这里通常允许包含观测值的一些噪声; 假设任何噪声都比较正常

    2024年01月21日
    浏览(21)
  • 【AI】《动手学-深度学习-PyTorch版》笔记(八):线性回归

    线性函数如下: y ^ = w 1 x 1 + . . . + w d x d

    2024年02月14日
    浏览(17)
  • 人工智能-线性回归的从零开始实现

    人工智能-线性回归的从零开始实现

    在了解线性回归的关键思想之后,我们可以开始通过代码来动手实现线性回归了。 在这一节中,我们将从零开始实现整个方法, 包括数据流水线、模型、损失函数和小批量随机梯度下降优化器。 虽然现代的深度学习框架几乎可以自动化地进行所有这些工作,但从零开始实现

    2024年02月08日
    浏览(17)
  • 机器学习&&深度学习——线性回归的简洁实现

    👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习深度学习——线性回归的从零开始实现 📚订阅专栏:机器学习深度学习 希望文章对你们有所帮助 由于数据迭代器、损失函数、优化器以及神经网络很常用,现代深度学习库也为我们实现了

    2024年02月15日
    浏览(8)
  • 深度学习之用PyTorch实现线性回归

    深度学习之用PyTorch实现线性回归

    1.1 epoch = 100时 1.2 epoch = 1000时   2.1 Adam优化器    2.2 Adamax优化器  3.1 lr = 0.05  3.2 lr = 0.1(loss函数结果发散) 1.1 问题  1.2 解决办法 代码中model.parameters()函数保存的是Weights和Bais参数的值。但是对于其他网络(非线性)来说这个函数可以用吗,里面也是保存的w和b吗?

    2024年02月14日
    浏览(13)
  • 机器学习&&深度学习——RNN的从零开始实现与简洁实现

    机器学习&&深度学习——RNN的从零开始实现与简洁实现

    👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习深度学习——循环神经网络RNN 📚订阅专栏:机器学习深度学习 希望文章对你们有所帮助 我们将在之前所说的《时光机器》数据集上训练,先读取数据集: 回想一下,在train_iter中,每个词

    2024年02月13日
    浏览(15)
  • 33- PyTorch实现分类和线性回归 (PyTorch系列) (深度学习)

    33- PyTorch实现分类和线性回归 (PyTorch系列) (深度学习)

    知识要点  pytorch 最常见的创建模型 的方式, 子类 读取数据: data = pd.read_csv (\\\'./dataset/credit-a.csv\\\', header=None) 数据转换为tensor: X = torch .from_numpy(X.values).type(torch.FloatTensor) 创建简单模型: 定义损失函数: loss_fn = nn.BCELoss () 定义优化器: opt = torch.optim.SGD (model.parameters(), lr=0.00001) 把梯度

    2024年02月06日
    浏览(10)
  • 【深度学习】TensorFlow实现线性回归,代码演示。全md文档笔记(代码文档已分享)

    【深度学习】TensorFlow实现线性回归,代码演示。全md文档笔记(代码文档已分享)

    本系列文章md笔记(已分享)主要讨论深度学习相关知识。可以让大家熟练掌握机器学习基础,如分类、回归(含代码),熟练掌握numpy,pandas,sklearn等框架使用。在算法上,掌握神经网络的数学原理,手动实现简单的神经网络结构,在应用上熟练掌握TensorFlow框架使用,掌握神经

    2024年02月21日
    浏览(14)
  • 《动手学深度学习》——线性神经网络

    《动手学深度学习》——线性神经网络

    参考资料: 《动手学深度学习》 样本: n n n 表示样本数, x ( i ) = [ x 1 ( i ) , x 2 ( i ) , ⋯   , x d ( i ) ] x^{(i)}=[x^{(i)}_1,x^{(i)}_2,cdots,x^{(i)}_d] x ( i ) = [ x 1 ( i ) ​ , x 2 ( i ) ​ , ⋯ , x d ( i ) ​ ] 表示第 i i i 个样本。 预测: y ^ = w T x + b hat{y}=w^Tx+b y ^ ​ = w T x + b 表示单个样本的预

    2024年02月12日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包