使用Pytorch来拟合函数方式_python

来源:脚本之家  责任编辑:小易  

1、首先,我们打开excel,然后在里面输入一组数据;2、然后我们在-5那个单元格后面输入:=ABS(((B2)^2*2)+4),需要提醒的是:这是个固定的公式;3、然后我们按回车键,得到答案54,之后下拉得到其他答案;4、我们点击插入,点击折线图中的下拉箭头,点击二维折线图;5、弹出的界面,我们就可以看到函数的曲线了;www.zgxue.com防采集请勿采集本网。

其实各大深度学习框架背后的原理都可以理解为拟合一个参数数量特别庞大的函数,所以各框架都能用来拟合任意函数,Pytorch也能。

在matlab中根据拟合图得到函数步骤如下: 1、常用的模型有多项式模型、幂函数模型、指数函数模型等。2、设出函数,用命令“plot”绘出图像作为对比。3、准备好散点数据,用命令“plot”绘出散点

在这篇博客中,就以拟合y = ax + b为例(a和b为需要拟合的参数),说明在Pytorch中如何拟合一个函数。

c=lsqcurvefit(fun,c0,x,y);曲线拟合。已知数据x、y和函数类型fun,但函数参数c未知,调用lsqcurvefit后可以求出函数参数c。其中c0是自己选的初始值,c0选得好就计算快一点。其原理是最小二乘,

一、定义拟合网络

Excel只能拟合线性、多项式、指数、对数、乘幂等几种函数,不能拟合正弦函数。如果只需要近似拟合,可以利用Excel的公式计算功能,新增一列y=a*sin(wt+Φ)+b 自己根据经验调整a、w、Φ、b,

1、观察普通的神经网络的优化流程

用wps表格来拟合的步骤:1、分两列输入你的数据,比如在A列输入x,B列输入y;2、选中两列数据点,点击“插入”-“图表”钮,出现“图表类型”对话框;3、在“图表类型”中选择“散点图”,按

# 定义网络net = ...# 定义优化器optimizer = torch.optim.Adam(net.parameters(), lr=0.001, weight_decay=0.0005)# 定义损失函数loss_op = torch.nn.MSELoss(reduction='sum')# 优化for step, (inputs, tag) in enumerate(dataset_loader): # 向前传播 outputs = net(inputs) # 计算损失 loss = loss_op(tag, outputs) # 清空梯度 optimizer.zero_grad() # 向后传播 loss.backward() # 更新梯度 optimizer.step()

求拟合zhidao函数,首先要有因变量和自变量的一组测试或实验数据,根据已知的曲线y=f(x),拟合出Ex和En系数。当用拟合出的函数与实验数据回吻合程度愈高,说明拟合得到答的Ex和En系数是合理的。

上面的代码就是一般情况下的流程。为了能使用Pytorch内置的优化器,所以我们需要定义一个一个网络,实现函数parameters(返回需要优化的参数)和forward(向前传播);为了能支持GPU优化,还需要实现cuda和cpu两个函数,把参数从内存复制到GPU上和从GPU复制回内存。

基于以上要求,网络的定义就类似于:

class Net: def __init__(self): # 在这里定义要求的参数 pass def cuda(self): # 传输参数到GPU pass def cpu(self): # 把参数传输回内存 pass def forward(self, inputs): # 实现向前传播,就是根据输入inputs计算一遍输出 pass def parameters(self): # 返回参数 pass

在拟合数据量很大时,还可以使用GPU来加速;如果没有英伟达显卡,则可以不实现cuda和cpu这两个函数。

2、初始化网络

回顾本文目的,拟合: y = ax + b, 所以在__init__函数中就需要定义a和b两个参数,另外为了实现parameters、cpu和cuda,还需要定义属性__parameters和__gpu:

def __init__(self): # y = a*x + b self.a = torch.rand(1, requires_grad=True) # 参数a self.b = torch.rand(1, requires_grad=True) # 参数b self.__parameters = dict(a=self.a, b=self.b) # 参数字典 self.___gpu = False # 是否使用gpu来拟合

要拟合的参数,不能初始化为0! ,一般使用随机值即可。还需要把requires_grad参数设置为True,这是为了支持向后传播。

3、实现向前传播

def forward(self, inputs): return self.a * inputs + self.b

非常的简单,就是根据输入inputs计算一遍输出,在本例中,就是计算一下 y = ax + b。计算完了要记得返回计算的结果。

4、把参数传送到GPU

为了支持GPU来加速拟合,需要把参数传输到GPU,且需要更新参数字典__parameters:

