pytorch非线性回归调参分享

前期研究过程中获得了一个非常奇怪的函数图像,打算用多层感知机(MLP)对函数图像进行建模仿真。前期相关研究中,MLP表现并不好,当时把这个方案已经放弃掉了。经过查阅相关的论文,发现原理上MLP能够拟合任意函数。这段时间重新写了一遍MLP网络,经过参数、增加训练次数、GPU加速,现在能够对函数较好拟合。现将代码分享一下。为方便展示,数据集改成了sin函数。

目标功能:对三个周期的sin(x)函数进行拟合
训练效果:

这个图像中,蓝色为数据集,红色为对其拟合的训练结果。Loss表示两个函数之间的均方根误差。程序改编自

pyTorch非线性回归代码实现 作者ID胸毛飘荡

import torch
import numpy as np
import matplotlib.pyplot as plt
import torch.nn as nn
from torch.autograd import Variablex_tensor = torch.linspace(0, 6*np.pi, 10000)        #创建一个输入数据集,[0-6*pi]
x_data = torch.unsqueeze(x_tensor, dim=1)           #增加维度,将x的形状从[10000]变成二维[10000,1]
y_data = torch.sin(x_data)                          #待拟合的标签值,此处可以添加部分噪声
# plt.figure("查看数据集是否正确")
# plt.scatter(x_data, y_data)
# plt.ion()
# plt.show()
# 定义超参数
D_in = 1                                            #输入维度1
D_out = 1                                           #输出维度1
H1 = 100                                            #中间隐藏层  100个神经元
train_step = 100000                                 #训练次数10e5次
#定义新激活函数swish(x) = x * sigmod(x),作为一个类
class Act_op(nn.Module):def __init__(self):super(Act_op, self).__init__()def forward(self, x):x = x * torch.sigmoid(x)return x
swish = Act_op()                                    #类的实例化
'''
对于下面的神经网络定义层的类,初始化输入参数为D_in,H1,H2,D_out
H1代表第一个隐藏层的神经元个数
H2代表第二个隐藏层的神经元个数
目前程序中使用的神经网络只有H1一个隐藏层,调试过程中曾经尝试过增加隐藏层的个数
clamp(min=0)是relu激活函数比较简洁的表达方式
swish(x)方法表示 x*sigmod(x)这个激活函数
'''
class TwolayerNet(torch.nn.Module):def __init__(self, D_in, H1, D_out):super(TwolayerNet, self).__init__()self.linear1 = torch.nn.Linear(D_in, H1)self.linear2 = torch.nn.Linear(H1, D_out)def forward(self, X):y_pred = self.linear2(swish(self.linear1(X)))return y_pred
net = TwolayerNet(D_in, H1, D_out)              #类的实例化
optimizer = torch.optim.Adam(net.parameters(), lr=0.0005)
loss_func = torch.nn.MSELoss()                      #优化器为adam,损失loss函数为MESloss
plt.figure("regression")                            #新建一张画布,打印数据点和预测值
plt.ion()                                           #交互模式
if torch.cuda.is_available():                       #将模型搬移到GPU执行print("GPU1")net = net.cuda()
else:print("CPU")for step in range(train_step):if torch.cuda.is_available():                   #将数据点搬移到GUP执行inputs = Variable(x_data).cuda()target = Variable(y_data).cuda()else:inputs = Variable(x_data)target = Variable(y_data)# 调用搭建好的神经网络模型,得到预测值prediction = net(inputs)# 用定义好的损失函数,得出预测值和真实值的lossloss = loss_func(prediction, target)# 每次都需要把梯度将为0optimizer.zero_grad()# 误差反向传递loss.backward()# 调用优化器进行优化,将参数更新值施加到 net 的 parameters 上optimizer.step()if step % 100 == 0:# 清除当前座标轴plt.cla()plt.scatter(x_data.data.numpy(), y_data.data.numpy())# r- 是红色 lw 是线宽plt.plot(x_data.data.numpy(), prediction.data.cpu().numpy(), 'r-', lw=5)'''给图形添加标签,0.5, 0 表示X轴和Y轴坐标,'Loss=%.4f'%loss.data.numpy()表示标注的内容,.4f表示保留小数点后四位fontdict是设置字体大小和颜色'''plt.text(0.5, 0, 'Loss=%.4f'%loss.data.cpu().numpy(), fontdict={'size':20, 'color': 'red'})# 间隔多久再次进行绘图plt.pause(0.1)if step % 1000 == 0:print(str(step/1000)+'   Loss=%.4f'%loss.data.cpu().numpy())


网络结构如上所示:输入一个参数,输出一个参数,中间有一个隐藏层,隐藏层有神经元100个。在测试程序过程中曾将尝试将隐藏层的层数增加,但是较容易出现提前收敛的情况。

