导航:首页 > 网络设置 > 训练bp神经网络需要多少组样本

训练bp神经网络需要多少组样本

发布时间:2024-07-05 16:23:28

‘壹’ BP绁炵粡缃戠粶镄勬疮涓涓镙锋湰鍙浠ユ槸涓涓鐭╅樀钖楋纻濡备綍杈揿叆锛熻阿璋锛

姣忎釜镙锋湰瀵瑰簲涓缁勫彉閲忓硷纴浣嗘槸BP绁炵粡缃戠粶浣跨敤镞朵竴鑸涓崭娇鐢1涓镙锋湰铡昏缁冿纴閮芥槸浣跨敤鑻ュ共缁勬牱链锛岃繖镙蜂粬镄勮嫢骞茬粍镙锋湰灏辨槸鐭╅樀浜嗐
鐩存帴瀹氢箟
P=[
1 2 1 3;%杩欐槸涓缁勬牱链
1 2 1 4;%杩欐槸绗浜岀粍镙锋湰
...
];
杩欐牱灏卞畾涔変简杈揿叆鐭╅樀銆
杈揿嚭鐭╅樀涔熸槸钖屾牱镄勫畾涔夈
杈揿叆鐭╅樀涓庤緭鍑虹烦阒电殑琛屾暟锛堟牱链涓鏁帮级蹇呴’涓镊淬
net(....);
train(net....);
濡傛灉鎶ラ敊锛屽氨鎶奝鍜孴钖屾椂杞缃锛圥=P';T=T';锛変竴涓嬨

‘贰’ bp神经网络只有一类样本怎么分类

神经网络一列为一个样本,所以对于matlab 而言,要求输入和输出的列数必须一样的
经常有人问起的问题:
Error using ==> network/train
Targets are incorrectly sized for network.
Matrix must have 1 rows.
解决:要求P T 的列数一样 ,如果不一样 P=p’ t=t’ 转置一下
2.
归一
澄清一个对归一的错误理解1
样本矩阵为9行4列。9组样本,4个变量。现在归一化:
x=[68.7 66.6 5610 19.2;
89.9 90.8 4500 11.8;
120.8 120.6 6800 20.6;
169 40.4 6160 40.6;
180.8 69.8 7330 33.4;
190.3 130.2 7320 31.6;
109.8 151.1 5754 86.1;
33.2 61.4 8255 22.6;
111.7 126.6 7040 13.6;]
写法一:
for i=1:9
x1(i,:)=(x(i,:)-min(x(i,:)))/(max(x(i,:))-min(x(i,:)))
end
结果:
0.0089 0.0085 1.0000 0
0.0174 0.0176 1.0000 0
0.0148 0.0148 1.0000 0
0.0210 0 1.0000 0.0000
0.0202 0.0050 1.0000 0
0.0218 0.0135 1.00 00 0
0.0042 0.0115 1.0000 0
0.0013 0.0047 1.0000 0
0.0140 0.0161 1.0000 0

写法二:
x=x'
for i=1:4
x1(i,:)=(x(i,:)-min(x(i,:)))/(max(x(i,:))-min(x(i,:)))
end
结果:
Columns 1 through 8

0.2260 0.3609 0.5576 0.8644 0.9395 1.0000 0.4876 0
0.2367 0.4553 0.7245 0 0.2656 0.8112 1.0000 0.1897
0.2956 0 0.6125 0.4421 0.7537 0.7510 0.3340 1.0000
0.0996 0 0.1184 0.3876 0.2907 0.2665 1.0000 0.1454

Column 9

0.4997
0.7787
0.6764
0.0242
注意:写法2为正确的归一化

对归一的错误理解2
将数据集分为训练集和测试集,对训练集和测试集分别做归一处理
所以就会有人问 如果我的测试集只有一个数据 如何归一呀
最大最小值从那里找呀
正确的理解是:
训练集和测试集的归一标准是一样的
建议:
如果训练集和测试集是一起归一的 可以自己编程实现归一
如果是训练集和测试集是分开的,最好是使用matlab自带的premnmx、postmnmx、tramnmx 函数
如果是自己编程的话 ,请注意训练集和测试集的归一标准需要一样
premnmx、postmnmx、tramnmx 函数
的使用例子如下:
Example

Here is the code to normalize a given data set so
that the inputs and targets will fall in the
range [-1,1], using PREMNMX, and the code to train a network
with the normalized data.