def cuda(self): if not self.___gpu: self.a = self.a.cuda().detach().requires_grad_(True) # 把a传输到gpu self.b = self.b.cuda().detach().requires_grad_(True) # 把b传输到gpu self.__parameters = dict(a=self.a, b=self.b) # 更新参数 self.___gpu = True # 更新标志,表示参数已经传输到gpu了 # 返回self,以支持链式调用 return self

参数a和b,都是先调用detach再调用requires_grad_,是为了避免错误raise ValueError("can't optimize a non-leaf Tensor")(参考:ValueError: can't optimize a non-leaf Tensor?)。

4、把参数传输回内存

类似于cuda函数,不做过多解释。

def cpu(self): if self.___gpu: self.a = self.a.cpu().detach().requires_grad_(True) self.b = self.b.cpu().detach().requires_grad_(True) self.__parameters = dict(a=self.a, b=self.b) self.___gpu = False return self

5、返回网络参数

为了能使用Pytorch内置的优化器,就要实现parameters函数,观察Pytorch里面的实现:

def parameters(self, recurse=True): r"""... """ for name, param in self.named_parameters(recurse=recurse): yield param

实际上就是使用yield返回网络的所有参数,因此本例中的实现如下:

def parameters(self): for name, param in self.__parameters.items(): yield param

完整的实现将会放在后面。

二、测试

1、生成测试数据

def main(): # 生成虚假数据 x = np.linspace(1, 50, 50) # 系数a、b a = 2 b = 1 # 生成y y = a * x + b # 转换为Tensor x = torch.from_numpy(x.astype(np.float32)) y = torch.from_numpy(y.astype(np.float32))

2、定义网络

# 定义网络 net = Net() # 定义优化器 optimizer = torch.optim.Adam(net.parameters(), lr=0.001, weight_decay=0.0005) # 定义损失函数 loss_op = torch.nn.MSELoss(reduction='sum')

3、把数据传输到GPU(可选)

# 传输到GPU if torch.cuda.is_available(): x = x.cuda() y = y.cuda() net = net.cuda()

4、定义优化器和损失函数

如果要使用GPU加速,优化器必须要在网络的参数传输到GPU之后在定义,否则优化器里的参数还是内存里的那些参数,传到GPU里面的参数不能被更新。 可以根据代码来理解这句话。

# 定义优化器 optimizer = torch.optim.Adam(net.parameters(), lr=0.001, weight_decay=0.0005) # 定义损失函数 loss_op = torch.nn.MSELoss(reduction='sum')

5、拟合(也是优化)

# 最多优化20001次 for i in range(1, 20001, 1): # 向前传播 out = net.forward(x) # 计算损失 loss = loss_op(y, out) # 清空梯度(非常重要) optimizer.zero_grad() # 向后传播,计算梯度 loss.backward() # 更新参数 optimizer.step() # 得到损失的numpy值 loss_numpy = loss.cpu().detach().numpy() if i % 1000 == 0: # 每1000次打印一下损失 print(i, loss_numpy) if loss_numpy < 0.00001: # 如果损失小于0.00001 # 打印参数 a = net.a.cpu().detach().numpy() b = net.b.cpu().detach().numpy() print(a, b) # 退出 exit()

6、完整示例代码

# coding=utf-8from __future__ import absolute_import, division, print_functionimport torchimport numpy as npclass Net: def __init__(self): # y = a*x + b self.a = torch.rand(1, requires_grad=True) # 参数a self.b = torch.rand(1, requires_grad=True) # 参数b self.__parameters = dict(a=self.a, b=self.b) # 参数字典 self.___gpu = False # 是否使用gpu来拟合 def cuda(self): if not self.___gpu: self.a = self.a.cuda().detach().requires_grad_(True) # 把a传输到gpu self.b = self.b.cuda().detach().requires_grad_(True) # 把b传输到gpu self.__parameters = dict(a=self.a, b=self.b) # 更新参数 self.___gpu = True # 更新标志,表示参数已经传输到gpu了 # 返回self,以支持链式调用 return self def cpu(self): if self.___gpu: self.a = self.a.cpu().detach().requires_grad_(True) self.b = self.b.cpu().detach().requires_grad_(True) self.__parameters = dict(a=self.a, b=self.b) # 更新参数 self.___gpu = False return self def forward(self, inputs): return self.a * inputs + self.b def parameters(self): for name, param in self.__parameters.items(): yield paramdef main(): # 生成虚假数据 x = np.linspace(1, 50, 50) # 系数a、b a = 2 b = 1 # 生成y y = a * x + b # 转换为Tensor x = torch.from_numpy(x.astype(np.float32)) y = torch.from_numpy(y.astype(np.float32)) # 定义网络 net = Net() # 传输到GPU if torch.cuda.is_available(): x = x.cuda() y = y.cuda() net = net.cuda() # 定义优化器 optimizer = torch.optim.Adam(net.parameters(), lr=0.001, weight_decay=0.0005) # 定义损失函数 loss_op = torch.nn.MSELoss(reduction='sum') # 最多优化20001次 for i in range(1, 20001, 1): # 向前传播 out = net.forward(x) # 计算损失 loss = loss_op(y, out) # 清空梯度(非常重要) optimizer.zero_grad() # 向后传播,计算梯度 loss.backward() # 更新参数 optimizer.step() # 得到损失的numpy值 loss_numpy = loss.cpu().detach().numpy() if i % 1000 == 0: # 每1000次打印一下损失 print(i, loss_numpy) if loss_numpy < 0.00001: # 如果损失小于0.00001 # 打印参数 a = net.a.cpu().detach().numpy() b = net.b.cpu().detach().numpy() print(a, b) # 退出 exit()if __name__ == '__main__': main()

以上这篇使用Pytorch来拟合函数方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持真格学网。

“内联函数的输入数目太多。的错误,就是输出变量 benifit 与输入变量 beta不对应。其二,nlinfit('x','yy','@myfun',beta0)中的x,yy,@myfun不需要用单引号。应按下列形式更改为beta=nlinfit(x,yy,@myfun,beta0);更改后运行,发现还是有问题。经分析,对于此拟合问题用nlinfit()函数来拟合是不合适的。应改用lsqcurvefit()函数来拟合。改为lsqcurvefit()后,其运行结果a1=-116.8532,a2=9.5642,a3=2.0633,a4=-93.4984内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • pytorch 的损失函数loss function使用详解
  • 基于pytorch的保存和加载模型参数的方法
  • 对pytorch的函数中的group参数的作用介绍
  • python docx 中文字体设置的操作方法
  • python3实现弹弹球小游戏
  • python实现顺时针打印矩阵
  • python石头剪刀布小游戏(三局两胜制)
  • python实现决策树c4.5算法的示例
  • python qqbot 实现qq机器人的示例代码
  • python 利用turtle模块画出没有角的方格
  • 在pycharm下打包*.py程序成.exe的方法
  • python编写计算器功能
  • python爬虫入门教程--利用requests构建知乎api(三)
  • matlab中拟合函数nlinfit的使用,为什么说“内联函数的输入数目太多。”
  • 怎么用EXCEL曲线拟合二次函数
  • 指数函数拟合
  • 怎样利用EXCEL进行曲线拟合
  • 在matlab中如何根据拟合图得到函数?
  • matlab里除了cftool用什么命令可以做正弦函数拟合?
  • 如何用excel做正弦函数的拟合?或者还有什么软件可以?
  • excel表格拟合函数怎么用
  • 指数函数拟合
  • matlab画散点图并拟合函数曲线
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全vbsdos/bathtahtcpythonperl游戏相关vba远程脚本coldfusionruby专题autoitseraphzonepowershelllinux shellluagolangerlang其它首页pythonpytorch 的损失函数loss function使用详解基于pytorch的保存和加载模型参数的方法对pytorch的函数中的group参数的作用介绍python docx 中文字体设置的操作方法python3实现弹弹球小游戏python实现顺时针打印矩阵python石头剪刀布小游戏(三局两胜制)python实现决策树c4.5算法的示例python qqbot 实现qq机器人的示例代码python 利用turtle模块画出没有角的方格在pycharm下打包*.py程序成.exe的方法python编写计算器功能python爬虫入门教程--利用requests构建知乎api(三)python入门教程 超详细1小时学会python 列表(list)操作方法详解python 元组(tuple)操作详解python 字典(dictionary)操作详解pycharm 使用心得(一)安装和首python strip()函数 介绍python 中文乱码问题深入分析python科学计算环境推荐——anacpython逐行读取文件内容的三种方python中使用xlrd、xlwt操作exce详解python静态网页爬取获取高清壁纸深入理解python中的 __new__ 和 __init__python cookbook(字符串与文本)在字符串的python合并多个装饰器小技巧python数据分析数据标准化及离散化详解django+js 实现点击头像即可更改头像的方用python删除java文件头上版权信息的方法python+opencv识别两张相似图片python爬取内容存入excel实例利用imageai库只需几行python代码实现目标
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved