d2l过拟合章节引申出多项式回归流程

动手学深度学习笔记(一)——权重衰退 权重衰减的作用机理和实现 阅读详情

在第四章节过拟合例子中,其中构造的多项式回归操作流程吸引笔者兴趣,为提升代码能力故做此博文,详细debug该操作。

核心任务:上一个softmax数据集是图片,这里数据集是随机生成数字,且利用自创多项式进行拟合!

目录

1.生成多项式

2.定义损失计算函数

3.训练函数(改正显示数值版本)

4.最终训练命令行


1.生成多项式

目标,生成如下多项式所运算的标签值数据集

具体流程代码:

max_degree = 20 # 多项式的最⼤阶数
n_train, n_test = 100, 100 # 训练和测试数据集⼤⼩
true_w = np.zeros(max_degree) # 分配⼤量的空间
true_w[0:4] = np.array([5, 1.2, -3.4, 5.6]) # 其他的全是0

features = np.random.normal(size=(n_train + n_test, 1))
np.random.shuffle(features)
poly_features = np.power(features, np.arange(max_degree).reshape(1, -1))
for i in range(max_degree):
    poly_features[:, i] /= math.gamma(i + 1) # gamma(n)=(n-1)!
# labels的维度:(n_train+n_test,)
labels = np.dot(poly_features, true_w)
labels += np.random.normal(scale=0.1, size=labels.shape)

这里为了对比,首先设置max_degree=20,在后续对比中可以取到x20次方多项式。

np.random.normal表示随机生成满足正态分布的数张量,生成了(200,1)个x点。

np.power(a,b)为计算a的b次方,例子如下所示:最后输出的是shape是(2,3),所以对一个(2,1)的张量进行一个(1,3)的power操作,讲(2,1)中的每个元素分别进行(1,3)中的指数操作,最终生成(2,3)的结果,其中1,3表示在原先的1元素对应3元素的指数次方操作。

g = np.random.normal(size=(2, 1)) 
n = np.arange(3).reshape(1,-1)
np.power(g,n), n, g

'''
(array([[ 1.        ,  0.08497032,  0.00721995],
        [ 1.        , -0.76966152,  0.59237886]]),
 array([[0, 1, 2]]),
 array([[ 0.08497032],
        [-0.76966152]]))
'''

回到这个例子中,经过power操作后,将原先的features(200,1)的xi元素进行了上述指数操作,生成的poly_features为(200,20)的向量,每一列表示对应元素对应次方,例如0,3表示features中0位置(第一个)数的3次方,即对应多项式中的x3次方!

 下一个for循环表示在多项式函数中的对指数除对应分母,如下两图所示:将poly_featrues如第一个数x的0次方,除0!,即为1,第二个数即x的1次方,除1!,即为x本身,第三个数x的2次方,除2!即为图中所示...

最终得到的是poly_features=(x^o,x,x^2/2!,x^3/3!...,x^20/20!)

 接下来进行np.dot操作,表示两个向量的内积,即(200,20)与(20)的内积 ,得到的是每一行(x^o/0!,x/1!,x^2/2!,x^3/3!...,x^20/20!)与true_w内积加和,再通过添加随机噪声,最终生成y的多项式表达式,这里相当于随机带入了满足正态分布0,1的两百个x值得到的满足上述任务多项式的200个y标签值。

再进行格式转换,将numpy转为tensor方便后续操作:

# NumPy ndarray转换为tensor
true_w, features, poly_features, labels = [torch.tensor(x, dtype=
    torch.float32) for x in [true_w, features, poly_features, labels]]

观察一下输出结果:其中[:2]表示从头读取到第2行,与[0:2]等价,表示输出前两个poly_features,每一行都是(x^o/0!,x/1!,x^2/2!,x^3/3!...,x^20/20!)

features.shape, features[:2], poly_features[:2, :], labels[:2], labels.shape