p = [-10 -7.5 -5 -2.5 0 2.5 5 7.5 10];
t = [0 7.07 -10 -7.07 0 7.07 10 7.07 0];
[pn,minp,maxp,tn,mint,maxt] = premnmx(p,t);
net = newff(minmax(pn),[5 1],{'tansig' 'purelin'},'trainlm');
net = train(net,pn,tn);

If we then receive new inputs to apply to the trained
network, we will use TRAMNMX to transform them
first. Then the transformed inputs can be used
to simulate the previously trained network. The
network output must also be unnormalized using
POSTMNMX.

p2 = [4 -7];
[p2n] = tramnmx(p2,minp,maxp);
an = sim(net,pn);
[a] = postmnmx(an,mint,maxt);

这个是归一到-1 和 1 之间 那我要归一到0 1 之间怎么办
有人说可以使用加绝对值就归一到 0 1之间了
我觉得加绝对值可能会有些问题
比较好的方式是变换
P 在-1 1 之间
Pp=(p+1)/2 就可以归一到0 1之间
至于要归一到0.1- 0.9 之间 选取合适的变换就可以做到了
二、神经网络(BP)系列(2)(初学者系列)每次结果不一样解析
这个系列主要针对使用matlab 神经网络工具箱,对一些初学者容易理解错误的地方进行解析。
神经网络每次结果不同解析
神经网络每次结果不同是因为初始化的权值和阈值是随机的
因为每次的结果不一样,才有可能找到比较理想的结果啊
找到比较好的结果后,用命令save filename net;保存网络,
可使预测的结果不会变化,调用时用命令load filename net;
取p_test=[ ];
t_test=[ ];
t=sim(net,p_test);
err=t_test-t;
plot(p_test,err);
选择误差小的保存网络
save filename net
以后调用时
load filename net
p_test=[ ];
t_test=[ ];
t=sim(net,p_test);
err=t_test-t;
plot(p_test,err):
因为每次初始化网络时都是随机的,而且训练终止时的误差也不完全相同,结果训练后的权植和阀也不完全相同(大致是一样的),所以每次训练后的结果也略有不同
举个例子,这样初始化就能使网络的输出结果是一样的,另外也可以给网络特定的权值,一种方法是把预测结果后的效果比较好的权值做为初值
p=[0.8726 0.9441 0;0 0 0.7093;0.7378 0.7093 0.3795;0.6416 0.3795 0.7031;1 0.7031 0.4241;0.7774 0.4241 0.9559;0.9559 0.5012 0.7052;...
0.8209 0.7052 0.4983;0.6011 0.4983 1;]';
t=[0 0.7378 0.6416 1 0.7774 0.5012 0.8209 0.6011 0.9350];
rand('state',0);
net=newff(minmax(p),[6,1],{'tansig','logsig'},'trainlm');
net.trainParam.epochs=2000;
net.trainParam.goal=0.001;
net=train(net,p,t);
y=sim(net,p);
error=y-t;
res=norm(error);
p_test=[0.9350 1 0.6236;]';
t_test=[ 0.8027]
a=sim(net,p_test)
rand('state',0);
这个的作用是每次初始化一样
0是种子数,如果换成其他数,就可以产生不同的随机值
注: rand('state',0);的使用有点为结果相同而相同,至于这样的结果网络性能是否达到好的要求则没有考虑,建议还是不要用这种方法使每次结果相同
用保存网络的方法吧
消除初值影响可以考虑的另一个方法是简单集成神经网络
原理
由于选择不同的权值所得结果不同,使最终神经网络泛化能力体现出一定的随机性。利用这个特性也可以改善神经网络的泛化能力,神经网络集成便是利用这种思路的体现,即先训练一组只有初始权值不同的子网,然后通过各子网“表决(Voting)” 的形式(如加权和)得到学习系统的输出。
当神经网络集成用于分类器时,集成的输出通常由个体网络的输出投票产生。通常利用绝对多数投票法(某分类成为最终结果当且仅当输出结果为该分类的神经网络的数目最多)。理论分析和大量实验表明,后者优于前者。因此,在对分类器进行集成时,目前大多采用相对多数投票法。
当神经网络集成用于回归估计时,集成的输出通常由各网络的输出通过简单平均或加权平均产生。Perrone等人认为,采用加权平均可以得到比简单平均更好的泛化能力。

