sin函数拟合
目录
一、 目的... 1
二、 模型设计... 1
2.1 输入与输出.... 1
2.2 隐藏层设计.... 1
2.3 优化算法与损失函数.... 1
2.4 神经网络结构.... 1
三、 训练... 1
3.1 数据生成.... 2
3.2 训练过程.... 2
3.3 训练参数与设置.... 2
四、 测试与分析... 2
4.1 选取不同激活函数.... 2
4.2 增加偏置.... 3
... 4
4.3 减少训练量.... 4
4.4 损失曲线分析.... 4
4.5 模型预测分析.... 5
五、 代码... 5
- 目的
通过构建一个简单的三层神经网络,模拟正弦函数 y = sin(2πx) 的映射关系,并使用 PyTorch 框架进行训练与优化,即输入x后会产生一个和正弦函数相同结果的y。
- 模型设计
2.1 输入与输出
本研究中的神经网络模型包括输入层、隐藏层和输出层。输入层包含一个神经元,用于接收单一的自变量 x。输出层同样包含一个神经元,输出模型计算得到的结果 y,即预测的正弦值。
2.2 隐藏层设计
网络的隐藏层包含 10 个神经元。此设计旨在增强网络的非线性表达能力,使其能够准确模拟正弦函数的波动特性。激活函数选择了 Tanh(双曲正切函数),该函数的输出范围为 [-1, 1],更符合正弦波的输出特性,相较于 Sigmoid 函数,Tanh 能更有效地模拟正弦波的起伏。
2.3 优化算法与损失函数
模型使用 Adam 优化器 进行训练。Adam 优化器结合了动量和自适应学习率,能够有效加速收敛并避免梯度消失或爆炸的情况。在损失函数的选择上,本研究使用了 均方误差(MSE)损失函数,该函数能衡量网络输出与目标正弦值之间的差异,并通过最小化损失函数来优化网络参数。
2.4 神经网络结构
模型的具体结构如下:
输入层 | 1 个神经元,用于接收输入 x |
隐藏层 | 10 个神经元,激活函数为 Tanh |
输出层 | 1 个神经元,输出拟合的正弦值 |
- 训练
3.1 数据生成
为了进行模型训练,首先生成了 x 和 y 的训练数据,其中 x 在区间 [0, 1) 内均匀分布,步长为 0.01,生成 100 个数据点。对应的 y 值则通过正弦函数 y = sin(2πx) 计算得到。这些数据用于训练神经网络,使其学习到 x 与 y 之间的映射关系。
3.2 训练过程
本研究采用 随机梯度下降法(SGD) 结合 Adam 优化器 对模型进行训练。训练的核心目标是最小化均方误差损失函数,以不断调整神经网络的权重和偏置。在每次迭代中,网络通过前向传播计算输出,通过反向传播计算梯度,并利用 Adam 优化器更新网络参数。训练过程的停止条件为最大迭代次数 10,000 次,损失值逐渐趋于稳定。
3.3 训练参数与设置
训练过程中使用的主要参数如下:
学习率 | 0.001,优化器的学习率设置为 0.001 |
迭代次数 | 最大迭代次数设置为 10,000 次 |
损失函数 | 均方误差(MSE)损失函数 |
优化器 | Adam 优化器 |
- 测试与分析
- 选取不同激活函数
如图 1和图 2所示,在本模型中,我们选择使用 Tanh 激活函数而非 Sigmoid 函数,主要是因为二者的输出范围与正弦函数的特性不匹配。Sigmoid 函数的输出范围是 (0, 1),无法有效表示正弦函数的负值部分,而正弦函数的输出范围是 [-1, 1],且具有周期性的波动。相对而言,Tanh 激活函数的输出范围为 [-1, 1],更符合正弦函数的特性,能够同时表示正负值,从而使得神经网络能够更有效地拟合正弦波的起伏。因此,选择 Tanh 激活函数有助于模型更准确地模拟正弦函数。
|
|
- 增加偏置
如图 3所示,在神经网络中,增加偏置项可以显著提升模型的拟合能力。偏置项允许每个神经元在计算时具有一个额外的自由度,使得网络能够更好地适应数据的分布。在没有偏置项的情况下,神经元的输出完全依赖于输入的加权和,限制了模型的表达能力。加入偏置项后,神经元的输出不再局限于零点,能够对输入数据进行更灵活的平移,从而更准确地捕捉到数据的特征。在拟合正弦函数的任务中,增加偏置项使得网络能够更有效地模拟正弦波的起伏,改善了拟合的效果,减少了偏差,提升了模型的预测精度。
|
- 减少训练量
减少训练的 epoch 数量可能导致模型出现欠拟合,因为模型没有足够的时间来学习数据的特征,从而无法有效捕捉到数据的复杂模式。。虽然减少 epoch 数量可以节省计算资源,但这往往以牺牲模型的表现为代价。
|
- 损失曲线分析
训练过程中,损失曲线的变化呈现出明显的规律性。初期,损失值较高,说明模型尚未有效学习到正弦函数的特性。随着训练的进行,损失逐渐下降,表明模型在不断优化,逐步逼近最优解。最终,损失曲线趋于平稳,接近最小值,表明模型已经学习到了数据中的规律,达到了收敛状态。
- 模型预测分析
通过对比模型的预测值与原始数据,可以看出,预测值与实际正弦函数的值非常接近,表明模型已成功模拟了正弦函数的行为。在可视化图中,红色的点表示预测值,蓝色的点表示实际值,两者几乎完全重合,进一步验证了模型在函数拟合任务中的高效性和准确性。
- 代码
核心代码 | |
介绍:这段代码是使用 Python 编写的,主要利用了 PyTorch 和 NumPy 库来训练一个简单的神经网络模型进行数据拟合。训练过程中的损失值会被记录并展示出来,同时还会展示模型预测结果与原始数据的对比图。 | |
| import torch |
| import torch.nn as nn |
| import numpy as np |
| import matplotlib.pyplot as plt |
| import os |
| os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE" # 忽略重复的库文件警告 |
| class Network(nn.Module): |
| def __init__(self, n_in, n_hidden, n_out): |
| super().__init__() |
| self.layer1 = nn.Linear(n_in, n_hidden, bias=False) |
| self.layer2 = nn.Linear(n_hidden, n_out, bias=False) |
| def forward(self, x): |
| x = self.layer1(x) |
| x = torch.tanh(x) # 使用 Tanh 激活函数 |
| return self.layer2(x) |
| def generate_data(start=0.0, end=1.0, step=0.01): |
| """生成训练数据""" |
| x = np.arange(start, end, step) |
| y = np.sin(2 * np.pi * x) |
| return x.reshape(len(x), 1), y.reshape(len(y), 1) |
| def train_model(model, x, y, criterion, optimizer, num_epochs=10000): |
| """训练模型并返回训练过程中的损失值""" |
| loss_values = [] |
| for epoch in range(num_epochs): |
| y_pred = model(x) # 前向传播 |
| loss = criterion(y_pred, y) # 计算损失 |
| loss.backward() # 反向传播 |
| optimizer.step() # 更新参数 |
| loss_values.append(loss.item()) # 保存损失值 |
| optimizer.zero_grad() # 清空梯度 |
| # 每100次打印一次损失值 |
| if epoch % 100 == 0: |
| print(f'After {epoch} iterations, the loss is {loss.item()}') |
| return loss_values |
| def plot_results(x, y, h, loss_values, num_epochs): |
| """绘制原始数据、预测数据和训练损失曲线""" |
| fig, axs = plt.subplots(1, 2, figsize=(14, 6)) # 一行两列的子图布局 |
| # 第一个子图:原始数据与预测数据的散点图 |
| axs[0].scatter(x, y, label='Original Data') |
| axs[0].scatter(x, h, label='Predicted Data', color='r') |
| axs[0].set_title("Model Prediction vs Original Data") |
| axs[0].legend() |
| # 第二个子图:训练损失曲线 |
| axs[1].plot(range(num_epochs), loss_values, label='Loss Curve') |
| axs[1].set_xlabel('Epochs') |
| axs[1].set_ylabel('Loss') |
| axs[1].set_title('Training Loss') |
| axs[1].legend() |
| plt.tight_layout() # 自动调整子图间距 |
| plt.show() |
| if __name__ == '__main__': |
| # 生成数据 |
| x, y = generate_data() |
| x = torch.Tensor(x) |
| y = torch.Tensor(y) |
| # 初始化模型、损失函数和优化器 |
| model = Network(1, 10, 1) |
| criterion = nn.MSELoss() # 均方误差损失函数 |
| optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # Adam优化器 |
| # 训练模型 |
| loss_values = train_model(model, x, y, criterion, optimizer, num_epochs=10000) |
| # 获取预测值 |
| h = model(x).detach().numpy() # 获取模型输出并转为numpy数组 |
| x = x.detach().numpy() # 获取输入数据 |
| # 调用绘图函数 |
| plot_results(x, y, h, loss_values, num_epochs=10000) |
相关文章:
sin函数拟合
目录 一、 目的... 1 二、 模型设计... 1 2.1 输入与输出.... 1 2.2 隐藏层设计.... 1 2.3 优化算法与损失函数.... 1 2.4 神经网络结构.... 1 三、 训练... 1 3.1 数据生成.... 2 3.2 训练过程.... 2 3.3 训练参数与设置.... 2 四、 测试与分析... 2 4.1 选取不同激活函数....…...
设置Mysql5.6允许外网访问
设置mysql用户支持外网访问步骤: 需要使用root权限登录mysql,更新mysql.user表,设置指定用户的Host字段为%,默认一般为127.0.0.1或者localhost。 1.登录数据库 1 mysql -u root -p 输入密码 1 mysql> use mysql; 2.查询hos…...
【随笔】一次JS和python中的MD5加密的记录
// 使用CryptoJS进行MD5加密和Base64编码 const sign CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(CryptoJS.MD5(sign2encrypt).toString()));上面这段JS和下面这个python等价 def hash_and_encode(input_string):sign2encrypt input_string# 使用 hashlib 进行 …...
力扣 二叉树的中序遍历
用了递归遍历,关于树的经典例题。 题目 递归 常规做法即递归了,不会写也得背下来。递归可以大致理解方法调用自身,先写中序遍历递归的方法,递归一定要有递归出口,当遍历到节点为空时返回,即已经找到了。…...
uniapp学习(010-3 实现H5和安卓打包上线)
零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战,开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第114p-116p的内容 文章目录 H5配置文件设置开始打包上传代码 安卓设置模拟器启动设置基础配置设置图标启动界面…...
基于DHCP,ACL的通信
该问题为华为的学习资料 1.首先把所有的PC机全部设置为DHCP 2.配置地址 3.ospf 4.dhcp 5.acl AR1 dhcp en interface GigabitEthernet0/0/0ip address 192.168.1.254 255.255.255.0 dhcp select global interface GigabitEthernet0/0/1ip address 10.1.12.1 255.255.255.…...
金融租赁系统助力企业升级与风险管理的新篇章
内容概要 在当今的商业环境中,“金融租赁系统”可谓是企业成功的秘密武器。简单来说,这个系统就像一位聪明的财务顾问,帮助企业在资金和资源的运用上达到最优化。从设备采购到项目融资,它提供了一种灵活的方式,让企业…...
linux安装部署mysql资料
安装虚拟机 等待检查完成 选择中文 软件选择 网络和主机名 开始安装 设置root密码 ADH-password 创建用户 等待安装完成 重启 接受许可证 Centos 7 64安装完成 安装mysql开始 Putty连接指定服务器 在 opt目录下新建download目录 将mysql文件传到该目录下 查看linux服务器的…...
深入理解 MongoDB:一款灵活高效的 NoSQL 数据库
在现代应用程序开发中,数据存储技术已经从传统的关系型数据库(RDBMS)扩展到多样化的 NoSQL 数据库。MongoDB 作为一款广泛使用的文档型数据库,以其灵活性、高性能和易用性成为开发者的首选之一。本篇博文将从 MongoDB 的核心概念、…...
爆改老旧笔记本---将笔记本改造为家用linux服务器
爆改老旧笔记本---将笔记本改造为家用linux服务器 linux启动盘制作镜像文件分区类型:MBR分区和GPT分区的定义MBR分区(Master Boot Record)GPT分区(GUID Partition Table)应用场景和优势MBR的应用场景和优势GPT的应用场景和优势 Li…...
RocketMQ MQTT Windows10 环境启动
RocketMQ MQTT Windows10 环境启动 参考环境和软件版本下载资源启动RocketMQ启动RocketMQ MQTT 参考 https://blog.csdn.net/weixin_43114058/article/details/140043257 https://blog.csdn.net/yangxiaovip/article/details/138355443 环境和软件版本 操作系统:…...
sd webui整合包怎么安装comfyui
环境: sd webui整合包 comfyui 问题描述: sd webui整合包怎么安装comfyui 扩展安装不成功 解决方案: 1.直接下载 ,解压到SD文件夹里(或者git拉一下) 2.ComfyUI模型共享:如果本机部署过Webui,那么ComfyUI可以与WebUI公用一套模型,防止复制大量模型浪费空间 将…...
Edify 3D: Scalable High-Quality 3D Asset Generation
Deep Imagination Research | NVIDIA 目录 一、Abstract 二、核心内容 1、多视图扩散模型 3、重建模型: 4、数据处理模块: 三、结果 1、文本到 3D 生成结果 2、图像到 3D 生成结果 3、四边形网格拓扑结构 一、Abstract NVIDIA 开发的用于高质量…...
鸿蒙HarmonyOS学习笔记(6)
定义扩展组件样式:Extend装饰器 在前文的示例中,可以使用Styles用于样式的重用,在Styles的基础上,我们提供了Extend,用于扩展原生组件样式。 说明 从API version 9开始,该装饰器支持在ArkTS卡片中使用。 从…...
蓝桥杯备赛笔记(一)
这里的笔记是关于蓝桥杯关键知识点的记录,有别于基础语法,很多内容只要求会用就行,无需深入掌握。 文章目录 前言一、编程基础1.1 C基础格式和版本选择1.2 输入输出cin和cout: 1.3 string以下是字符串的一些简介:字符串…...
在Java中使用Apache POI导入导出Excel(二)
本文将继续介绍POI的使用,上接在Java中使用Apache POI导入导出Excel(一) 使用Apache POI组件操作Excel(二) 14、读取和重写工作簿 try (InputStream inp new FileInputStream("workbook.xls")) { //Inpu…...
linux 中后端jar包启动不起来怎么回事 -bash: java: 未找到命令
一、用以下命令检查jdk版本 输入:java -version,如果JDK 环境变量没有配置,你会看到如下提示 二、配置jdk环境 1.先找到/etc/profile文件,然后在该文件最后面加上以下配置 export JAVA_HOME/usr/local/jdk-21.0.1 export PATH$…...
六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序
本章讲述数据结构中的六大排序算法 欢迎大佬们踊跃讨论,感谢大家支持! 我的博客主页链接 六大排序算法 一.插入排序1.1 直接插入排序1.2 希尔排序 二.选择排序2.1 单向选择排序2.2双向选择排序2.3 堆排序 三.交换排序3.1 冒泡排序3.2 快速排序3.2.1 Hoa…...
快速排序(C++实现)
基本思想 任取一个元素为中心,所有比它小的元素一律前放,比他大的元素一律后放,形成左右两个子表;对各子表重新选择中心元素并依此规则调整,直到每个子表的元素只剩一个。 通过一趟排序,将待排序记录分割成…...
【数据库知识】数据库关系代数表达式
文章目录 概述一、关系代数表达式的基本组成部分二、关系代数运算符及其使用样例三、关系代数表达式的优化四、总结 概述 数据库关系代数表达式是关系数据库系统查询语言的理论基础,它使用一系列符号和运算符来描述从一个或多个关系(即表)中…...
linux系统清理全部python环境并重装
提问 centos系统清理全部python环境并重装,并且使用宝塔。 解答 要在CentOS系统中彻底清理Python3环境,可以遵循以下步骤: 卸载Python3 使用rpm命令卸载所有与Python3相关的包。这个命令会查询所有已安装的与python3相关的rpm包…...
Servlet的介绍
Servlet是Java Web的核心组件,它是一个运行在服务器端的Java程序,用于接收客户端的请求、处理请求并返回响应。Servlet遵循特定的生命周期,包括初始化、服务、销毁等阶段。 生命周期: init():初始化Servlet实例&#x…...
DICOM医学影像应用篇——伪彩色映射 在DICOM医学影像中的应用详解
目录 引言 伪彩色映射的概念 基本原理 查找表(Look-Up Table, LUT) 步骤 示例映射方案 实现伪彩色映射的C代码 代码详解 伪彩色处理效果展示 总结 扩展知识 LUT 的基本概念 LUT 在伪彩色映射中的应用 示例 引言 在医学影像处理中,…...
(超详细图文详情)Navicat 配置连接 Oracle
1、下载依赖文件 Oracle官网下载直链:https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html 夸克网盘下载(oracle19c版本):https://pan.quark.cn/s/5061e690debc 官网下载选择对应 Oracle 版…...
PyTorch:神经网络的基本骨架 nn.Module的使用
神经网络的基本骨架 nn.Module的使用 为了更全面地展示如何使用 nn.Module 构建一个适用于现代图像处理任务的卷积神经网络(CNN),我们将设计一个针对手写数字识别(如MNIST数据集)的简单CNN模型。CNN非常适合处理图像数…...
学习threejs,使用CubeCamera相机创建反光效果
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️CubeCamera 立方体相机 二、…...
Linux网络——IO模型和多路转接
通常所谓的IO,其本质就是等待通信和进行通信,即IO 等 拷贝。 那么想要做到高效的IO,就要在单位时间内,减少“等”的比重。 一.五种IO模型 阻塞 IO: 在内核将数据准备好之前, 系统调用会一直等待. 所有的套接字, 默认都是阻塞方…...
【计网】自定义序列化反序列化(二) —— 实现网络版计算器【上】
🌎 实现网络版计算器【上】 文章目录: 实现网络版计算器【上】 自定义协议 制定自定义协议 Jsoncpp序列化反序列化 Json::Value类 Jsoncpp序列化 Jsoncpp反序列化 自定义协议序列化反序列化 …...
数据结构2:顺序表
目录 1.线性表 2.顺序表 2.1概念及结构 2.2接口实现 1.线性表 线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串 线性表在逻辑上是线性结构,也就说…...
python学习——元组
在 Python 中,元组(tuple)是一种内置的数据类型,用于存储不可变的有序元素集合。以下是关于 Python 元组的一些关键点: 文章目录 定义元组1. 使用圆括号 ()2. 使用 tuple() 函数3. 使用单个元素的元组4. 不使用圆括号…...
wordpress隐私提示/企业推广宣传方式
在使用MyBatis插入数据进入数据库的时候会用到sequence序列来生成自增的id 这时可以使用selectKey就可以得到sequence的值,同时也会将值返回。不过对于不同的数据库有不同的操作方式。 oracle: < insert id“insertTeacher” parameterClass“map”&g…...
网站建设策划 流程/在线一键建站系统
Would you like to change the user interface language in any edition of Windows 7 or Vista on your computer? Here’s a free app that can help you do this quickly and easily. 您想在计算机的任何版本的Windows 7或Vista中更改用户界面语言吗? 这是一个…...
ps做设计想接私活在什么网站/电商关键词工具
【题目描述】 已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵。 【题目链接】 http://noi.openjudge.cn/ch0406/1768/ 【算法】 众所周知一维子区间最大值要如何求,那么为求二维子区间最大和可…...
响应式网站排名/网络网站推广选择乐云seo
1、C工程的组成c程序是由一个或者多个.c文件和.h文件组成的。其中 .c文件是c源代码文件,是程序具体实现的部分。.h文件时C的头文件,用来声明.c文件中函数的。也可以申明自定义的数据。如下图,我定义了一个宏:#define kAD_MAX_DIM …...
慈溪做网站/女生读网络营销与电商直播
VNCTF2022_Misc_复现 仔细找找 放大图片可以看见有很小的与周围颜色不同的像素点均匀的分布在图片中 先寻找像素点之间的间隔,然后拼接在一起生成新的图片 代码实现 from re import L from PIL import Image import numpy pic Image.open("C:\\Users\\Me…...
网站 电信已备案 联通/永久免费个人网站申请注册
问题描述 给定一个字符串,你需要从第start位开始每隔step位输出字符串对应位置上的字符。 输入格式 第一行一个只包含小写字母的字符串。 第二行两个非负整数start和step,意义见上。 输出格式 一行,表示对应输出。 样例输入 abcdefg 2 2 样例…...