[英]How to train neural network incrementally in Matlab? and iteratively combine them
我有非常大的火車設置,所以Matlab。 我需要做大規模的培訓。
是否有可能將訓練集分成幾部分並迭代訓練網絡,並在每次迭代時更新“網”而不是覆蓋它?
下面的代碼顯示了這個想法,它不會起作用。 在每次迭代中,它根據唯一訓練的數據集更新網絡。
TF1 = 'tansig';TF2 = 'tansig'; TF3 = 'tansig';% layers of the transfer function , TF3 transfer function for the output layers
net = newff(trainSamples.P,trainSamples.T,[NodeNum1,NodeNum2,NodeOutput],{TF1 TF2 TF3},'traingdx');% Network created
net.trainfcn = 'traingdm' ; %'traingdm';
net.trainParam.epochs = 1000;
net.trainParam.min_grad = 0;
net.trainParam.max_fail = 2000; %large value for infinity
while(1) // iteratively takes 10 data point at a time.
p %=> get updated with following 10 new data points
t %=> get updated with following 10 new data points
[net,tr] = train(net, p, t,[], []);
end
我還沒有機會看看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
結果(請注意,輸出使用相同的參考進行縮放。 如果您正在進行標准規范化,請確保始終將第1次訓練集中的均值和標准值應用於所有其余值 ):
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=[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];
上表現不佳x=[3,5,7];
上述測試表明,培訓基於之前的網絡,而不是重新開始。 你性能更差的原因是你只為每個數據塊實現一次(隨機梯度下降而不是批量梯度下降),因此總誤差曲線可能還沒有收斂。 假設您只有兩個數據塊,您可能需要在完成訓練塊2之后重新訓練塊1,然后重新訓練塊2,然后重新訓練塊1,依此類推,直到滿足某些條件。 如果你有更多的塊,你可能不需要擔心第二訓練效果。 無論更新的權重是否會影響其性能,在線學習都會刪除以前的數據集。
這里是一個如何在matlab中迭代地訓練NN(迷你批處理)的例子:
只需創建一個玩具數據集
[ x,t] = building_dataset;
小批量大小和數量
M = 420
imax = 10;
讓我們檢查直接培訓與小批量培訓
net = feedforwardnet(70,'trainscg');
dnet = feedforwardnet(70,'trainscg');
這里的標准培訓:1個單一呼叫與整個數據
dnet.trainParam.epochs=100;
[ dnet tr y ] = train( dnet, x, t ,'useGPU','only','showResources','no');
一種誤差:MEA,易於測量MSE或任何其他您想要的
dperf = mean(mean(abs(t-dnet(x))))
這是迭代部分:每次調用1個紀元
net.trainParam.epochs=1;
e=1;
直到我們達到之前的方法錯誤,進行時代比較
while perf(end)>dperf
在每個時代隨機化數據非常重要!!
idx = randperm(size(x,2));
迭代地訓練所有數據塊
for i=1:imax
k = idx(1+M*(i-1) : M*i);
[ net tr ] = train( net, x( : , k ), t( : , k ) );
end
計算每個時代的表現
perf(e) = mean(mean(abs(t-net(x))))
e=e+1;
end
檢查性能,我們想要一個很好的准平滑和exp(-x)之類的曲線
plot(perf)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.