三、神经网络(BP)系列(3)(初学者请看)分类实例
分类实例
输入输出设计:
对某一问题分析,影响网络性能的输入主要有5个指标,输出则分为8类。8类的话可以用三位二进制表示。
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
神经网络的输入为5维的向量,输出为三维的向量。输入的数据具有不同的单位和量级,所以在输入在输入神经网络之前应该首先进行归一化处理,将样本数据归一到0 1之间。
样本总共有328组数据
将样本集分为训练集和测试集
随机抽取70取做为测试测试集
其余的作为训练集
网络设计
采用tansig(x)和logsig(x)函数作为传输函数,tansig(x)如下式:
tansig=2/(1+exp(-2x))-1
logsig(x) 如下式:
logsig(x) = 1 / (1 + exp(-n))
对于有限个输入到输出的映射,并不需要无限个隐层节点,这就涉及到如何选择隐层节点数的问题,而这一问题的复杂性,使得至今为止尚未找到一个很好的解析 式,隐层节点数往往根据前人设计所得的经验和自己进行试验来确定。设计网络时我采用的方法是通过神经网络训练来确定隐含层的个数,首先确定隐含层中节点数目的范围,设计一个隐含层神经元数目可变的BP网络,通过误差对比,确定最佳的隐含层神经元的个数。最后确定的隐含层的个数为12。所以网络结构为 5-12-3的三层结构。
load('CSHuju1.mat');
p=CC1(:,[1,3:6])';
T=[0 0 0;
1 1 1;
1 1 0;
1 0 1;
1 0 0;
0 1 1;
0 1 0;
0 0 1];
t=repmat(T,41,1)';
pp=p;
%%%%%%归一到 0 1 之间
for i=1:5
p(i,:)=(p(i,:)-min(p(i,:)))/(max(p(i,:))-min(p(i,:)));
end
AllSamNum=328;%总样本数
TrainSamNum=258;%训练样本数
TestSamNum=AllSamNum-TrainSamNum;%测试样本数
PerPos=randperm(AllSamNum);
TrainDataIn=p(:,1:TrainSamNum)
TrainDataOut=t(:,1:TrainSamNum)
TestDataIn=p(:,PerPos(:,TrainSamNum+1:TrainSamNum+TestSamNum))
TestDataOut=t(:,PerPos(:,TrainSamNum+1:TrainSamNum+TestSamNum))
MaxMin=[0 1; 0 1; 0 1; 0 1;0 1];
net=newff(MaxMin,[12,3],{'tansig','logsig'},'trainlm');
%训练参数设置
net.trainParam.epochs=1000;
%训练次数
net.trainParam.goal=0.0001;
%训练结束的目标
LP.lr=0.1;
%学习率
net.trainParam.show=20;
net=train(net,TrainDataIn,TrainDataOut);
out=sim(net,TestDataIn)

训练结果:
TRAINLM, Epoch 0/1000, MSE 0.296308/0.0001, Gradient 83.9307/1e-010
TRAINLM, Epoch 20/1000, MSE 0.0224641/0.0001, Gradient 6.7605/1e-010
TRAINLM, Epoch 40/1000, MSE 0.00563627/0.0001, Gradient 3.27027/1e-010
TRAINLM, Epoch 60/1000, MSE 0.00348587/0.0001, Gradient 1.49868/1e-010
TRAINLM, Epoch 80/1000, MSE 0.00247714/0.0001, Gradient 0.459233/1e-010
TRAINLM, Epoch 100/1000, MSE 0.0018843/0.0001, Gradient 0.289155/1e-010
TRAINLM, Epoch 120/1000, MSE 0.00148204/0.0001, Gradient 0.392871/1e-010
TRAINLM, Epoch 140/1000, MSE 0.00119585/0.0001, Gradient 0.340864/1e-010
TRAINLM, Epoch 160/1000, MSE 0.000980448/0.0001, Gradient 0.391987/1e-010
TRAINLM, Epoch 180/1000, MSE 0.000779059/0.0001, Gradient 0.389835/1e-010
TRAINLM, Epoch 200/1000, MSE 0.000606974/0.0001, Gradient 0.310202/1e-010
TRAINLM, Epoch 220/1000, MSE 0.000388926/0.0001, Gradient 0.331632/1e-010
TRAINLM, Epoch 240/1000, MSE 0.000143563/0.0001, Gradient 0.0403953/1e-010
TRAINLM, Epoch 248/1000, MSE 9.87756e-005/0.0001, Gradient 0.174263/1e-010
TRAINLM, Performance goal met.
训练好的权值、阈值的输出方法是:
输入到隐层权值:w1=net.iw{1,1}
隐层阈值:theta1=net.b{1}
隐层到输出层权值:w2=net.lw{2,1};
输出层阈值:theta2=net.b{2}
>>w1=net.iw{1,1}

