bp神经网络学习

1.input(1:m,:)‘含义

矩阵A第一列的转置矩阵。(x,y)表示二维矩阵第x行第y列位置的元素,x为:则表示所有的行。因此,A(:,1)就表示A的第1列的所有元素,这是一个列向量。

所以这里input(1:m,:)表示1到m行,所有列,而后面有个'这代表转置,综合来看就是将一个1到m行,所有列的矩阵进行转置。

2.如何在workspace中导入数据

首先点击左上角的import data

选择要导入的文件即可,之后会弹出新的界面,界面如下:

这里用到的地方就是range(范围)以及matrix(矩阵),range选择自己想要的的行与列即可。

之后点击对勾就可以导入到workspace里面。

3.newff函数

参考文章:

Matlab中newff函数使用方法和搭建BP神经网络的方法-CSDN博客

net = newff(data,label,[8,8],{'tansig','purelin'},'trainlm')


data:训练时网络的输入数据。newff函数会把data的一列当作一个样本,如果你的数据集是一行当作一个样本,记得将你的输入数据矩阵转置data.‘
label:对应输入数据的标签,也可以看作真实输出。同上,newff函数会把label的一列当作一个样本的标签,如果你的数据集是一行当作一个样本,记得将你的输入数据矩阵转置label.‘
[8,8]:用于确定神经网络隐藏层的层数以及每层的神经单元个数。[8,8]就表示该网络包含两个隐藏层,每个隐藏层有8个神经单元
{‘tansig’,‘purelin’}:表示个隐藏层所用的激活函数。{‘tansig’,‘purelin’}表示第一层用tansig激活函数,是一种S型激活函数;第二次用purelin激活函数,是一种线性型激活函数。常见的激活函数如下:

 logsig:对数S型函数
 tansig:正切S型函数
 purelin:线性型函数

‘trainlm’:确定训练函数,默认为trainlm函数,该方法需要占用更大的存储空间,使用了Levenberg-Marquardt算法,对于中等规模的BP神经网络有最快的收敛速度。由于其避免了直接计算赫赛矩阵,从而减少了训练中的计算量,但需要较大内存量,随着神经元的增多,训练时间增加较大。常见的训练方法如下:
 

 traingd:梯度下降算法
 traingdm:带动量的梯度下降算法
 traingda:学习率变化的梯度下降算法
 traingdx:学习率变化带动量的梯度下降算法
 trainrp:RPROP算法,内存需求小,适用于大型网络
 trainoss:OneStep Secant Algorithm,计算量与内存需求较小,适用于大型网络

(2)其他参数设置:
net.trainParam.goal = 1e-3 :确定目标值为0.001,到此值时训练停止
net.trainFcn=‘trainlm’ :确定训练函数trainlm。如果newff()中设置了,后续可以用不设置
net.trainParam.lr = 0.1 : 确定学习率为0.1
net.divideFcn = ‘’ :取消newff()默认再次划分操作。newff()默认将训练集重新划分6:2:2,训练集:测试集:验证集,在训练过程中会自动在某一处停止,我认为是为了防止过拟合吧,实践中在新训练集损失和新验证集损失下降不明显,且验证损失有上升的趋势时停止。对于数据本来就少的情况,建议取消划分。
net.trainParam.epochs = 1000 :训练最大迭代次数
net.trainParam.min_grad =1e-24 : 最小梯度值,到此值时训练停止
4.net.iw与net.b的含义

MATLAB中多层网络的net.lw{i,j}和net.b{k}的含义 - 知乎 (zhihu.com)

先假设神经网络结构,{ 9 [80 50 20] 1 };9为输入层,[80 50 20]为隐层,1为输出层。

  1. net.iw{1,1} 表示 输入层 到 第1层隐层 的权重,为80*9的矩阵;
  2. net.lw{2,1} 表示 第1层隐层 到 第2层隐层 的权重,为50*80的矩阵;
  3. net.lw{3,2} 表示 第2层隐层 到 第3层隐层 的权重,为20*50的矩阵;
  4. net.lw{4,3} 表示 第3层隐层 到 输出层 的权重,为1*20的矩阵;
  5. net.b{1} 表示 第1层隐层 的偏置,为80*1的矩阵;
  6. net.b{2} 表示 第2层隐层 的偏置,为50*1的矩阵;
  7. net.b{3} 表示 第3层隐层 的偏置,为20*1的矩阵;
  8. net.b{4} 表示 输出层 的偏置,为1*1的矩阵;