'''
(torch.Size([200, 1]),
 tensor([[0.1062],
         [0.2925]]),
 tensor([[1.0000e+00, 1.0621e-01, 5.6401e-03, 1.9967e-04, 5.3017e-06, 1.1262e-07,
          1.9935e-09, 3.0246e-11, 4.0155e-13, 4.7386e-15, 5.0328e-17, 4.8593e-19,
          4.3008e-21, 3.5137e-23, 2.6656e-25, 1.8874e-27, 1.2528e-29, 7.8271e-32,
          4.6183e-34, 2.5816e-36],
         [1.0000e+00, 2.9249e-01, 4.2774e-02, 4.1703e-03, 3.0494e-04, 1.7838e-05,
          8.6957e-07, 3.6334e-08, 1.3284e-09, 4.3171e-11, 1.2627e-12, 3.3575e-14,
          8.1835e-16, 1.8412e-17, 3.8466e-19, 7.5006e-21, 1.3711e-22, 2.3591e-24,
          3.8333e-26, 5.9010e-28]]),
 tensor([5.2388, 5.1748]),
 torch.Size([200]))
'''

2.定义损失计算函数

这里输入模型,数据集loader,损失函数,得到损失函数的平均值(总损失/样本总个数)

def evaluate_loss(net, data_iter, loss): #@save
    """评估给定数据集上模型的损失"""
    metric = d2l.Accumulator(2) # 损失的总和,样本数量
    for X, y in data_iter:
        out = net(X)
        y = y.reshape(out.shape)
        l = loss(out, y)
        metric.add(l.sum(), l.numel())
    return metric[0] / metric[1]

3.训练函数(改正显示数值版本)

这里面的mse即为1/2(y-y_hat)^2,net为很基础的全连接单层网络。

def train(train_features, test_features, train_labels, test_labels,
        num_epochs=400):
    loss = nn.MSELoss(reduction='none')
    input_shape = train_features.shape[-1]
    # 不设置偏置,因为我们已经在多项式中实现了它
    net = nn.Sequential(nn.Linear(input_shape, 1, bias=False))
    batch_size = min(10, train_labels.shape[0])
    train_iter = d2l.load_array((train_features, train_labels.reshape(-1,1)),
                                batch_size)
    test_iter = d2l.load_array((test_features, test_labels.reshape(-1,1)),
                                batch_size, is_train=False)
    trainer = torch.optim.SGD(net.parameters(), lr=0.01)

    for epoch in range(num_epochs):
        train_metrics = d2l.train_epoch_ch3(net, train_iter, loss, trainer)
        if epoch == 0 or (epoch + 1) % 20 == 0:
            print(f'训练损失{train_metrics[0]:.5f},测试损失{evaluate_loss(net, test_iter, loss):.5f}')

 这里补充下load_array函数:输入x,y两个参数,x为自变量数值,在本模型中即为除了要训练的系数之外的所有值(以下面去4各维度为例,即为poly_features的前四列),y对应的是上述目标多项式计算的labels值。

def load_array(data_arrays, batch_size, is_train=True):
    """Construct a PyTorch data iterator.

    Defined in :numref:`sec_linear_concise`"""
    dataset = data.TensorDataset(*data_arrays)
    return data.DataLoader(dataset, batch_size, shuffle=is_train)

该函数返回的是loader格式,即(bs,单个x维度),(bs,单个y维度)如下图所示:注意这个格式,y为(bs,单个y维度),这是因为在传入load_array的时候将labels进行了reshape(-1,1)操作,其原因在于这里使用的MSE损失函数,不是交叉熵!最后得到的y_hat都是二维的。

4.最终训练命令行

这是从多项式特征中选取前4个维度,即x^o/0!,x/1!,x^2/2!,x^3/3!。这里面前100行维训练,后100行为测试,取的维度越小模型越欠拟合,越大则越过拟合!

train(poly_features[:n_train, :4], poly_features[n_train:, :4],
      labels[:n_train], labels[n_train:])

5.多项式练习

  下面式子,且噪声改为0.1,常数项改为5,d取5:

n_train, n_test = 100, 100
features = np.random.normal(size=((n_train + n_test), 5))
true_w = np.ones(5) * 0.01
labels = np.dot(features, true_w) + 5
labels += np.random.normal(scale=0.1, size=labels.shape)
print(labels)

 注意,在使用np.dot计算内积的时候,要保持第一参数的列数等于第二参数的向量元素数。

 结果:符合该多项式要求

nlp-getting-started 这次是用《动手学深度学习》15.1和15.2章节的内容应用于kaggle的nlp初步入门项目。 阅读详情

相关推荐

机器学习岗笔试核心考点全解析:从数学基础到深度学习与工程素养

