使用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.mzph.cn/news/577760.shtml

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

相关文章

铁山靠之——HarmonyOS组件 - 2.0

HarmonyOS学习第二章 一、HarmonyOS基础组件的使用1.1 组件介绍1.2 Text1.2.1 文本样式1.2.2 设置文本对齐方式1.2.3 设置文本超长显示1.2.4 设置文本装饰线 1.3 Image1.3.1 设置缩放类型1.3.2 加载网络图片 1.4 TextInput1.4.1 设置输入提示文本1.4.2 设置输入类型1.4.3 设置光…

蓝桥杯-每日刷题-029

因子数与因子和 一、题目要求 题目描述 输入一个正整数N&#xff0c;求出这个数字存在多少个因子&#xff0c;以及因子之和。输入格式 存在多组测试数据&#xff0c;每组测试数据输入一个正整数N(1<N<10^9)输出格式 对于每组测试数据输出一行&#xff0c;包含两个数字&…

快速上手 Mac 电脑

更好的阅读体验 \color{red}{更好的阅读体验} 更好的阅读体验 触摸板操作 打开系统偏好设置-触控板选项查看学习常用操作双指触控实现鼠标右键功能建议打开轻点来点按&#xff0c;和 win 操作相同系统偏好设置-辅助功能-指针控制-触控板选项-启用拖移-三指拖移&#xff1a;单手…

王道考研计算机网络——数据链路层

码元和信号变化是一一对应的 低通&#xff1a;低于最高频率的可以通过 奈氏准则无噪声&#xff0c;香农定理有噪声 给出db&#xff0c;利用公式求出S/N 放到数字信道上传输就是基带信号&#xff0c;放到模拟信道上传输就是宽带信号 把基带信号调制成宽带信号之后&#xff0c;…

JSON在Java中的使用

目录 第一章、快速了解JSON1.1&#xff09;JSON是什么1.2&#xff09;json的语法格式①键值对、字符串、数字、布尔值、数组、对象②嵌套的格式 1.3&#xff09;为什么使用JSON 第二章、发送和接收JSON格式数据2.1&#xff09;postman发送JSON格式数据2.2&#xff09;Java后端接…

华为OD机试 - 可以处理的最大任务数(Java JS Python C)

题目描述 在某个项目中有多个任务(用task数组表示)需要你进行处理,其中: task[i] = [si, ei]你可以在 si ≤ day ≤ ei 中的任意一天处理该任务,请返回你可以处理的最大任务数。 输入描述 第一行为任务数量 n 1 ≤ n ≤ 100000后面 n 行表示各个任务的开始时间和终止时间…

【csapp】cachelab

文章目录 Part APart B32 * 3264 * 6461 * 67 实验全程参考大佬的博客CS:APP3e 深入理解计算机系统_3e CacheLab实验 &#xff0c;感觉大佬在矩阵转置那块介绍的还是有些简略&#xff0c;我自己又做了点动图加以补充理解。膜拜大佬&#xff01; Part A 先解决解析命令行参数的…

STM32实战之深入理解I²C通信协议

目录 IC的物理层 IC的协议层 IC特点 IC 总线时序图 软件模拟IC时序分享 例程简介 例程分享 STM32的IC外设 IIC&#xff08;Inter-Integrated Circuit&#xff09;&#xff0c;也称为IC或TWI&#xff08;Two-Wire Interface&#xff09;&#xff0c;是一种广泛使用的串行…

MyBatis——MyBatis的缓存

MyBatis的缓存 创建工程&#xff1a; 1缓存介绍 为什么使用缓存&#xff1f; 首次访问时&#xff0c;查询数据库&#xff0c;并将数据存储到内存中&#xff1b;再次访问时直接访问缓存&#xff0c;减少IO、硬盘读写次数、提高效率 Mybatis中的一级缓存和二级缓存&#xff1f;…

docker的常规使用总结

不安装docker下载镜像&#xff0c;或者下载异构镜像&#xff0c;模拟docker客户端 https://pull.7ii.win/ 1、启动docker服务 systemctl start docker 2、查看镜像 docker images 查看镜像centos-vim docker images | grep ubuntu-vim #强制删除全部镜像文件 docker rm…

