使用pytorch神经网络拟合计算模型

一. 内容简介

python调用百度翻译api,将中文论文翻译英文,并保留部分格式

二. 软件环境

2.1vsCode

2.2Anaconda

version: conda 22.9.0

2.3数据文件

链接:https://pan.baidu.com/s/1csJOoErGyx77MW_FImVKjg?pwd=1234

三.主要流程

3.1 数据集介绍

这个数据是前面是参数,后面是结果,用matlab计算的数据,需要拟合这个matlab程序,节省计算时间,里面的数据只是用到了一部分,用这个数据作为训练集,测试没有准备,不太需要,因为计算模型都是算出来的,测试集效果也是挺好的。
在这里插入图片描述

3.2 训练代码

训练代码注释都写在里面了

import numpy as np
import torch
import matplotlib.pyplot as plt
from IPython import display
from d2l import torch as d2l
import random# prepare datas
# 读取数据集
# 有时候可能会报错,这个文件格式啥的,可以换成自己,设定一下格式,也可以自己创建一下txt,给数据复制进去
data_train = np.loadtxt('./data.txt', delimiter=' ', dtype=np.float64)# 读取输入参数,也就是模型的输入
x_data = torch.from_numpy(data_train[:, [3,8]])# 读取模型的输出参数,也就是模型的输出
y_data_1 = torch.from_numpy(data_train[:, [4]]) # [-1] 最后得到的是个矩阵# 下面是要对数据做一下归一化,如果输入输出量级差的特别多的话,就会出现模型损失很大,没办法很好的拟合模型,可以不归一化训练一下,课程里面有一些可能不会提这个,也可以训练出来,就是数据的量级差的不太多
# 我一直没有归一化,有些模型训练就一直没有训练好
# 计算训练集上的最小值和最大值
x_min, x_max = x_data.min(dim=0)[0], x_data.max(dim=0)[0]
y_min, y_max = y_data_1.min(dim=0)[0], y_data_1.max(dim=0)[0]
# 进行 Min-Max 缩放
x_data_normalized = (x_data - x_min) / (x_max - x_min)
y_data_1_normalized = (y_data_1 - y_min) / (y_max - y_min)# 覆盖原来的
x_data = x_data_normalized
y_data_1 = y_data_1_normalized# 这个就是看一下数据集自己换了没
num_rows = len(x_data)
print(num_rows)# 定义神经网络的结构
# 结构我看着定义的,也可以改
class Model(torch.nn.Module):def __init__(self):super(Model, self).__init__()# 这个是有wx+bself.linear1 = torch.nn.Linear(2, 56)self.linear2 = torch.nn.Linear(56, 56)self.linear3 = torch.nn.Linear(56, 56)self.linear4 = torch.nn.Linear(56, 28)self.linear5 = torch.nn.Linear(28, 14)self.linear6 = torch.nn.Linear(14, 4)self.linear7 = torch.nn.Linear(4, 1)self.ReLU = torch.nn.ReLU() # 将其看作是网络的一层,而不是简单的函数使用self.Sigmoid = torch.nn.Sigmoid()def forward(self, x):x =  self.ReLU(self.linear1(x))x =  self.ReLU(self.linear2(x)) x =  self.ReLU(self.linear3(x))x =  self.ReLU(self.linear4(x))x =  self.ReLU(self.linear5(x))x =  self.ReLU(self.linear6(x))x =  self.linear7(x)return x# 这个是创建模型
model = Model()# 下面这个是可以接着之前的模型继续训练,读取之前的模型
# model = torch.torch.load('model1.pkl')
# model = torch.torch.load('averageLoss.pkl')# 这个给模型设置一下数据的格式,给他设置为64位,精度高一些,为什么设的我也忘了
model = model.to(dtype=torch.float64)# 这个是给数据集打乱,然后分批拿,按批训练
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):batch_indices = torch.tensor(indices[i: min(i + batch_size, num_examples)])yield features[batch_indices], labels[batch_indices]# 一批的数据量
# 有时候训练不出来,我一开始给64,32这样的,误差会很大,现在模型训练不出来,我就查数据,和改这个批次的大小
batch_size = 1024# 这块是设置损失计算的方式,有好几种,个人感觉这种最好
# construct loss and optimizer
# criterion = torch.nn.BCELoss(size_average = True)
criterion = torch.nn.SmoothL1Loss()
# optimizer = torch.optim.Adam(model.parameters(), lr=0.0000001)
# 学习率一般设置较小数:0.01、0.001、0.0001,好的学习率一开始误差就不会特别大的# 这个是设置学习率,几种动态的调整方式,也是最下面那个最好,以前好像比过
# 定义Adam优化器
adam_optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
# 定义Adagrad优化器
adagrad_optimizer = torch.optim.Adagrad(model.parameters(), lr=0.001)
# 定义RMSprop优化器
rmsprop_optimizer = torch.optim.RMSprop(model.parameters(), lr=0.001)optimizer = torch.optim.Adam(model.parameters(), lr=0.0001)# 这是之前设置的动态学习率,就是训练不下去以后,给学习率降低,设置一个耐心值,没耐心了就降学习率,至于为什么耐心给这么大,因为降了以后训练模型不太好,
# 这个就是知道就行了,不怎么用
# 动态学习率
lr_scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1000000000000000, patience=200000000000000000000000, cooldown=5, eps=1e-30)
# lr_scheduler.step(loss)# 迭代次数
num_epochs = 160000000000000000000# 单批最小损失,一轮迭代损失
# 用来保存损失最小的模型
lossMin = 10000000
lossAverage = 10000000# training cycle forward, backward, update
# 下面就是训练,更新模型参数
for epoch in range(num_epochs):# 取一批数据for x, y in data_iter(batch_size, x_data, y_data_1):# 计算数据预测结果y_pred = model(x)# 计算损失loss = criterion(y_pred,y)# 清除梯度optimizer.zero_grad()# 反向传播loss.backward()# 更新参数optimizer.step()# 只是一个批次的最优,if loss < lossMin:lossMin = loss# torch.save(model,'minLoss.pkl')with torch.no_grad():# 计算损失train_l = criterion(model(x_data), y_data_1)# 更新学习率# 计算平均参数lr_scheduler.step(train_l.mean())# 读取学习率数值lr = optimizer.param_groups[0]['lr']# 保存损失最低的模型if train_l < lossAverage:lossAverage = train_l# 这个是存模型 torch.save(model,'angelminLoss.pkl')# 有最优的模型,在打印批次print('epoch {}, averageLoss {}, lr {}, averageLoss {}, minLoss {}'.format(epoch + 1, float(train_l.mean()), float(lr), float(lossAverage), float(lossMin)))