机器学习工程师的笔试考核,往往从数学基础与经典算法原理切入,覆盖线性代数、概率统计、最优化、逻辑回归、决策树、SVM、聚类、深度学习训练技巧与评估指标等核心知识模块。扎实的数学功底是理解模型推导的前提,而对损失函数、正则化、集成学习、BN/Dropout、AUC等概念的深度掌握,则决定了能否在工程实践中正确选型与调优。这类知识体系广泛应用于推荐系统、风控、搜索等场景,也是校招和社招笔试的高频考察范围。通过对360校招机器学习客观题合集的考点拆解,可以梳理出一套从基础概念到模型对比、从原理推导到易错陷阱的复习

weixin_33881140的博客 404

花书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) Copy to clipboard

weixin_44847372的博客 632

accumulator:累加器

累加器 累加器

【笔记】动手学深度学习-模型选择,拟合

模型选择 验证数据集:用来评估模型好坏的数据集。例如:拿出50%的训练数据。验证数据集没有参加训练,所以可以在一定程度上参数选择好坏。不要跟训练数据混在一起(常犯错误)。 测试数据集:只用一次的数据集,不能用来调参。例如:未来的考试 而我们在代码中写的test_data一般指的是验证数据集,测试数据集应该是新找的。 但是通常情况下我们是没有那么多数据来验证,所以提出了 k-折交叉验证: 将数据分为k块 Fori=1....K 使...

echo_gou的博客 1980

安检机图像处理避坑指南:从条纹校正到物质分类,那些论文里没写的工程细节

本文深入探讨了双能X射线安检机图像处理中的关键工程实践,从条纹校正到物质分类,揭示了论文中未提及的实用技巧。针对探测器校正、物质分类模糊、伪彩色系统设计等核心问题,提供了动态参数更新、空间上下文分析和自适应色彩映射等解决方案,助力提升安检系统的准确性和鲁棒性。

weixin_30325487的博客 887

解决Docker拉取镜像报错:Get https://registry-1.docker.io/v2/: 报错

解决Docker拉取镜像报错: Get “https://registry-1.docker.io/v2/”: net/http: request canceled while waiting for connection问题描述Get "https://registry-1.docker.io/v2/"是docker官方的镜像源,下载很慢的,一般会自己指定国内映射的加速镜像源。

qq_33650333的博客 4171

机器学习与模式识别 考点压缩 100%命中率

机器学习与模式识别 期末考点压缩 两天学完 力挽狂澜!

2301_80226956的博客 884

图片边界矢量化-地理配准

无地理和投影信息的JPG图片,通过ArcGIS进行地理配准(Georeferencing)完成数字化边界。

u012727861的博客 1904

李沐 d2l Accumulator理解

自定义的一个累加函数,*args传入了一个不定长的参数列表,如调用metric.add(float(l.sum()),accuracy(y_hat,y),y.numel())时,*args表示括号内的三个参数。python的特殊方法,是一种构造器,当一个实例被创建的时候被自动调用的初始化方法,即当调用 metric = Accumulator(n) 时自动调用该方法;data是一个list列表,初始化为[0.0]*n,如果n = 3,那么self.data = [0.0 , 0.0 , 0.0]

jijii123的博客 2439

从FinFET到NanoSheet:一文看懂TSMC制程技术的架构革命与性能飞跃

本文深入解析了TSMC从FinFET到NanoSheet的制程技术架构革命。FinFET通过三维立体结构解决了短沟道效应,而NanoSheet采用环绕栅极设计,实现了更强的静电控制与设计灵活性,结合EUV光刻技术,共同推动了芯片性能与能效的飞跃,为下一代AI与高性能计算奠定基石。

i3j4k5的博客 287

用Python手把手教你实现一个多层感知机(MLP)——从理论到代码实战

本文详细介绍了如何使用Python和Theano库从零开始实现多层感知机(MLP),涵盖从核心原理到代码实战的全过程。通过构建隐藏层、输出层和完整MLP模型,结合权重初始化、激活函数选择和训练技巧,帮助开发者深入理解神经网络工作机制,并应用于实际机器学习任务。

web39explorer的博客 970

沐神的小函数

沐神课中,d2l模块自定义的函数 用于从集合中随机拿出来一个小批量的批次 def data_iter(batch_size, features, labels): num_examples = len(features) indices = list(range(num_examples)) # 这些样本是随机读取的,没有特定的顺序 random.shuffle(indices) for i in range(0, num_examples, batch_size):

