使用torch求函数参数

一、先了解一下深度学习是如何优化参数的

import torch
import mathclass Polynomial3(torch.nn.Module):def __init__(self):super().__init__()self.a = torch.nn.Parameter(torch.randn(()))self.b = torch.nn.Parameter(torch.randn(()))self.c = torch.nn.Parameter(torch.randn(()))self.d = torch.nn.Parameter(torch.randn(()))def forward(self, x):return self.a + self.b * x + self.c * x**2 + self.d * x**3def string(self):return f'y = {self.a.item()} + {self.b.item()}*x + {self.c.item()}*x^2 + {self.d.item()}*x^3'x = torch.linspace(-math.pi, math.pi, 2000)
y = torch.sin(x)model = Polynomial3()loss_fn = torch.nn.MSELoss(reduction='sum')
optimizer_fn = torch.optim.SGD(model.parameters(),lr=1e-6)for t in range(1,2001):y_pred = model(x)# print(x.shape, y_pred.shape)loss = loss_fn(y_pred, y)if t % 100 == 0:print(f't = {t}, loss_value={loss.item()}')# 置零之前的梯度optimizer_fn.zero_grad()# 反向传播求参数梯度loss.backward()# 参数更新optimizer_fn.step()print(f'result: {model.string()}')

二、你已经看了一个利用torch进行参数优化的例子了,可以学会自己写参数优化的代码了

假如现在有一个函数 f ( x ) = a + b x + c x 2 f(x)=a+bx+cx^2 f(x)=a+bx+cx2,需要求出 a , b , c a,b,c a,b,c的参数。经过标注人员测试发现一组对应的 x , y x,y x,y 如下:

	x=0, y=-1x=1, y=4x=2, y=13x=3, y=26x=4, y=43x=5, y=64x=6, y=89x=7, y=118x=8, y=151x=9, y=188x=10, y=229x=11, y=274x=12, y=323x=13, y=376x=14, y=433x=15, y=494x=16, y=559x=17, y=628x=18, y=701x=19, y=778x=20, y=859x=21, y=944x=22, y=1033x=23, y=1126x=24, y=1223x=25, y=1324x=26, y=1429x=27, y=1538x=28, y=1651x=29, y=1768x=30, y=1889x=31, y=2014x=32, y=2143x=33, y=2276x=34, y=2413x=35, y=2554x=36, y=2699x=37, y=2848x=38, y=3001x=39, y=3158x=40, y=3319x=41, y=3484x=42, y=3653x=43, y=3826x=44, y=4003x=45, y=4184x=46, y=4369x=47, y=4558x=48, y=4751x=49, y=4948x=50, y=5149x=51, y=5354x=52, y=5563x=53, y=5776x=54, y=5993x=55, y=6214x=56, y=6439x=57, y=6668x=58, y=6901x=59, y=7138x=60, y=7379x=61, y=7624x=62, y=7873x=63, y=8126x=64, y=8383x=65, y=8644x=66, y=8909x=67, y=9178x=68, y=9451x=69, y=9728x=70, y=10009x=71, y=10294x=72, y=10583x=73, y=10876x=74, y=11173x=75, y=11474x=76, y=11779x=77, y=12088x=78, y=12401x=79, y=12718x=80, y=13039x=81, y=13364x=82, y=13693x=83, y=14026x=84, y=14363x=85, y=14704x=86, y=15049x=87, y=15398x=88, y=15751x=89, y=16108x=90, y=16469x=91, y=16834x=92, y=17203x=93, y=17576x=94, y=17953x=95, y=18334x=96, y=18719x=97, y=19108x=98, y=19501x=99, y=19898

2.1 写代码