3.3 查看模型训练效果

训练效果代码,

import numpy as np
import matplotlib.pyplot as plt
from IPython import display
from d2l import torch as d2l
import random
import numpy as np
import torch
import matplotlib.pyplot as plt
from IPython import display
from d2l import torch as d2# 网络的结构在写一下,
class Model(torch.nn.Module):def __init__(self):super(Model, self).__init__()# 这个是有wx+bself.linear1 = torch.nn.Linear(2, 56)self.linear2 = torch.nn.Linear(56, 56)self.linear3 = torch.nn.Linear(56, 56)self.linear4 = torch.nn.Linear(56, 28)self.linear5 = torch.nn.Linear(28, 14)self.linear6 = torch.nn.Linear(14, 4)self.linear7 = torch.nn.Linear(4, 1)self.ReLU = torch.nn.ReLU() # 将其看作是网络的一层,而不是简单的函数使用self.Sigmoid = torch.nn.Sigmoid()def forward(self, x):x =  self.ReLU(self.linear1(x))x =  self.ReLU(self.linear2(x)) x =  self.ReLU(self.linear3(x))x =  self.ReLU(self.linear4(x))x =  self.ReLU(self.linear5(x))x =  self.ReLU(self.linear6(x))x =  self.linear7(x)return x# 读取训练好的模型,这个angelminLoss.pkl是不包含结构的,只是参数,所以上面要写网络的结构
model = torch.torch.load('angelminLoss.pkl')# 读取数据集
data_train = np.loadtxt('./data.txt', delimiter=' ', dtype=np.float64)# 读取输入参数
x_data = torch.from_numpy(data_train[:100000, [3,8]])
# 读取输出参数
y_data_1 = torch.from_numpy(data_train[:100000, [4]]) # [-1] 最后得到的是个矩阵# 还是归一,因为模型输出的是一个归一化的结果,所以需要给他变成原来的
# 计算训练集上的最小值和最大值
x_min, x_max = x_data.min(dim=0)[0], x_data.max(dim=0)[0]
y_min, y_max = y_data_1.min(dim=0)[0], y_data_1.max(dim=0)[0]
# 进行 Min-Max 缩放
x_data_normalized = (x_data - x_min) / (x_max - x_min)
y_data_1_normalized = (y_data_1 - y_min) / (y_max - y_min)
x_data = x_data_normalized
y_data_1 = y_data_1_normalized# 存损失啥的,以及个数
num_rows, num_cols = x_data.shape
sum  = 0
result = np.zeros(num_rows)# 计数用
countRes = 0
for a in range(num_rows):y = model(x_data[a])*(y_max - y_min) + y_minsum = sum + abs((y_data_1[a]*(y_max - y_min) + y_min - y).item())result[a] = abs((y_data_1[a]*(y_max - y_min) + y_min - y).item())if result[a] > 0.001:print("实际值: {} ;预测值: {} ;差值: {} ;误差: {} ;".format((y_data_1[a]*(y_max - y_min) + y_min).item(),y.item(),((y_data_1[a]*(y_max - y_min) + y_min) - y).item(),((((y_data_1[a]*(y_max - y_min) + y_min) - y)/(y_data_1[a]*(y_max - y_min) + y_min))*100).item()))print(" {} {};".format(x_data[a][0].item(),x_data[a][1].item()))countRes = countRes + 1 
print(countRes)
average = sum / num_rowsprint("平均误差: {} ; 最大误差: {} ; 最小误差: {} ;".format(average, max(abs(result)), min(abs(result))))