w1 =

1.7663 -2.8022 -0.7142 -2.1099 -2.4011
3.6614 -2.5297 -4.4295 5.0508 8.1899
4.4007 7.6775 -6.0282 6.1567 1.8775
4.5009 -9.9915 5.9737 5.0234 3.3931
0.2703 -2.8850 0.4482 -2.9153 1.3648
2.3769 3.3151 0.8745 3.1900 1.2608
-2.2815 -6.6847 1.8738 2.4093 -2.9033
-5.3332 6.1506 -8.4386 -6.7979 3.1428
-0.0135 -10.8942 -9.6333 7.2311 12.0693
2.3130 5.2211 0.0155 2.9431 0.3135
-6.4017 -0.8987 0.1976 3.2527 0.1444
-3.6517 -1.6339 3.5505 2.4813 1.7880
>> theta1=net.b{1}

theta1 =

0.5955
-5.4876
-9.8986
-4.4731
3.6523
-4.0371
5.6187
5.7426
0.9147
-8.5523
-2.3632
-5.6106
>> w2=net.lw{2,1}

w2 =

Columns 1 through 8

-0.2751 -3.5658 -2.3689 -6.4192 -1.1209 1.5711 -1.7615 7.6202
-1.2874 -9.1588 -14.4533 7.5064 3.7074 0.9019 8.7033 -5.0031
3.3536 -0.8844 7.8887 0.9336 0.8410 -2.4905 1.0627 -9.3513

Columns 9 through 12

-2.5894 -1.9950 -3.0132 -4.7009
13.3490 -9.8521 -4.6680 -4.2037
-5.9251 2.9388 -1.6797 -2.1077
>> theta2=net.b{2}

theta2 =

-2.4762
0.5692
0.6694
输出:
out =

Columns 1 through 8

1.0000 1.0000 0.0020 0.0000 1.0000 1.0000 0.0000 0.0000
1.0000 0.0000 0.0041 1.0000 1.0000 1.0000 1.0000 1.0000
0.9991 0.0000 0.0036 0.0015 0.9992 0.9985 0.0055 0.0036

Columns 9 through 16

1.0000 0.0000 0.0019 1.0000 0.0000 0.0000 0.0000 0.9996
1.0000 1.0000 0.9901 1.0000 1.0000 1.0000 1.0000 0.0000
0.9977 0.9999 0.9996 0.9994 0.0046 0.0023 0.0014 1.0000

Columns 17 through 24

0.0020 0.9925 0.0020 0.0000 0.0020 1.0000 0.0002 1.0000
0.0041 0.0284 0.0041 0.0284 0.0041 1.0000 0.9983 1.0000
0.0036 0.9955 0.0036 1.0000 0.0036 0.9989 0.9999 0.9990

Columns 25 through 32

1.0000 0.9938 1.0000 0.0000 1.0000 0.9999 0.0000 1.0000
1.0000 0.0177 0.0000 0.0021 1.0000 0.0006 1.0000 1.0000
0.0000 0.9971 0.0000 1.0000 0.0000 0.0004 0.9999 0.0000

Columns 33 through 40

0.9954 1.0000 0.0000 0.0000 0.9951 0.0020 0.0000 0.9997
0.0065 1.0000 1.0000 0.0025 0.0178 0.0041 1.0000 0.0000
0.9986 0.9990 0.9999 1.0000 0.0101 0.0036 0.0013 1.0000

Columns 41 through 48

0.0000 1.0000 0.9983 0.0000 0.0020 1.0000 0.0000 0.9873
0.0020 1.0000 0.0000 0.0037 0.0041 1.0000 0.0328 0.0637
1.0000 0.0000 0.9999 1.0000 0.0036 0.9982 1.0000 0.9884

Columns 49 through 56