import torch
import math
import numpy as npclass customModel(torch.nn.Module):def __init__(self):super().__init__()self.a = torch.nn.Parameter(torch.randn(()))self.b = torch.nn.Parameter(torch.randn(()))self.c = torch.nn.Parameter(torch.randn(()))def forward(self, x):y = self.a + self.b * x + self.c * x**2return ydef string(self):return f'y = {self.a.item()} + {self.b.item()}*x + {self.c.item()}*x^2'if __name__ == '__main__':model = customModel()x = np.array([i for i in range(100)])x = torch.tensor(x,dtype=torch.float32)y = np.array([-1 + 3*i + 2*i**2 for i in range(100)])y = torch.tensor(y,dtype=torch.float32)    # print(x.size)# for i in range(x.size):#     print(x[i], y[i])loss_fn = torch.nn.MSELoss(reduction='sum')optimizer_fn = torch.optim.AdamW(model.parameters(), lr=1e-3,weight_decay=1e-3)for t in range(1, 80001):y_pred = model(x)# print(y_pred)loss = loss_fn(y_pred, y)if t % 100 == 0:print(f't = {t}, loss_value = {loss.item()}')optimizer_fn.zero_grad()loss.backward()optimizer_fn.step()print(f'result: {model.string()}')

2.2 结果

t = 79500, loss_value = 0.3282114565372467
t = 79600, loss_value = 0.021682187914848328
t = 79700, loss_value = 0.34126701951026917
t = 79800, loss_value = 5.102657794952393
t = 79900, loss_value = 0.6290067434310913
t = 80000, loss_value = 0.4637832045555115
result: y = -0.9952965378761292 + 2.999793767929077*x + 2.0000174045562744*x^2

可以看到 s e l f . a = − 0.9952965378761292 , s e l f . b = 2.999793767929077 , s e l f . c = 2.0000174045562744 self.a=-0.9952965378761292,self.b=2.999793767929077,self.c= 2.0000174045562744 self.a=0.9952965378761292,self.b=2.999793767929077,self.c=2.0000174045562744,跟我们用来生成数据的函数 a = − 1 , b = 3 , c = 2 a=-1,b=3,c=2 a=1,b=3,c=2是非常接近的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/639099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言——内存函数介绍和模拟实现(memcpy、memmove、memset、memcmp)