四.参考

代码是这个老师讲的基础上改的,加了一下东西,原型是这个,老师讲的很好
【《PyTorch深度学习实践》完结合集】 https://www.bilibili.com/video/BV1Y7411d7Ys/?share_source=copy_web&vd_source=7b377d4a833a67013df5f95f32b390f8

李沐老师讲的也特别好,要更深一些,六二大人老师讲的基础一些
【00 预告【动手学深度学习v2】】 https://www.bilibili.com/video/BV1if4y147hS/?share_source=copy_web&vd_source=7b377d4a833a67013df5f95f32b390f8

李宏毅老师神经网络的原理讲的特别好,这个我没有找到官方的号,可以自己哔哩哔哩搜

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

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

相关文章

【计数DP】牛客小白月赛19

登录—专业IT笔试面试备考平台_牛客网 题意 思路 首先做法一定是计数 dp 然后状态设计&#xff0c;先设 dp[i] 然后看影响决策的因素&#xff1a;两边的火焰情况&#xff0c;那就 dp[i][0/1][0/1]表示 前 i 个&#xff0c;该位有无火焰&#xff0c;该位右边有无火焰的方案数…

mysql原理--连接查询的成本

1.准备工作 连接查询至少是要有两个表的&#xff0c;只有一个 single_table 表是不够的&#xff0c;所以为了故事的顺利发展&#xff0c;我们直接构造一个和 single_table 表一模一样的 single_table2 表。为了简便起见&#xff0c;我们把 single_table 表称为 s1 表&#xff0…

ES8生产实践——Kibana对接Azure AD实现单点登录

基本概念介绍 什么是单点登录 单点登录&#xff08;Single Sign-On&#xff0c;SSO&#xff09;是一种身份验证和访问控制机制&#xff0c;允许用户使用一组凭据&#xff08;通常是用户名和密码&#xff09;仅需登录一次&#xff0c;即可访问多个应用程序或系统&#xff0c;而…

结构体的对齐规则

1.引入 我们在掌握了结构体的基本使⽤后。 现在我们深⼊讨论⼀个问题&#xff1a;计算结构体的大小。 这也是⼀个特别热门的考点&#xff1a; 结构体内存对齐。 2.具体分析 ⾸先我们得掌握结构体的对⻬规则&#xff1a; 1. 结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量…

一站式指南:第 377 场力扣周赛的终极题解

比赛详情 比赛地址 题目一很简单题目二主要是题目长了点&#xff0c;其实解法很常规(比赛后才意识到)题目三套用Dijkstra算法题目四没时间解答水平还有待提升(其实就是需要灵活组合运用已知的算法&#xff0c;有点类似大模型的Agent) 题解和思路 第一题&#xff1a;最小数字…

CentOS进入单用户模式

一、重启 二、出现内核选项 按“e” 三、编辑这一行 输入 rw init/sysroot/bin/sh 四、进入单用户模式 ctrlx 进入 五、切换目录 chroot /sysroot 六、然后你就操作你的系统了。 修改密码等等

【知识点随笔分享 | 第九篇】常见的限流算法

目录 前言&#xff1a; 1.固定窗口限流&#xff1a; 缺点&#xff1a; 2.滑动窗口限流&#xff1a; 优点&#xff1a; 滴桶限流&#xff1a; 缺点&#xff1a; 令牌桶限流&#xff1a; 优点&#xff1a; 总结: 前言&#xff1a; 当今互联网时代&#xff0c;随着网络…

IP编址,IP地址介绍与子网划分方法

网络层位于数据链路层与传输层之间。网络层中包含了许多协议&#xff0c;其中最为重要的协议就是IP协议。网络层提供了IP路由功能。理解IP路由除了要熟悉IP协议的工作机制之外&#xff0c;还必须理解IP编址以及如何合理地使用IP地址来设计网络。 上层协议类型 以太网帧中的Typ…