0.0000 0.0001 1.0000 1.0000 1.0000 0.0000 0.0004 1.0000
0.0164 0.9992 0.9982 1.0000 1.0000 1.0000 0.9965 0.9998
1.0000 0.9999 0.9948 0.9991 0.9989 0.0024 0.9998 0.9968

Columns 57 through 64

1.0000 1.0000 0.0000 0.0020 0.0020 0.0001 0.0001 0.0000
0.9763 1.0000 0.0134 0.0041 0.0041 0.9990 0.0395 0.0017
0.0202 0.9988 1.0000 0.0036 0.0036 0.9999 0.9999 1.0000

Columns 65 through 70

0.9993 0.0000 0.0000 0.9978 1.0000 1.0000
0.0000 0.0018 0.0110 0.0001 1.0000 0.9998
1.0000 1.0000 1.0000 0.9999 0.9987 0.0007
每次结果因为初始化不同会不一样,可以选取一个性能比较好的网络
保持起来
save myBpNet net
save myShu.mat TestDataIn TestDataOut
测试数据也保存起来
(TestDataIn TestDataOut 为测试数据的输入向量和目标向量)
以后调用时
load myshu.mat
load myBpNet net
out=sim(net,TestDataIn)
基本框架程序:(前面的样本数据自己根据实际情况设计)
load('CSHuju1.mat');
p=CC1(:,[1,3:6])';
T=[0 0 0;
1 1 1;
1 1 0;
1 0 1;
1 0 0;
0 1 1;
0 1 0;
0 0 1];
t=repmat(T,41,1)';
pp=p;
%%%%%%归一到 0 1 之间
for i=1:5
p(i,:)=(p(i,:)-min(p(i,:)))/(max(p(i,:))-min(p(i,:)));
end
AllSamNum=328;%总样本数
TrainSamNum=258;%训练样本数
TestSamNum=AllSamNum-TrainSamNum;%测试样本数
PerPos=randperm(AllSamNum);
TrainDataIn=p(:,1:TrainSamNum)
TrainDataOut=t(:,1:TrainSamNum)
TestDataIn=p(:,PerPos(:,TrainSamNum+1:TrainSamNum+TestSamNum))
TestDataOut=t(:,PerPos(:,TrainSamNum+1:TrainSamNum+TestSamNum))
MaxMin=[0 1; 0 1; 0 1; 0 1;0 1];
net=newff(MaxMin,[12,3],{'tansig','logsig'},'trainlm');
net.trainParam.epochs=1000;
%训练次数
net.trainParam.goal=0.0001;
%训练结束的目标
LP.lr=0.1;
%学习率
net.trainParam.show=20;
net=train(net,TrainDataIn,TrainDataOut);
out=sim(net,TestDataIn)

‘叁’ BP神经网络的训练集需要大样本吗一般样本个数为多少

BP神经网络的训练集需要大样本吗?一般样本个数为多少?
BP神经网络样本数有什么影响
学习神经网络这段时间,有一个疑问,BP神经网络中训练的次数指的网络的迭代次数,如果有a个样本,每个样本训练次数n,则网络一共迭代an次,在n>>a 情况下 , 网络在不停的调整权值,减小误差,跟样本数似乎关系不大。而且,a大了的话训练时间必然会变长。
换一种说法,将你的数据集看成一个固定值, 那么样本集与测试集 也可以按照某种规格确定下来如7:3 所以如何看待 样本集的多少与训练结果呢? 或者说怎么使你的网络更加稳定,更加符合你的所需 。

我尝试从之前的一个例子中看下区别

如何用70行Java代码实现深度神经网络算法

作者其实是实现了一个BP神经网络 ,不多说,看最后的例子

一个运用神经网络的例子
最后我们找个简单例子来看看神经网络神奇的效果。为了方便观察数据分布,我们选用一个二维坐标的数据,下面共有4个数据,方块代表数据的类型为1,三角代表数据的类型为0,可以看到属于方块类型的数据有(1,2)和(2,1),属于三角类型的数据有(1,1),(2,2),现在问题是需要在平面上将4个数据分成1和0两类,并以此来预测新的数据的类型。


图片描述