可以以此类推。

所以net.iw{1,1},模式也是固定的,仅表示输入层到第1层隐层的权重,之后就net.lw的事情了。net.lw{i,j} 表示 第j层隐层 到 第i层隐层 的权重。net.b{k} 表示 第k层隐层 的偏置或者说阈值,结构都为列向量。可以看出,这里假设的隐含层只有3层[80 50 20],但net中将最后一层输出层也当隐含层用了,所以 和 可以取到4。

知道权重和偏置的位置,可以用算法优化,如遗传算法等。

5.validation checks功能

matlab神经网络使用说明及validation check的作用_matlab中的validation-CSDN博客

当创建神经网络进行训练时,原始数据被自动分成training set、validation set 及test set 三部分。

training set:训练样本数据
validation set:验证样本数据
test set:测试样本数据

这三个数据集是没有重叠的,默认比例为7:1.5:1.5

可以通过设置改变比例分配:

net.divideParam.trainRatio = 80/100;
net.divideParam.valRatio = 0/100;
net.divideParam.testRatio = 20/100;

Neural Network

该部分展示了神经网络的结构,从结构图中可以看出该网络有三个隐含层,神经元个数分别为9个、8个、7个

Progress
Epoch:该网络允许的迭代次数最大为1000,实际迭代5次

Time:该网络训练时长为3秒

Performance:该网络的最大误差为0.475,目标误差为0.001,实际误差为0.000520,可在Plots中的Performance中详细查看

Gradient:该网络的最大梯度为1.91,阈值梯度为1 * e -7 ,实际梯度为0.033。可在Plots中的Training State中详细查看

Mu:该网络所使用Levenberg–Marquardt算法中的阻尼因子最小值为0.001,阈值为1* e 10 ,实际值为1* e -6 ,Mu值越大意味着算法收敛效果越好。可在Plots中的Training State中详细查看

Validation Checks:该网络的泛化能力检查标准,实际值为0表示在训练过程中误差在持续降低,若连续6次训练误差无法降低,则结束训练任务。可在Plots中的Training State中详细查看

Plots
Performance:该网络训练过程中的误差变换可视化

Training State:该网络训练过程中的梯度、Mu因子和泛化能力变换等信息的可视化

Regression:该网络训练集、验证集、测试集的回归能力可视化

Plot Interval:图中横坐标的刻度

matlab神经网络中的validation check
验证样本的检查值默认是6,是指在网络利用训练样本进行训练的过程中,验证样本的误差连续6次迭代不再下降,则训练终止(这只是训练终止条件之一,其他的如训练步数,目标误差等,满足任一条件,训练过程都将终止)。

我们可以这样理解,如果随着网络的训练,验证样本的误差已经基本不再减小,甚至增大,那么就没有必要再去训练网络了。因为即使继续训练下去,当我们利用测试样本进行网络测试时,测试样本的误差同样也不会有所改善,甚至会过度拟合。validation checks已经达到设置的值了,所以网络停止训练,即如果网络在连续max_fail epochs后不能提高网络性能,就停止训练。

通常,有三种方法解决这个问题:

提高validation checks的数值,比如设置net.trainParam.max_fail = 200,其实,这就是自己糊弄自己,非常不严谨,严重不推荐。训练时候,出现停止这种情况,就是因为被训练的网络出现了问题,已经过拟合,应该停下来。但6,的确,可能,有点小,建议改为10到20之间的数吧?这个需要细细思量一下,一般情况默认就好吧?

修改被训练的网络,比如说再加一个隐藏层试试

如果是数据太相近的问题,试试选择用输入训练数据的乱序排法,以及分类

我们要明白它为什么要停止。连续6次误差不断增大,说明网络性能越训练越差。这可能是两方面原因:

过拟合。网络学习得太好了,反而泛化能力下降。