数据通信网络基础华为ICT网络赛道

目录 前言&#xff1a; 1.网络与通信 2.网络类型与网络拓扑 3.网络工程与网络工程师 前言&#xff1a; 数据通信网络基础是通信领域的基本概念&#xff0c;涉及数据传输、路由交换、网络安全等方面的知识。华为ICT网络赛道则是华为公司提出的一种技术路径&#xff0c;旨在通…

主机安全技术措施

目录 身份鉴别 进阶 访问控制 进阶 安全审计 进阶 ​编辑 剩余信息保护 入侵防范 进阶 恶意代码防范 资源控制 身份鉴别 进阶 访问控制 进阶 安全审计 进阶 剩余信息保护 入侵防范 进阶 恶意代码防范 资源控制 ~over~

Git 分布式版本控制系统(序章1)

第一章 Git 分布式版本控制系统 为什么学Git? 某些企业面试需要掌握Git&#xff0c;同时&#xff0c;也方便管理自己的Qt项目。 一、Git 客户端下载&#xff08;Windows&#xff09; 下载地址 https://gitee.com/all-about-git#git-%E5%A4%A7%E5%85%A8 二、Git 的特点 分支…

java的XWPFDocument3.17版本学习

maven依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version> </dependency> 测试类&#xff1a; import org.apache.poi.openxml4j.exceptions.InvalidFormatExcep…

【MybatisPlus快速入门】(3)SpringBoot整合MybatisPlus 之 Lombok插件安装及MybatisPlus分页代码示例

目录 1.Lombok1.1 步骤1:添加lombok依赖 2.2 步骤2:安装Lombok的插件1.3 步骤3:模型类上添加注解2 分页功能2.1 步骤1:调用方法传入参数获取返回值2.2步骤2:设置分页拦截器2.3 步骤3:运行测试程序 之前我们已学习MyBatisPlus在代码示例与MyBatisPlus的简介&#xff0c;在这一节…

Web Components入门不完全指北

目前流行的各类前端框架&#xff0c;不管是react, angular还是vue&#xff0c;都有一个共同点&#xff0c;那就是支持组件化开发&#xff0c;但事实上随着浏览器的发展&#xff0c;现在浏览器也原生支持组件式开发&#xff0c;本文将通过介绍Web Components 的三个主要概念&…

vue场景 无分页列表条件过滤,子组件多选来自父组件的列表

日常开发中&#xff0c;经常会遇到下面场景&#xff1a; 页面加载一个无分页列表&#xff0c;同时工具栏设置多个条件可对列表过滤的场景(典型的就是关键字模糊查询)父组件传给子组件列表&#xff0c;子组件中需要多选列表多选&#xff0c;选择结果返回父组件 1 无分页列表过…

电子电器架构刷写方案——General Flash Bootloader

电子电器架构刷写方案——General Flash Bootloader 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 注&#xff1a;文章1万字左右&#xff0c;深度思考者入&#xff01;&#xff01;&#xff01; 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免…

CentOS 7 Tomcat服务的安装

前提 安装ava https://blog.csdn.net/qq_36940806/article/details/134945175?spm1001.2014.3001.5501 1. 下载 wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.84/bin/apache-tomcat-9.0.84.tar.gzps: 可选择自己需要的版本下载安装https://mirr…

mysql原理--基于成本的优化

1.什么是成本 我们之前老说 MySQL 执行一个查询可以有不同的执行方案&#xff0c;它会选择其中成本最低&#xff0c;或者说代价最低的那种方案去真正的执行查询。不过我们之前对 成本 的描述是非常模糊的&#xff0c;其实在 MySQL 中一条查询语句的执行成本是由下边这两个方面组…

Kali Linux—借助 SET+MSF 进行网络钓鱼、生成木马、获主机shell、权限提升、远程监控、钓鱼邮件等完整渗透测试(一)

社会工程学—世界头号黑客凯文米特尼克在《欺骗的艺术》中曾提到&#xff0c;这是一种通过对受害者心理弱点、本能反应、好奇心、信任、贪婪等心理陷阱进行诸如欺骗、伤害等危害手段。 SET最常用的攻击方法有&#xff1a;用恶意附件对目标进行 E-mail 钓鱼攻击、Java Applet攻…

Unity之DOTweenPath轨迹移动

Unity之DOTweenPath轨迹移动 一、介绍 DOTweenPath二、操作说明1、Scene View Commands2、INfo3、Tween Options4、Path Tween Options5、Path Editor Options&#xff1a;轨迹编辑参数&#xff0c;就不介绍了6、ResetPath&#xff1a;重置轨迹7、Events&#xff1a;8、WayPoin…