下面是几个仿真实验,用了不同的训练函数:
1.创建BP网络的学习函数,训练函数和性能函数都采用default值,分别为learngdm,trainlm和mse时的逼近结果:
由此可见,进过200次训练后,虽然网络的性能还没有为0,但是输出均方误差已经很小了,MSE=6.72804e-0.06,显示的结果也证明P和T之间非线性映射关系的拟合是非常精确的;
2.建立一个学习函数为learnd,训练函数为traingd,和性能函数为msereg的BP网络,来完成拟合任务:
可见,经过200次训练后,网络的输出误差比较大,而且网络误差的收敛速度非常慢。这是由于训练函数traingd为单纯的梯度下降训练函数,训练速度比较慢,而且容易陷入局部最小的情况。结果显示网络精度确实比较差。
3.将训练函数修改为traingdx,该i函数也是梯度下降法训练函数,但是在训练过程中,他的学习速率是可变的
在200次训练后,以msereg函数评价的网络性能为1.04725,已经不是很大,结果显示P和T之间非线性关系的拟合情况不错,网络的性能不错。
谷歌人工智能写作项目:小发猫
欠拟合是指模型不能在训练集上获得足够低的误差神经网络拟合任务在哪里。而过拟合是指训练误差和测试误差之间的差距太大。
相关介绍:
人工神经网络(ANN)或联结主义系统是受构成动物大脑的生物神经网络的启发但不完全相同的计算系统。这种系统通过例子来“学习”执行任务,而不用特定于任务的规则进行编程。
例如,在图像识别中,人工神经网络可能会通过分析一些图像样本来学习识别包含猫的图像,这些图像被手工标记为“猫”或“不是猫”,并使用结果识别在其他图像中的猫。
他们这样做是在没有猫的任何先验知识的情况下进行的,例如,它们有毛皮,尾巴,胡须和类似猫的脸。相反,人工神经网络会自动从它们处理的学习材料中生成识别特征。
人工神经网络是基于称为人工神经元的连接单元或节点所构成的集合,这些单元或节点松散地模拟生物大脑中的神经元。像生物大脑中的突触一样,每个连接可以将信号从一个人工神经元传输到另一个人工神经元。接收信号的人工神经元可以对其进行处理,然后向与之相连的附加人造神经元发出信号。
1单击Apps,在搜索框中输入neu,下方出现了所有神经网络工具箱。neural net fitting 是我们要使用的神经网络拟合工具箱。
2
在下界面中点击next
3
单击load example data set,得到我们需要的测试数据。
4
单击import
5
单击next
6
单击next
7
数字“10”表示有10个隐含层。单击next。
8
单击train,开始训练。
9
训练过程跳出的小窗口。
10
训练结果。其中MSE表示均方差,R 表示相关系数。单击next。
11
这里可以调整神经网络,也可以再次训练。单击next。
12
在这里,可以保存结果。如果不需要,直接finish。
1单击Apps,在搜索框中输入neu,下方出现了所有神经网络工具箱。neural net fitting 是我们要使用的神经网络拟合工具箱。
2
在下界面中点击next
3
单击load example data set,得到我们需要的测试数据。
4
单击import
5
单击next
6
单击next
7
数字“10”表示有10个隐含层。单击next。
8
单击train,开始训练。
9
训练过程跳出的小窗口。
10
训练结果。其中MSE表示均方差,R 表示相关系数。单击next。
11
这里可以调整神经网络,也可以再次训练。单击next。
12
在这里,可以保存结果。如果不需要,直接finish。
给你一个论坛,上面有你所有想要的视频。,这个链接是基础问题的视频,第二个就是BP神经网络的视频,是论坛版主结合实际问题的教学,很不错。看了你绝对明白。在有不明白,就再问。你需要注册一下,不过是免费下载。有问题继续问
其实用nftool的话,对Training/Testing/validation 三个集合的理解很好
去掉这一句:[Pn]=tramnmx(P,minp,maxp) 你这一句不开玩笑吗?
??? Error using ==> network.subsasgn>network_subsasgn at 535
"layers{1}.transferFcn" cannot be set to non-existing function "tasing'purelin".
这一错误是因为,你漏掉了逗号,而且tansig拼错了,应该是{'tansig','purelin'}
我直接帮你把代码全部改好吧,复制到m文件或命令窗口运行即可:
clc,clear; P=-pi/2+0.1:pi/10:pi/2-0.1; T=tan(P); plot(P,T,'-*'); [Pn,pps]=mapminmax(P,0,1); %p归一化 [Tn,tps]=mapminmax(T,0,1); %t归一化 net=newff(minmax(Pn),[5 1],{'tansig','purelin'},'trainlm'); net.trainParam.show=10; net.trainParam.lr=0.05; net.trainParam.epochs=500; net.trainParam.goal=0.01; [net,tr]=train(net,Pn,Tn); r=sim(net,Pn); r=mapminmax('reverse',r,tps); %反归一化 plot(P,r,'-ro',P,T,'-b*');
我是做这个方向的,神经网络拟合出的曲线是没有相应的函数的,他是根据许多的权重值,阀值和偏置值的训练确定的曲线。还有什么相关问题可以问我,我的QQ378257104。
tic; %计时开始
clc; %清屏
clear all; %清除所有变量
disp('输入层神经元个数: 3'); %显示输入层神经元个数
input=3;
disp('中间层神经元个数: 3'); %显示中间层神经元个数
middle=3;
disp('输出层神经元个数: 1'); %显示输出层神经元个数
output=1;
disp('输入模式1 2 3及其对应的输出:');
x1=[7.1 3.2 2.5];
x2=[7.0 3.4 2.9];
x3=[6.9 3.6 3.1];
x4=[6.8 3.8 2.6];
x5=[7.2 4.0 2.2];
y1=78;y2=65;y3=78;y4=69;y5=72;
disp('形成一张供调用的向量表:');
X=[x1;x2;x3;x4;x5]; %x1,x2,x3,x4,x5向量表
X=X/10;
Yo=[y1;y2;y3;y4;y5]; %y1,y2,y3,y4,y5向量表
Yo=Yo/100;
disp('初始化连接权矩阵:');
w=zeros(input,middle); %输入层与中间层的连接权
v=zeros(middle,output); %中间层与输出层的连接权
th1=zeros(1,middle); %中间层的阈值
th2=zeros(1,output); %输出层的阈值
out_middle=zeros(1,middle); %中间层的实际输出
out_output=zeros(1,output); %输出层的实际输出
delta_output=zeros(1,output); %输出层的差值
delta_middle=zeros(1,middle); %中间层的差值
disp('显示初始化连接权矩阵w:');
w=rands(input,middle); %初始化连接权矩阵w(i,j)
disp(w); %显示初始化连接权矩阵w(i,j)
disp('显示初始化连接权矩阵v:');
v=rand(middle,output); %初始化连接权矩阵v(j,t)
disp(v); %显示初始化连接权矩阵v(j,t)
disp('中间层阈值矩阵th1:');
th1=rand(1,middle); %初始化中间层阈值矩阵th1
disp(th1); %显示中间层阈值矩阵th1
disp('中间层阈值矩阵th2:');
th2=rand(1,output); %初始化输出层阈值矩阵th2
disp(th2); %显示中间层阈值矩阵th2
sample_bumbers=5; %样本数
max_times=10000; %最大训练次数
times=0; %训练次数
eta=0.1; %学习系数eta
gamma=0.1; %学习系数gamma
sample_pointer=0; %样本数指针
error=0.02; %误差
error_max=0.01; %最大误差
for times=1:max_times %begin for External Loop
if error>error_max
for sample_pointer=1:sample_bumbers
X0=X(sample_pointer,:);
Y0=Yo(sample_pointer,:);
Y=X0*w;
%计算中间层的输出:
Y=Y-th1;
for j=1:middle
out_middle(j)=1/(1+exp(-Y(j)));
end
%计算输出层输出:
Y=out_middle*v;
Y=Y-th2;
for k=1:output %k=1:3
out_output(k)=1/(1+exp(-Y(k)));
end
error=(Y0(k)-out_output(k))*(Y0(k)-out_output(k))/2;
%计算输出层校正误差delta_output:
for k=1:output %k=1:3
delta_output(k)=(Y(k)-out_output(k))*out_output(k)*(1-out_output(k));
end
%计算中间层校正误差delta_middle:
for k=1:output %k=1:3
xy=delta_output*v';
delta_middle=xy*out_middle'*(1-out_middle);
end
%计算下一次的中间层和输出层之间的连接权v(j,k),阈值th2(k)
for k=1:output;
for j=1:middle
v(j,k)=v(j,k)+eta*delta_output(k)*out_middle(j);
end
th2(k)=th2(k)+eta*delta_output(k);
end
%计算下一次的输入层和中间层之间的连接权w(i,j),阈值th1(j)
for j=1:middle;
for i=1:input
w(i,j)=w(i,j)+gamma*X0(i)*delta_middle(j);
end
th1(j)=th1(j)+gamma*delta_middle(j);
end
end %end for if
else
break;
end %end for else
end %e孩长粉短莠的疯痊弗花nd for External Loop
disp('显示结果:');
disp('训练次数times:');disp(times);
disp('输出权值w');disp(w);
disp('输出权值v');disp(v);
disp('全局误差error:');disp(error);
disp('运行结束了!');
toc; %计时结束,并输出程序的运行时间
输出结果为:
输入层神经元个数: 3
中间层神经元个数: 3
输出层神经元个数: 1
输入模式1 2 3及其对应的输出:
形成一张供调用的向量表:
初始化连接权矩阵:
显示初始化连接权矩阵w:
0.5695 -0.6483 -0.6946
-0.0573 0.4435 -0.3178
-0.9285 -0.0530 0.2148
显示初始化连接权矩阵v:
0.1917
0.7384
0.2428
中间层阈值矩阵th1:
0.9174 0.2691 0.7655
中间层阈值矩阵th2:
0.1887
显示结果:
训练次数times:
6
输出权值w
0.5376 -0.6779 -0.7311
-0.0736 0.4283 -0.3365
-0.9406 -0.0643 0.2009
输出权值v
0.1328
0.6708
0.2027
全局误差error:
0.0097
运行结束了!
Elapsed time is 0.263732 seconds.