之前我们讲过一些字符串函数(http://t.csdnimg.cn/ZcvCo),今天我们来讲一讲几个内存函数,那么可能有人要问了,都有字符串函数了,怎么又来个内存函数,这不是一样的么? 我们要知道之前…

第十二站(20天):C++泛型编程

模板 C提供了模板(template)编程的概念。所谓模板,实际上是建立一个通用函数或类, 其 类内部的类型和函数的形参类型不具体指定 ,用一个虚拟的类型来代表。这种通用的方式称 为模板。 模板是泛型编程的基础, 泛型编程即以一种独立于任何特定…

Java快速转Go入门案例

Golang语言在2009年诞生于谷歌,相较而言是一门年轻的语言。面对C等老牌语言众多繁重的特性,几名谷歌员工希望能够甩开历史包袱设计一门更加简洁的编程语言,避免过度的设计,通过较少的特性组合连接就可实现复杂的功能。体现“少即是…

C++面试:跳表

目录 跳表介绍 跳表的特点: 跳表的应用场景: C 代码示例: 跳表的特性 跳表示例 总结 跳表(Skip List)是一种支持快速搜索、插入和删除的数据结构,具有相对简单的实现和较高的查询性能。下面是跳表…

巨变!如何理解中国发起的“数据要素X”计划?

作者 张群(赛联区块链教育首席讲师,工信部赛迪特聘资深专家,CSDN认证业界专家,微软认证专家,多家企业区块链产品顾问)关注张群,为您提供一站式区块链技术和方案咨询。 刘烈宏在第25届北大光华新…

自定义shell工具函数之echo_red()和prepare_check_required_pkg()

两个 bash 函数,echo_red 和 prepare_check_required_pkg,它们在 shell 脚本中使用。下面是每个函数的解释: echo_red 函数 function echo_red() {echo -e "\033[1;31m$1\033[0m" }这个函数的目的是输出红色的文本到终端。它接受…

职业规划,软件开发工程师的岗位任职资格

软件工程师是指从事软件开发的人,主要的工作涉及到项目培训和项目设计两个方面。在实际工作中,软件工程师是一个广义的概念,包括了很多与软件相关的人员。除开最基础的编程语言,还有数据库语言等等。从事这份工作,需要…

记录一下uniapp 集成腾讯im特别卡(已解决)

uniapp的项目运行在微信小程序 , 安卓 , ios手机三端 , 之前这个项目集成过im,不过版本太老了,0.x的版本, 现在需要添加客服功能,所以就升级了 由于是二开 , 也为了方便 , 沿用之前的webview嵌套腾讯IM的方案 , 选用uniapp集成ui ,升级之后所有安卓用户反馈点击进去特别卡,几…

【cucumber】学习跟踪

本文章主要跟踪cucumber自动化测试的学习进度,并且统计文章目录: 【cucumber】cluecumber-report-plugin生成测试报告-CSDN博客

openssl3.2 - 官方demo学习 - test - certs - 001 - Primary root: root-cert

文章目录 openssl3.2 - 官方demo学习 - test - certs - 001 - Primary root: root-cert概述笔记官方原版.sh实验自己来分3步走做实验my_openssl_log_001_doc_1.txtmy_openssl_log_001_doc_2.txtmy_openssl_log_001_doc_3.txt备注END openssl3.2 - 官方demo学习 - test - certs …

Java设计模式之观察者模式详解

Java设计模式之观察者模式详解 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,我们将一同深入探讨Java设计模式之观察者模式,这是一种代…

HR人才测评,如何做技术研发人员基本素质测评?

技术研发人员的基本素质测评,可以从以下几个方面考虑: 1. 技术能力:首要的因素是技术能力,包括编程能力、算法能力、架构设计能力、代码调试和优化能力等。在测评中可以通过技术测试、编程练习、项目经验等方式来考察。 2. 学习…

微前端:一种新型的前端架构方法

微前端是一种新型的前端架构方法,它将单页面应用程序拆分为一系列小型、独立的应用程序。本文将介绍微前端的背景、概念、特点、应用场景和与其他前端架构的对比,以帮助读者更好地理解微前端的概念和实践。 一、引言 随着Web应用程序的复杂性和规模不断…

Java - 深入理解加密解密和签名算法

文章目录 应用的接口安全性问题可能来源加密解密Why保护数据隐私防止未经授权的访问防止数据泄露 对称加密 VS 单向加密 VS 非对称加密一、对称加密二、单向加密(哈希加密)三、非对称加密 常用的对称加密算法1. AES(高级加密标准)…

Django从入门到精通(二)

目录 三、视图 3.1、文件or文件夹 3.2、相对和绝对导入urls 3.3、视图参数requests 3.4、返回值 3.5、响应头 3.6、FBV和CBV FBV 四、静态资源 4.1、静态文件 4.2、媒体文件 五、模板 5.1、寻找html模板 5.2、模板处理的本质 5.3、常见模板语法 5.4、内置模板函…

【DevOps-08-5】目标服务器准备脚本,并基于Harbor的最终部署

一、简要描述 告知目标服务器拉取哪个镜像判断当前服务器是否正在运行容器,停止并删除如果目标服务器已经存在当前镜像,删除当前版本的镜像目标服务器拉取Harbor上的镜像将拉取下来的镜像运行成容器二、准备目标服务器脚本文件 1、在部署的目标服务器准备deploy.sh部署脚本 …

点云从入门到精通技术详解100篇-基于点云和图像融合的智能驾驶目标检测(中)

目录 2.1.2 数据源选型分析 2.2 环境感知系统分析 2.2.1 传感器布置方案分析

对称密码算法有什么优点

对称密码算法是一种加密和解密数据的方法,其中加密和解密使用相同的密钥。这种方法的一个关键特点是加密和解密的速度非常快,因此它在许多需要高速加密的应用中非常有用。 对称密码算法的优点主要在于其效率和安全性。由于加密和解密使用相同的密钥&…

自定义注解与拦截器实现不规范sql拦截(拦截器实现篇)

最近考虑myBatis中sql语句使用规范的问题,如果漏下条件或者写一些不规范语句会对程序性能造成很大影响。最好的方法就是利用代码进行限制,通过拦截器进行sql格式的判断在自测环节就能找到问题。写了个简单情景下的demo,并通过idea插件来将myB…

UE5 Windows打包时报错“SDK Not Found”解决方案

在Unreal Engine 5.0.3 Windows平台下打包时报错:“Windows的SDK未正常安装,而其是生成数据的必需项。请检查主工具栏中“启动“菜单SDK部分来更新SDK。” 解决方案: 1、打开 Visual Studio Installer,点击“修改”按钮&#xf…