网络规模不够大,信息存储能力不够强,原先学习的知识又被新样本抹去了,导致网络性能无法提升。

要解决这个问题:

如果要改变validation的验证次数,可以用这个语句net.trainParam.max_fail = 20;

或者是增多隐节点或隐层数。

另外,提前停止的网络虽然陷入局优,但不一定就不能用吧,看一下实际效果;

一般来说,不下降就是增大,不可能误差不变。数据少就降低隐层节点数。

取消validation check

加入如下参数,可以取消validation check功能

net.divideFcn =''

但是这个方法对于网络的训练精度提高和输出的逼近程度没有显著改善

matlab神经网络训练过程
在训练时,用training训练,每训练一次,系统自动会将validation set中的样本数据输入神经网络进行验证,在validation set输入后会得出一个误差(不是网络的训练误差,而是验证样本数据输入后得到的输出误差,可能是均方误差),而此前对validation set会设置一个步数,比如默认是6echo,则系统判断这个误差是否在连续6次检验后不下降,如果不下降或者甚至上升,说明training set训练的误差已经不再减小,没有更好的效果了,这时再训练就没必要了,就停止训练,不然可能陷入过学习。所以validation set有个设置步数,就是起这个作用。
复现代码如下:

close all
clc
%读取数据
input=X;
output=Y;
%设置训练数据与测试数据
input_train=input(1:8000,:)';
output_train=output(1:8000,:)';
input_test=input(8001:10000,:)';
output_test=output(8001:10000,:)';
%节点个数
inputnum=26;%输入层节点数量
hiddennum=12;%隐藏层节点数量
outputnum=1;%输出层节点数量
%训练数据归一化
[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);
%bp神经网络
net=newff(inputn,outputn,hiddennum,{'tansig','purelin'},'trainlm');
W1=net.iw{1,1};
B1=net.b{1};
W2=net.lw{2,1};
B2=net.b{2};
%网络参数配置
net.trainParam.epochs=30;
net.trainParam.lr=0.001;
net.trainParam.goal=0.0001;
%网络训练
net=train(net,inputn,outputn);
%测试样本归一化
inputn_test=mapminmax('apply',input_test,inputps);
%神经网络预测
an=sim(net,inputn_test);
%预测结果反归一化与预测值误差计算
test_simu=mapminmax('reverse',an,outputps);
error=test_simu-output_test;
%%第十步 真实值与预测值误差比较

plot(output_test,'bo-')
hold on
plot(test_simu,'r*-')
hold on
plot(error,'square','MarkerFaceColor','b')
legend('期望值','预测值','误差')
xlabel('数据组数')
ylabel('样本值')
title('BP神经网络测试集的预测值与实际值对比图')

[c,l]=size(output_test);
MAE1=sum(abs(error))/l;
MSE1=error*error'/l;
RMSE1=MSE1^(1/2);

