使用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.hqwc.cn/news/300185.html

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

相关文章

Flink 输出至 Redis

【1】引入第三方Bahir提供的Flink-redis相关依赖包 <!-- https://mvnrepository.com/artifact/org.apache.bahir/flink-connector-redis --> <dependency><groupId>org.apache.bahir</groupId><artifactId>flink-connector-redis_2.11</arti…

泛微OA xmlrpcServlet接口任意文件读取漏洞(CNVD-2022-43245)

CNVD-2022-43245 泛微e-cology XmlRpcServlet接口处存在任意文件读取漏洞&#xff0c;攻击者可利用漏洞获取敏感信息。 1.漏洞级别 中危 2.影响范围 e-office < 9.5 202201133.漏洞搜索 fofa 搜索 app"泛微-OA&#xff08;e-cology&#xff09;"4.漏洞复现 …

DreamTuner :通过单张图片实现主题驱动的图像生成

该项目由字节跳动开发&#xff0c;你只需要提供一张图片&#xff0c;DreamTuner就能帮你生成与这张图片在主题和风格上一致的新图像。比如你有一张可乐照片&#xff0c;它可以根据你的要求将可乐放在任何场景中或添加其他元素形成一张完美海报&#xff01; 这个工具特别适用于需…

nginx反向代理服务器及负载均衡服务配置

一、正向代理与反向代理 正向代理&#xff1a;是一个位于客户端和原始服务器(oricin server)之间的服务器&#xff0c;为了从原始服务器取得内容&#xff0c;客户端向代理发送一个请求并指定目标(原始服务器)&#xff0c;然后代理向原始服务器转交请求并将获得的内容返回给客户…

【excel密码】Excel工作表不能复制或移动

为什么excel文件打开之后&#xff0c;工作表里是可以编辑的&#xff0c;但是想要移动工作表或者复制、重命名等操作&#xff0c;这是什么原因&#xff1f;其实这是因为设置了工作簿保护&#xff0c;设置了保护的工作簿无法对整张工作表进行操作。 想要取消这种保护&#xff0c;…

Exploring the Limits of Masked Visual Representation Learning at Scale论文笔记

论文名称&#xff1a;EVA: Exploring the Limits of Masked Visual Representation Learning at Scale 发表时间&#xff1a;CVPR2023 作者及组织&#xff1a;北京人工智能研究院&#xff1b;华中科技大学&#xff1b;浙江大学&#xff1b;北京理工大学 GitHub&#xff1a;http…

CMakeLists.txt

源码结构 生成可执行程序 # CMake最小版本号 cmake_minimum_required(VERSION 3.15.0)#增加-stdc11 set(CMAKE_CXX_STANDARD 11)#设置工程名称 project(calculate)#[[ #方法一&#xff1a;添加源码文件 #aux_source_directory(< dir > < variable >) #dir&#xf…

【SassVue】仿网易云播放器动画

简介 仿网易云播放动画 效果图&#xff08;效果图&#xff09; 最终成品效果 动画组件 src/components/music/MusicPlayAnimate.vue <template><div class"music-play"><div></div><div></div><div></div></di…

【19】Kotlin语法进阶——Kotlin高阶函数的应用

提示&#xff1a;此文章仅作为本人记录日常学习使用&#xff0c;若有存在错误或者不严谨得地方欢迎指正。 文章目录 一、高阶函数的应用1.1 SharedPreferences的简化 一、高阶函数的应用 高阶函数非常适合用来简化各种API的调用&#xff0c;本章我们将运用高阶函数的知识来简化…

【Image】GAN的超详细解释(以及奇怪的问题)

GAN原理 工作流程 下面是生成对抗网络&#xff08;GAN&#xff09;的基本工作原理 在GAN的架构中&#xff0c;有两个关键的组件&#xff1a;生成器&#xff08;Generator&#xff09;和鉴别器&#xff08;Discriminator&#xff09;。 生成器&#xff08;Generator&#xff0…

nodejs微信小程序+python+PHP的旅游景点推荐系统-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

在x64上构建智能家居(home assistant) (六) 安装Node-RED Companion Integration

点击HACS 搜索node-red 右侧单击后点击安装 安装完成后, 选设备