我还没有机会看一下adapt
函数,但我怀疑它正在更新而不是覆盖。要验证此语句,您可能需要选择第一个数据块的子集作为训练中的第二个块。如果它被覆盖,当您使用带有子集的训练网络来测试您的第一个数据块时,它应该很难预测那些不属于子集的数据。
我用一个非常简单的程序对其进行了测试:训练曲线y=x^2
。在第一次训练过程中,我学习了数据集[1,3,5,7,9]
:
m=6;
P=[1 3 5 7 9];
T=P.^2;
[Pn,minP,maxP,Tn,minT,maxT] = premnmx(P,T);
clear net
net.IW{1,1}=zeros(m,1);
net.LW{2,1}=zeros(1,m);
net.b{1,1}=zeros(m,1);
net.b{2,1}=zeros(1,1);
net=newff(minmax(Pn),[m,1],{'logsig','purelin'},'trainlm');
net.trainParam.show =100;
net.trainParam.lr = 0.09;
net.trainParam.epochs =1000;
net.trainParam.goal = 1e-3;
[net,tr]=train(net,Pn,Tn);
Tn_predicted= sim(net,Pn)
Tn
结果(请注意,输出使用相同的参考进行缩放。如果您正在执行标准归一化,请确保始终将第一个训练集中的平均值和标准值应用于所有其余部分):
Tn_predicted =
-1.0000 -0.8000 -0.4000 0.1995 1.0000
Tn =
-1.0000 -0.8000 -0.4000 0.2000 1.0000
现在我们正在使用训练数据实施第二个训练过程[1,9]
:
Pt=[1 9];
Tt=Pt.^2;
n=length(Pt);
Ptn = tramnmx(Pt,minP,maxP);
Ttn = tramnmx(Tt,minT,maxT);
[net,tr]=train(net,Ptn,Ttn);
Tn_predicted= sim(net,Pn)
Tn
结果:
Tn_predicted =
-1.0000 -0.8000 -0.4000 0.1995 1.0000
Tn =
-1.0000 -0.8000 -0.4000 0.2000 1.0000
请注意,数据x=[3,5,7];
仍然是精确预测的。
但是,如果我们只x=[1,9];
从一开始就训练:
clear net
net.IW{1,1}=zeros(m,1);
net.LW{2,1}=zeros(1,m);
net.b{1,1}=zeros(m,1);
net.b{2,1}=zeros(1,1);
net=newff(minmax(Ptn),[m,1],{'logsig','purelin'},'trainlm');
net.trainParam.show =100;
net.trainParam.lr = 0.09;
net.trainParam.epochs =1000;
net.trainParam.goal = 1e-3;
[net,tr]=train(net,Ptn,Ttn);
Tn_predicted= sim(net,Pn)
Tn
观察结果:
Tn_predicted =
-1.0071 -0.6413 0.5281 0.6467 0.9922
Tn =
-1.0000 -0.8000 -0.4000 0.2000 1.0000
请注意,经过训练的网络在x=[3,5,7];
上面的测试表明训练是基于之前的网络而不是重新开始。性能变差的原因是每个数据块只实现一次(随机梯度下降而不是批量梯度下降),因此总误差曲线可能尚未收敛。假设你只有两个数据块,你可能需要在训练完块 2 后重新训练块 1,然后重新训练块 2,然后块 1,依此类推,直到满足某些条件。如果你有更多的块,你可能不需要担心第二个和第一个训练效果相比。无论更新的权重是否会影响它们的性能,在线学习都会丢弃以前的数据集。