disp(['隐含层节点数为',num2str(hiddennum),'时的误差结果如下:'])
disp(['平均绝对误差MAE为:',num2str(MAE1)])
disp(['均方误差MSE为:       ',num2str(MSE1)])
disp(['均方根误差RMSE为:  ',num2str(RMSE1)])
predict_y = zeros(10000,1); % 初始化predict_y
pre_test=mapminmax('apply',new_X(:,:)',inputps);% 对预测数据进行归一化
for i = 1: 10000
    result = sim(net, pre_test(:,i));
    predict_y(i) = result;
end
disp('预测值为:')
predict_y=mapminmax('reverse',predict_y,outputps); %把预测结果还原
disp(predict_y)



目前训练过程中有问题,总是训练不完迭代次数就结束。

效果如下:

上面是预测结果;

5.解决方法

(1)通过增加隐藏层数,可以看到训练能够训练完,但是平均绝对误差并没有多大变化。但是我发现得出的结果预测值精度变高了,这与增加了一层有关。

下面是数据分析:

(2)再增加一层隐藏层

又增加一层之后发现预测值精度更高了,出现了0值得情况!说明增加网络深度对预测结果有很大帮助。

(3)再增加一层看看结果

可以看到增加到四层得出的预测值精度反而下降了,而且训练也没又迭代完。

(4)增加到第五层试一下

随着层数的增加,训练时间增加,预测值的精度并没有变高,也没有训练完。

综上最佳层数是三层。之后通过改变隐藏层节点数来确定是否能提高其精度以及训练迭代完成。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python设计模式之工厂模式、策略模式、生产者-消费者模式

前言 这篇主要总结下 设计模式: 工厂模式、策略模式、生产者-消费者模式, 用python举例说明 一、策略模式 1.1 理论理解 顾名思义,根据情况来选择不一样的《策略》。 这种设计模式主要适用于: 希望能够根据特定条件选择方法的情况…

【谭浩强C语言:前八章编程题(多解)】

文章目录 第一章1. 求两个整数之和(p7) 第二章2. 求三个数中的较大值&#xff08;用函数&#xff09;(p14、p107)3.求123...n(求n的阶乘&#xff0c;用for循环与while循环)(P17)1.循环求n的阶乘2.递归求n的阶乘(n< 10) 4.有M个学生&#xff0c;输出成绩在80分以上的学生的学…

紫光FPGA DDR3 IP使用和注意事项(axi4协议)

紫光DDR3 IP使用 对于紫光ddr3 IP核的使用需要注意事情。 阅读ddr ip手册&#xff1a; 1、注意&#xff1a;对于写地址通道&#xff0c;axi_awvalid要一直拉高&#xff0c;axi_awready才会拉高。使用的芯片型号时PG2L100H-6FBG676&#xff0c;不同的型号IP核接口和axi的握手协…

计算机网络 网络层上 | IP数据报,IP地址,ICMP,ARP等

文章目录 1 网络层的两个层面2 网络协议IP2.1 虚拟互联网络2.2 IP地址2.2.1 固定分类编址方式2.2.2 无分类编制CIDR2.2.3 MAC地址和IP地址区别 2.3 地址解析协议ARP2.3.1 解析过程 2.4 IP数据报格式 3 IP层转发分组流程4 国际控制报文协议ICMP4.1 ICMP格式结构4.2 分类4.2.1 差…

【物联网】EMQX(二)——docker快速搭建EMQX 和 MQTTX客户端使用

一、前言 在上一篇文章中&#xff0c;小编向大家介绍了物联网必然会用到的消息服务器EMQ&#xff0c;相信大家也对EMQ有了一定的了解&#xff0c;那么接下来&#xff0c;小编从这篇文章正式开始展开对EMQ的学习教程&#xff0c;本章节来记录一下如何对EMQ进行安装。 二、使用…

系列八、约束

一、约束 1.1、概述 约束是作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据&#xff0c;通过这种规则&#xff0c;可以保证数据库中数据的正确性、有效性和完整性。 1.2、分类 1.3、注意事项 约束是作用于表中字段上的&#xff0c;可以在创建表/修改表的时候添加…

vue3的大致使用

<template><div class"login_wrap"><div class"form_wrap"> <!-- 账号输入--> <el-form ref"formRef" :model"user" class"demo-dynamic" > <!--prop要跟属性名称对应-->…

2023 OADC:开放原子云社区正式启航,Curve、Kyuubi获奖

12月16-17日&#xff0c;2023开放原子开发者大会&#xff08;OADC&#xff09;在江苏省无锡市召开。大会首日&#xff0c;由网易数帆联合发起的“开放原子云社区”宣告成立&#xff0c;随后网易数帆资深云原生专家侯诗军分享了稳定性保障的前沿实践&#xff0c;Curve、Apache K…

引领位置服务驱动:腾讯地图 WebService 服务端 API 实用指南

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、Java&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏&…

Web前端-JavaScript(js表达式)

文章目录 JavaScript基础第01天1.编程语言概述1.1 编程1.2 计算机语言1.2.1 机器语言1.2.2 汇编语言1.2.3 高级语言 1.4 翻译器 2.计算机基础2.1 计算机组成2.2 数据存储2.3 数据存储单位2.4 程序运行 3.初始JavaScript3.1 JavaScript 是什么3.2 JavaScript的作用3.3 HTML/CSS/…

修改npm源码解决服务端渲染环境中localstorage报错read properties of undefined (reading getItem)

现象&#xff1a; 这个问题是直接指向了我使用的第三方库good-storage&#xff0c;这是一个对localStorage/sessionStorage做了简单封装的库&#xff0c;因为项目代码有一个缓存cache.ts有用到 原因分析&#xff1a; 从表象上看是storage对象找不到getItem方法&#xff0c; 但…

大数据基础-测试过程

一、大数据&#xff1a; 大数据是一个大的数据集合&#xff0c;通过传统的计算技术无法处理。这些数据集的测试需要用各种工具、技术、框架进行处理。大数据涉及数据创建&#xff0c;存储、检索、分析&#xff0c;而且它在数量、多样性、速度都很出色。 二、大数据的测试类型…

【JAVA】CyclicBarrier源码解析以及示例

文章目录 前言CyclicBarrier源码解析以及示例主要成员变量核心方法 应用场景任务分解与合并应用示例 并行计算应用示例 游戏开发应用示例输出结果 数据加载应用示例 并发工具的协同应用示例 CyclicBarrier和CountDownLatch的区别循环性&#xff1a;计数器的变化&#xff1a;用途…

【Spark面试】Spark面试题答案

目录 1、spark的有几种部署模式&#xff0c;每种模式特点&#xff1f;&#xff08;☆☆☆☆☆&#xff09; 2、Spark为什么比MapReduce块&#xff1f;&#xff08;☆☆☆☆☆&#xff09; 3、简单说一下hadoop和spark的shuffle相同和差异&#xff1f;&#xff08;☆☆☆☆☆…

【HTML5、CSS3】新增特性总结!

文章目录 23 HTML5 新增特性23.1 语义化标签23.2 多媒体标签23.2.1 视频<video>标签23.2.2 音频<audio>标签 23.3 input属性值23.4 表单属性 24 CSS3 新增特性24.1 属性选择器24.2 结构伪类选择器24.2.1 选择第n个元素24.2.2 常用的6个结构伪类选择器 24.3 伪元素选…

Qt for Android设置安卓程序默认横屏+全屏

我的qt版本是5.14.1&#xff0c;网上查到的方法是&#xff0c;把编译出的build文件夹中的AndroidManifest.xml文件复制出来然后修改&#xff0c;然后把修改后的xml文件加入pro文件&#xff0c;语法为ANDROID_PACKAGE_SOURCE_DIR $$PWD/AndroidManifest.xml&#xff08;具体&am…

Window和Linux设置代理和取消代理(http_proxy)

前言 需要git clone下载项目的时候&#xff0c;一直clone不下来&#xff0c;则需要添加代理 特别注意&#xff0c;在图形界面中设置代理之后&#xff0c;还需要在终端命令行中设置&#xff0c;否则终端无法使用 1. Window 临时设置代理&#xff1a; export http_proxyhttp…

【运维笔记】Hyperf正常情况下Xdebug报错死循环解决办法

问题描述 在使用hyperf进行数据库迁移时&#xff0c;迁移报错&#xff1a; 查看报错信息&#xff0c;错误描述是Xdebug检测到死循环&#xff0c;可是打印的堆栈确实正常堆栈&#xff0c;没看到死循环。 寻求解决 gpt 说的跟没说一样。。 google一下 直接把报错信息粘贴上去…

LV.13 D5 uboot概述及SD卡启动盘制作 学习笔记

一、uboot概述 1.1 开发板启动过程 开发板上电后首先运行SOC内部iROM中固化的代码(BL0)&#xff0c;这段代码先对基本的软硬件环境(时钟等...)进行初始化&#xff0c;然后再检测拨码开关位置获取启动方式&#xff0c;然后再将对应存储器中的uboot搬移到内存&#xff0c;然后跳…

如何提高RAG增强的准确性

在一个典型的RAG应用开发中&#xff0c;必要的步骤为文档加载&#xff0c;文档拆分&#xff0c;向量化&#xff0c;向量存储。然后基于向量存储进行相似性查询&#xff0c;或基于向量距离的查询。这类查询就叫检索&#xff0c;LangChain所提供的对应组件就是检索器。 但这种方…
最新文章