激活函数并没有使用常用的sigmod函数、tanh函数和relu函数,参考论文与网上经验使用了新提出的swish函数。这个函数与relu函数类似,有下界但是无上界。比relu函数优越性在于它处处连续。函数图像如下所示
在计算中使用了CUDA加速。训练时间会快一点。假设设备上没有CUDA设备,那也可以直接用CPU进行运算。

pytorch拟合sin函数相关推荐

  1. 【pytorch】拟合sin函数

    我们使用指数函数 y=a+bx+cx3+dx5y=a+bx+cx^3+dx^5 y=a+bx+cx3+dx5 来拟合三角函数sin函数 y=sin(x)y=sin(x) y=sin(x) 由泰勒公式也 ...

  2. jittor拟合sin函数

    import numpy as np import matplotlib.pyplot as pltimport jittor as jt x_tensor = np.linspace(0, 6*np ...

  3. 一文理解 pytorch 拟合网络的过程

    下面给一个小的例子,比如我们待拟合的函数是 y = 5*x,(假设你对深度学习有基础,懂损失函数之类的,没有的话建议看完再继续),则我们需要一堆的x以及对应labbel,比如(x,label) = ( ...

  4. LSTM模型预测sin函数详解

    注解: fun_data()函数生成训练数据和标签,同时生成测试数据和测试标签HIDDEN_SIZE = 128,使用128维的精度来定义LSTM的状态和输出精度,就是LSTM中的h,c lstm_m ...

  5. 用python画分段函数图像_使用Python拟合分段函数

    我试图用Numpy来拟合分段函数和绝对值.在 数学函数是 x&lt:p[1]:y=1+p[0]*abs((size+x-p[1])/size-size/2) x&gt:=p[1]:y= ...

  6. 利用BP神经网络逼近sin函数

    利用神经网络逼近sin函数 代码被改得面目全非就不贴了,思路很简单,(1,5,1)的网络,从-pi到pi取1000个点,单个往网络里扔,误差值直接用预测与真实值差值决定,保留正负号,正常求导,速率0. ...

  7. 利用keras搭建神经网络拟合非线性函数

    神经网络有着一个非常奇妙的结构,它的数学原理虽然相对简单,但是能做的事情却不少,数学家已经证明,具有2层(输入层除外)和非线性激活函数的神经网络,只要在这些层中有足够多的神经元,就可以近似任何函数(严 ...

  8. 趋势预测方法(二)其他函数拟合_函数拟合

    其它函数拟合 a基本原理: 给出公式的大致情况,自动去拟合出最优的参数.这里的其它指的是除多项式以外的拟合情况,包括三角函数.对数,以及一些复杂的复合函数. b拟合原理: 总体思路类似于最小二乘法的拟 ...

  9. python编程入门与案例详解课后题答案-Python入门之三角函数sin()函数实例详解

    描述 sin()返回的x弧度的正弦值. 语法 以下是sin()方法的语法: importmath math.sin(x) 注意:sin()是不能直接访问的,需要导入math模块,然后通过math静态对 ...

最新文章

  1. spring20:Aspectj实现前置通知@Before
  2. 实验23:测试泛型依赖注入★
  3. akae-arm9异常
  4. android辅助功能模拟home键,Android launcher中模拟按home键的实现
  5. kafka通过零拷贝实现高效的数据传输
  6. express项目创建
  7. 不显示调用super_让不懂编程的人爱上iPhone开发(2017秋iOS11+Swift4+Xcode9版)-第11篇
  8. 多线程的那点儿事(之优先级反转)
  9. JVM stack与Heap的区别
  10. Nachos 用户进程地址分配
  11. redis实战(1):redis三个java客户端选择
  12. 26个字母大小写的ASCII码值
  13. 帆软报表列表_报表软件FineReport各类函数大全
  14. python实验总结_python实训总结和体会_python实训心得体会 - CSDN
  15. CV:计算机视觉技最强学习路线
  16. FPGA设计开发软件ISE使用技巧之:片上逻辑分析仪(ChipScope Pro)使用技巧
  17. win10查看Nvidia显卡、cuda版本
  18. CSS中Display(显示)和Visibility(可见)
  19. python批处理栅格转点_三种利用Python批量处理地理数据的方法——以栅格数据投影转换为例...
  20. obs有没有android版本,Obsbot Studio app

热门文章

  1. 四. H.264视频编解码器(X264和JM)及参考软件JM的下载与编解码
  2. unity_pojie
  3. python实现对前程无忧的信息的爬取
  4. Unity 网络视频教程第一讲
  5. Linux编译mplayer播放badapple及编译fbv加载图片(基于V3S预告板子要开源了)
  6. php正则匹配input,正则表达式 - php正则匹配p标签及带特定的中文
  7. day13_雷神_前端01
  8. 【软件工程总复习】第三章 需求分析(结构化分析)(数据分析)
  9. 图像灰度化的三种常见方法源码
  10. 欧盟加密资产市场监管法案(Markets in Crypto Assets Regulation Bill,MiCAR法案)内容概览