天下月色共三分的博客 1222

求助:有没有基于pscad的锂电池仿真模型

求助:有没有基于pscad的锂电池仿真模型 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变没有 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写...

qq_38922523的博客 1221

pytorch自学笔记——线性回归

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) #这一部分的目的是为了实现小批量梯度下降法:从数据集中取出随机的.

weixin_50774105的博客 2583

基于Transformers库的BERT模型:一个文本情感分类的实例解析

简介 本文来讲述BERT应用的一个例子,采用预训练好的BERT模型来进行演示。BERT的库来源于Transformers,这是一个由PyTorch编写的库,其集成了多个NLP领域SOTA的模型,比如bert、gpt-2、transformer xl等,并且可以自由选择已经预训练好的模型参数,我们可以基于这些参数进行进一步的训练调试。 Part 1: 利用BERT基于特征的方式进行建模 1、任务与数...

蓝天白云梦的csdn博客 2万+

【C2000系列DSP的Bootloader详解】实现过程、流程图与示例代码

C2000 Bootloader 的核心逻辑可概括为 “初始化→选模式→加载程序→校验→跳转” 五步。对于小白来说,无需纠结底层寄存器配置(驱动库已封装),重点理解 “启动流程” 和 “数据传输 + 校验” 的核心思想即可。 通过本文的流程图和示例代码,相信你已经掌握了 C2000 Bootloader 的核心原理。实际开发中,可基于 TI 提供的 Bootloader 示例(C2000Ware 中自带)进行修改,快速适配自己的硬件和应用场景。

昔时扬尘处 368

动手深度学习4——经典卷积神经网络

LeNet 先 使用卷积层来学习图片空间信息,然后使用全连接层来转换到类别空间。 AA import torch from torch import nn from d2l import torch as d2l class Reshape(torch.nn.Module): def forward(self,x): return x.view(-1,1,28,28) net = nn.Sequential( Reshape(), nn.Conv2d(

xiaoyuia的博客 4580

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

报错问题:AttributeError: module ‘d2l‘ has no attribute ‘load_array‘

问题报错

HitStuHan的博客 4968

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

d2l机器翻译数据集

两组(bs,T)+(bs);分别表示features与labels的bs个长为T的最终标号,与该bs对应的valid_lenprint('X的有效⻓度:', X_valid_len)print('Y的有效⻓度:', Y_valid_len)break'''X的有效⻓度: tensor([4, 4])Y的有效⻓度: tensor([3, 3])'''

python_innocent的博客 1173

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

softmax回归的从零开始实现

softmax回归的从零开始实现的详细代码注释

weixin_46805040的博客 2992

一些经典的神经网络(第22天)ending

常见神经网络相关和代码实现

Kunjpg的博客 1799

d2l.load_array在pycharm中安装失败问题

d2l.load_array在pycharm中安装失败问题 Dataloader load_array

HJKHUKB的博客 1803

过拟合&欠拟合模拟 || 深度学习 || Pytorch || 动手学深度学习11 || 跟李沐学AI

本文通过使用 线性回归模型 在 自己生成的数据集上 模拟 模型对数据的过拟合和欠拟 、有效说明了非正常拟合时训练损失和测试损失的变化情况

qq_46621219的博客 3203

模型选择+过拟合和拟合

【代码】模型选择+过拟合和拟合。

weixin_47626556的博客 397

经典模型LeNet跑Fashion-MNIST 代码解析

再接着跑epoch的时候调试爆了 不知道是因为cpu还是内存不够爆的 重新取消了其他断点,只点了一个。打点调试 查看卷积核的值学习过程 #net[0].weight net[3].weight。可以看出梯度更新卷积核的参数第一行第一个一看好像没变,看看第二行1198->1197 是变了。成功初始化为均值0 方差1的卷积核了。初始创建net的时候自动生成全部数据。重新的一个数据 与上面的不一样。初始化的时候init再打点。训练函数 train。初始化跳回去之后发现。

qq_36632604的博客 1156

李沐动手学深度学习4.5 正则化 权重衰退代码手动实现

学习笔记

weixin_49716548的博客 663
上一篇: d2l-softmax实现流程
下一篇: d2l房价预测与pandas文件处理
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值