linux 可睡眠RCU

可睡眠 RCU&#xff08; Sleepable RCU&#xff0c; SRCU&#xff09;允许在读端临界区里面睡眠。 在读端临界区里面睡眠&#xff0c;可能导致宽限期很长。为了避免影响整个系统&#xff0c;使用 SRCU的子系统需要定义一个 SRCU 域&#xff0c;每个 SRCU 域有自己的读端临界区…

【SD】通过种子数 差异强度 进行 角色融合【2】

通过 对 2个种子 进行对比 生成 2张图片 风格相符合的图片 best quality,masterpiece,chibi,full body, 我们首先生成1张图 Seed: 726932558 我们再次生成一张图 Seed: 3824894478 随机种子&#xff1a;图一 随机种子&#xff1a;图二 差异强度&#xff1a;0.2 差异强度0.4 差…

31. Ajax

简介 AJAX 是 Asynchronous JavaScript And XML 的简称。直译为&#xff0c;异步的JS和XML。AJAX的实际意义是&#xff0c;不发生页面跳转、异步载入内容并改写页面内容的技术。AJAX也可以简单的理解为通过JS向服务器发送请求。 AJAX这门技术很早就被发明&#xff0c;但是直到…

前端框架前置学习(4) AJAX

同步代码和异步代码 同步代码 浏览器按照我们书写代码的顺序一行一行地执行程序.浏览器会等待代码的解析和工作,在上一行代码完成之后才会执行下一行代码.这被称之为同步程序 逐行执行,需要原地等待结果 异步代码 异步编码技术使得程序可以在执行一个可能长期运行的任务的…

助力打造清洁环境,基于轻量级YOLOv8开发构建公共场景下垃圾堆放垃圾桶溢出检测识别系统

公共社区环境生活垃圾基本上是我们每个人每天几乎都无法避免的一个问题&#xff0c;公共环境下垃圾投放点都会有固定的值班时间&#xff0c;但是考虑到实际扔垃圾的无规律性&#xff0c;往往会出现在无人值守的时段内垃圾堆放垃圾桶溢出等问题&#xff0c;有些容易扩散的垃圾比…

韩版传奇 2 源码分析与 Unity 重制(二)客户端启动与交互流程

专题介绍 该专题将会分析 LOMCN 基于韩版传奇 2&#xff0c;使用 .NET 重写的传奇源码&#xff08;服务端 客户端&#xff09;&#xff0c;分析数据交互、状态管理和客户端渲染等技术&#xff0c;此外笔者还会分享将客户端部分移植到 Unity 和服务端用现代编程语言重写的全过…

Linux 用户和用户组管理

Linux系统是一个多用户多任务的分时操作系统&#xff0c;任何一个要使用系统资源的用户&#xff0c;都必须首先向系统管理员申请一个账号&#xff0c;然后以这个账号的身份进入系统。 用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪&#xff0c;并控制他们对系统…

将elementUI,NaiveUI的progress环形进度条设置为渐变色

需求 &#xff1a;进度条要有一个渐变效果。效果图&#xff1a; NaiveUI和elementUI的官方progress组件都是只能设置一种颜色&#xff0c;不符合需求所以改一下。 其实NaiveUI和elementUI设置进度条的实现方式基本一样都是使用svg渲染出两个path&#xff0c;第一个是底色&…

用手机做无人直播怎么做?

用手机进行无人直播已经成为了一种新兴的方式&#xff0c;给我们的生活带来了便利和创新。无人直播是指通过手机进行实时转播&#xff0c;而无需人工操作的一种直播形式。以下将介绍如何用手机实现无人直播。 首先&#xff0c;要实现手机无人直播&#xff0c;我们需要一个稳定…

<meta name=“Keywords“ content=““ >、<meta name=“Description“ content=““ > 等用法解释

今天在看网站代码&#xff0c;发现类似<meta name"Keywords" content"" >、<meta name"Description" content"" >这样的写法&#xff0c;不知道具体代表什么意思&#xff0c;于是上网搜了一下&#xff0c;下面是在网上找到…