我们可以运用逻辑回归算法来解决上面的分类问题,但是逻辑回归得到一个线性的直线做为分界线,可以看到上面的红线无论怎么摆放,总是有一个样本被错误地划分到不同类型中,所以对于上面的数据,仅仅一条直线不能很正确地划分他们的分类,如果我们运用神经网络算法,可以得到下图的分类效果,相当于多条直线求并集来划分空间,这样准确性更高。

图片描述

简单粗暴,用作者的代码运行后 训练5000次 。根据训练结果来预测一条新数据的分类(3,1)



预测值 (3,1)的结果跟(1,2)(2,1)属于一类 属于正方形

这时如果我们去掉 2个样本,则样本输入变成如下

//设置样本数据,对应上面的4个二维坐标数据
double[][] data = new double[][]{{1,2},{2,2}};
//设置目标数据,对应4个坐标数据的分类
double[][] target = new double[][]{{1,0},{0,1}};
1
2
3
4
1
2
3
4




则(3,1)结果变成了三角形,

如果你选前两个点 你会发现直接一条中间线就可以区分 这时候的你的结果跟之前4个点时有区别 so 你得增加样本 直到这些样本按照你所想要的方式分类 ,所以样本的多少 重要性体现在,样本得能反映所有的特征值(也就是输入值) ,样本多少或者特征(本例子指点的位置特征)决定的你的网络的训练结果,!!!这是 我们反推出来的结果 。这里距离深度学习好像近了一步。

另外,这个70行代码的神经网络没有保存你训练的网络 ,所以你每次运行都是重新训练的网络。其实,在你训练过后 权值已经确定了下来,我们确定网络也就是根据权值,so只要把训练后的权值保存下来,将需要分类的数据按照这种权值带入网络,即可得到输出值,也就是一旦网络确定, 权值也就确定,一个输入对应一个固定的输出,不会再次改变!个人见解。

最后附上作者的源码,作者的文章见开头链接
下面的实现程序BpDeep.java可以直接拿去使用,

import java.util.Random;
public class BpDeep{
public double[][] layer;//神经网络各层节点
public double[][] layerErr;//神经网络各节点误差
public double[][][] layer_weight;//各层节点权重
public double[][][] layer_weight_delta;//各层节点权重动量
public double mobp;//动量系数
public double rate;//学习系数

public BpDeep(int[] layernum, double rate, double mobp){
this.mobp = mobp;
this.rate = rate;
layer = new double[layernum.length][];
layerErr = new double[layernum.length][];
layer_weight = new double[layernum.length][][];
layer_weight_delta = new double[layernum.length][][];
Random random = new Random();
for(int l=0;l<layernum.length;l++){
layer[l]=new double[layernum[l]];
layerErr[l]=new double[layernum[l]];
if(l+1<layernum.length){
layer_weight[l]=new double[layernum[l]+1][layernum[l+1]];
layer_weight_delta[l]=new double[layernum[l]+1][layernum[l+1]];
for(int j=0;j<layernum[l]+1;j++)
for(int i=0;i<layernum[l+1];i++)
layer_weight[l][j][i]=random.nextDouble();//随机初始化权重
}
}
}
//逐层向前计算输出
public double[] computeOut(double[] in){
for(int l=1;l<layer.length;l++){
for(int j=0;j<layer[l].length;j++){
double z=layer_weight[l-1][layer[l-1].length][j];
for(int i=0;i<layer[l-1].length;i++){
layer[l-1][i]=l==1?in[i]:layer[l-1][i];
z+=layer_weight[l-1][i][j]*layer[l-1][i];
}
layer[l][j]=1/(1+Math.exp(-z));
}
}
return layer[layer.length-1];
}
//逐层反向计算误差并修改权重
public void updateWeight(double[] tar){
int l=layer.length-1;
for(int j=0;j<layerErr[l].length;j++)
layerErr[l][j]=layer[l][j]*(1-layer[l][j])*(tar[j]-layer[l][j]);

while(l-->0){
for(int j=0;j<layerErr[l].length;j++){
double z = 0.0;
for(int i=0;i<layerErr[l+1].length;i++){
z=z+l>0?layerErr[l+1][i]*layer_weight[l][j][i]:0;
layer_weight_delta[l][j][i]= mobp*layer_weight_delta[l][j][i]+rate*layerErr[l+1][i]*layer[l][j];//隐含层动量调整
layer_weight[l][j][i]+=layer_weight_delta[l][j][i];//隐含层权重调整
if(j==layerErr[l].length-1){
layer_weight_delta[l][j+1][i]= mobp*layer_weight_delta[l][j+1][i]+rate*layerErr[l+1][i];//截距动量调整
layer_weight[l][j+1][i]+=layer_weight_delta[l][j+1][i];//截距权重调整
}
}
layerErr[l][j]=z*layer[l][j]*(1-layer[l][j]);//记录误差
}
}
}

public void train(double[] in, double[] tar){
double[] out = computeOut(in);
updateWeight(tar);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
下面是这个测试程序BpDeepTest.java的源码:

import java.util.Arrays;
public class BpDeepTest{
public static void main(String[] args){
//初始化神经网络的基本配置
//第一个参数是一个整型数组,表示神经网络的层数和每层节点数,比如{3,10,10,10,10,2}表示输入层是3个节点,输出层是2个节点,中间有4层隐含层,每层10个节点
//第二个参数是学习步长,第三个参数是动量系数
BpDeep bp = new BpDeep(new int[]{2,10,2}, 0.15, 0.8);

//设置样本数据,对应上面的4个二维坐标数据
double[][] data = new double[][]{{1,2},{2,2},{1,1},{2,1}};
//设置目标数据,对应4个坐标数据的分类
double[][] target = new double[][]{{1,0},{0,1},{0,1},{1,0}};

//迭代训练5000次
for(int n=0;n<5000;n++)
for(int i=0;i<data.length;i++)
bp.train(data[i], target[i]);

//根据训练结果来检验样本数据
for(int j=0;j<data.length;j++){
double[] result = bp.computeOut(data[j]);
System.out.println(Arrays.toString(data[j])+":"+Arrays.toString(result));
}

//根据训练结果来预测一条新数据的分类
double[] x = new double[]{3,1};
double[] result = bp.computeOut(x);
System.out.println(Arrays.toString(x)+":"+Arrays.toString(result));
}
}

‘肆’ BP神经网络数据400组少吗

少。
如果你的数据具有非常复杂的对应关系,比如现在你分类到博彩类,用神经网络理论上讲是可以预测的的,很多人发了论文,讲怎么用神经网络预测双色球什么的。实际上效果并不是非常理想。因为内在规律太复杂,有限的数据无法透彻的归纳出来到底数据怎么变化。这种情况下,纵使你又几千个数据也不行。比较保险的办法还是用逆向工程方法建立一个一个的子模型,然后整理成一个大模型再做预测。往往会比因为数据量不够引起的神经网络预测误差要小得多。

‘伍’ 神经网络,训练样本500条,为什么比训练样本6000条,训练完,500条预测比6000条样本好!

并非训练样本越多越好,因课题而异。 1、样本最关键在于正确性和准确性。你所选择的样本首先要能正确反映该系统过程的内在规律。我们从生产现场采得的样本数据中有不少可能是坏样本,这样的样本会干扰你的神经网络训练。通常我们认为坏样本只是个别现象,所以我们希望通过尽可能大的样本规模来抵抗坏样本造成的负面影响。 2、其次是样本数据分布的均衡性。你所选择的样本最好能涉及到该系统过程可能发生的各种情况,这样可以极大可能的照顾到系统在各个情况下的规律特征。通常我们对系统的内在规律不是很了解,所以我们希望通过尽可能大的样本规模来“地毯式”覆盖对象系统的方方面面。 3、再次就是样本数据的规模,也就是你要问的问题。在确保样本数据质量和分布均衡的情况下,样本数据的规模决定你神经网络训练结果的精度。样本数据量越大,精度越高。由于样本规模直接影响计算机的运算时间,所以在精度符合要求的情况下,我们不需要过多的样本数据,否则我们要等待很久的训练时间。 补充说明一下,不论是径向基(rbf)神经网络还是经典的bp神经网络,都只是具体的训练方法,对于足够多次的迭代,训练结果的准确度是趋于一致的,方法只影响计算的收敛速度(运算时间),和样本规模没有直接关系。

如何确定何时训练集的大小是“足够大”的?
神经网络的泛化能力主要取决于3个因素:
1.训练集的大小
2.网络的架构
3.问题的复杂程度
一旦网络的架构确定了以后,泛化能力取决于是否有充足的训练集。合适的训练样本数量可以使用Widrow的拇指规则来估计。 拇指规则指出,为了得到一个较好的泛化能力,我们需要满足以下条件(Widrow and Stearns,1985;Haykin,2008): N = nw / e 其中,N为训练样本数量,nw是网络中突触权重的数量,e是测试允许的网络误差。 因此,假如我们允许10%的误差,我们需要的训练样本的数量大约是网络中权重数量的10倍。

‘陆’ 用MATLAB与BP神经网络法处理15组数据,共60个数据,需要多长时间

训练时长取决于训练算法、训练目标、样本数量和网络规模。你的样本只有15组,数量较少,一般几秒钟就能训练完成。

若从速度的角度出发,人脑神经元之间传递信息的速度要远低于计算机,前者为毫秒量级,而后者的频率往往可达几百兆赫。但是,由于人脑是一个大规模并行与串行组合处理系统,因而,在许多问题上可以作出快速判断、决策和处理,其速度则远高于串行结构的普通计算机。人工神经网络的基本结构模仿人脑,具有并行处理特征,可以大大提高工作速度。

‘柒’ 阃氲繃matlab杞浠跺仛bp绁炵粡缃戠粶棰勬祴濂跺埗鍝佷环镙硷纴姹傚ぇ绁炲府蹇

涓昏佹槸镙锋湰缁勭粐锛屾妸杈揿叆鍜岃緭鍑烘牱链閮界‘瀹氥傚彲浠ョ敤鍓12涓链堢殑鏁版嵁棰勬祴涓嬩竴涓链堢殑鏁版嵁锛屽嵆绗琻涓鏁版嵁镊硁+11鍏12涓鏁版嵁浣滀负杈揿叆锛宯+12浣滀负杈揿嚭缁勭粐镙锋湰銆

浠ラ梼浠剁殑绋嫔簭浣滃弬钥冿纴灏哖銆乀鎹涓轰綘镄勬牱链鍗冲彲銆


BP锛圔ack Propagation锛夌炵粡缃戠粶鏄86骞寸敱Rumelhart鍜孧cCelland涓洪栫殑绉戝﹀跺皬缁勬彁鍑猴纴鏄涓绉嶆寜璇宸阃嗕紶鎾绠楁硶璁缁幂殑澶氩眰鍓嶉堢绣缁滐纴鏄鐩鍓嶅簲鐢ㄦ渶骞挎硾镄勭炵粡缃戠粶妯″瀷涔嬩竴銆侭P缃戠粶鑳藉︿範鍜屽瓨璐澶ч噺镄勮緭鍏-杈揿嚭妯″纺鏄犲皠鍏崇郴锛岃屾棤闇浜嫔墠鎻绀烘弿杩拌繖绉嶆椠灏勫叧绯荤殑鏁板︽柟绋嬨傚畠镄勫︿範瑙勫垯鏄浣跨敤链阃熶笅闄嶆硶锛岄氲繃鍙嶅悜浼犳挱𨱒ヤ笉鏂璋冩暣缃戠粶镄勬潈鍊煎拰阒埚硷纴浣跨绣缁灭殑璇宸骞虫柟鍜屾渶灏忋侭P绁炵粡缃戠粶妯″瀷𨰾撴墤缁撴瀯鍖呮嫭杈揿叆灞傦纸input锛夈侀殣灞(hidden layer)鍜岃緭鍑哄眰(output layer)銆

阅读全文

与训练bp神经网络需要多少组样本相关的资料

热点内容
热搜和热议给网络营销什么启发 浏览:964
小米10p网络设置 浏览:204
网络小说卖版权大概多少 浏览:980
华为手机wifi和移动网络关闭 浏览:797
电脑自动更新后没网络 浏览:380
金融办如何预防网络涉黑恶犯罪 浏览:389
网络端口设置有问题 浏览:160
笔记本电脑如何搜寻新的网络 浏览:893
信丰推广网络营销系统 浏览:161
网络的有线传输介质主要有哪些 浏览:150
手机和电脑可以不通过网络投屏嘛 浏览:808
3d网络渲染哪个好用 浏览:558
苹果11怎么查看手机网络 浏览:446
免杀网络测试软件 浏览:591
苏州网络存储服务哪里好 浏览:60
哪个光纤网络好 浏览:798
路由器网络信号有问号 浏览:527
手机已保存的网络进不去 浏览:675
电脑网络组建知识 浏览:37
计算机网络安全成因 浏览:270

友情链接